<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.multitheftauto.com/wiki/Special:NewPages?feed=atom&amp;namespace=0&amp;size-mode=max</id>
	<title>Multi Theft Auto: Wiki - New pages [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.multitheftauto.com/wiki/Special:NewPages?feed=atom&amp;namespace=0&amp;size-mode=max"/>
	<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/Special:NewPages"/>
	<updated>2026-04-15T11:14:03Z</updated>
	<subtitle>From Multi Theft Auto: Wiki</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/IsCursorOnElement</id>
		<title>IsCursorOnElement</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/IsCursorOnElement"/>
		<updated>2026-04-05T15:19:18Z</updated>

		<summary type="html">&lt;p&gt;Knower: Created page with &amp;quot;== Client-Side Function: isCursorOnElement ==  thumb '''Description:''' This function is used in GUI / DX to create interactive buttons or effects in a professional way.  It allows you to make elements like buttons, rectangles, or any selectable area responsive to the player's cursor.  You can also add many enhancements to make the appearance of the button or element look visually appealing and professional. ---  === Function === &amp;lt;syntaxhighlight la...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Client-Side Function: isCursorOnElement ==&lt;br /&gt;
&lt;br /&gt;
[[File:MTANeonX.png|thumb]]&lt;br /&gt;
'''Description:'''&lt;br /&gt;
This function is used in GUI / DX to create interactive buttons or effects in a professional way. &lt;br /&gt;
It allows you to make elements like buttons, rectangles, or any selectable area responsive to the player's cursor. &lt;br /&gt;
You can also add many enhancements to make the appearance of the button or element look visually appealing and professional.&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Function ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
function isCursorOnElement( posX, posY, width, height )&lt;br /&gt;
&lt;br /&gt;
	if isCursorShowing( ) then&lt;br /&gt;
&lt;br /&gt;
		local mouseX, mouseY = getCursorPosition( )&lt;br /&gt;
&lt;br /&gt;
		local clientW, clientH = guiGetScreenSize( )&lt;br /&gt;
&lt;br /&gt;
		local mouseX, mouseY = mouseX * clientW, mouseY * clientH&lt;br /&gt;
&lt;br /&gt;
		if ( mouseX &amp;gt; posX and mouseX &amp;lt; ( posX + width ) and mouseY &amp;gt; posY and mouseY &amp;lt; ( posY + height ) ) then&lt;br /&gt;
&lt;br /&gt;
			return true&lt;br /&gt;
&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return false&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Example Usage ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- Example: Interactive button on screen&lt;br /&gt;
&lt;br /&gt;
local SelectBut = 1 -- Stores the button selected by player&lt;br /&gt;
local x, y, w, h = 100, 100, 150, 50 -- Element position and size&lt;br /&gt;
&lt;br /&gt;
if isCursorOnElement(x, y, w, h) then&lt;br /&gt;
    -- Cursor is on the element → full alpha&lt;br /&gt;
    dxDrawImage(x, y, w, h, &amp;quot;img.png&amp;quot;, 0, 0, 0, tocolor(255, 254, 254, 255), false)&lt;br /&gt;
else&lt;br /&gt;
    if SelectBut == 1 then&lt;br /&gt;
        -- Cursor is not on the element but already selected → full alpha&lt;br /&gt;
        dxDrawImage(x, y, w, h, &amp;quot;img.png&amp;quot;, 0, 0, 0, tocolor(255, 254, 254, 255), false)&lt;br /&gt;
    else&lt;br /&gt;
        -- Cursor is not on the element and not selected → reduce alpha&lt;br /&gt;
        dxDrawImage(x, y, w, h, &amp;quot;img.png&amp;quot;, 0, 0, 0, tocolor(255, 254, 254, 50), false)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
===Explanation ===&lt;br /&gt;
* '''isCursorOnElement(posX, posY, width, height)''' Function to check cursor position relative to an element  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Notes===&lt;br /&gt;
* This function is safe for Client-Side only and will not affect other players.&lt;br /&gt;
* GUI/DX Example can be adapted for multiple buttons or GUI elements easily.&lt;/div&gt;</summary>
		<author><name>Knower</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/IsResourceRunning</id>
		<title>IsResourceRunning</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/IsResourceRunning"/>
		<updated>2026-04-02T02:03:14Z</updated>

		<summary type="html">&lt;p&gt;Flox: /* Example check isResourceRunning(resName) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
{{Shared function}}&lt;br /&gt;
&lt;br /&gt;
==Syntax== &lt;br /&gt;
*'''isResourceRunning''' You can insert this code example in your resources.&lt;br /&gt;
&lt;br /&gt;
===Required Arguments=== &lt;br /&gt;
*'''isResourceRunning:''' The value to check resources&lt;br /&gt;
&lt;br /&gt;
==Example check isResourceRunning(resName)==&lt;br /&gt;
&amp;lt;section name=&amp;quot;isResourceRunning&amp;quot; class=&amp;quot;shared&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
You can insert this code example in your resources.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function isResourceRunning(resName)&lt;br /&gt;
   local res = getResourceFromName(resName)&lt;br /&gt;
   return (res) and (getResourceState(res) == &amp;quot;running&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Example of inserting into system code:&lt;br /&gt;
--[[&lt;br /&gt;
if isResourceRunning(&amp;quot;admin&amp;quot;) then&lt;br /&gt;
   --code&lt;br /&gt;
else&lt;br /&gt;
   --alert&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
addCommandHandler('pos', function (commandName)&lt;br /&gt;
    if isResourceRunning(&amp;quot;admin&amp;quot;) then&lt;br /&gt;
       local x,y,z = getElementPosition(localPlayer)&lt;br /&gt;
       outputChatBox( x ..', '.. y ..', '.. z, 255, 255, 255 )&lt;br /&gt;
    else&lt;br /&gt;
       outputChatBox(&amp;quot;The resource is not running 'admin'.&amp;quot;, 255, 0, 0)&lt;br /&gt;
    end&lt;br /&gt;
end )&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Resource_functions}}&lt;/div&gt;</summary>
		<author><name>Flox</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/EngineRestreamModel</id>
		<title>EngineRestreamModel</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/EngineRestreamModel"/>
		<updated>2026-01-13T18:45:17Z</updated>

		<summary type="html">&lt;p&gt;LamarDev: create engineRestreamModel page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{New feature/item|3.0161|1.7.0|25613|This function re-streams a specific model in the GTA world.}}&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 engineRestreamModel ( int modelId )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns ''true'' if the re-stream was successful, ''false'' otherwise.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
This function can be used after a model (or more) is loaded with [[engineImageLinkDFF]]:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
addEventHandler (&amp;quot;onClientResourceStart&amp;quot;, resourceRoot, function ()&lt;br /&gt;
    engineRestreamModel (445)&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Engine functions}}&lt;/div&gt;</summary>
		<author><name>LamarDev</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/EngineRestream</id>
		<title>EngineRestream</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/EngineRestream"/>
		<updated>2026-01-13T18:42:23Z</updated>

		<summary type="html">&lt;p&gt;LamarDev: create engineRestream page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{New feature/item|3.0161|1.7.0|25613|This function re-streams a specific group of models in the GTA world.}}&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 engineRestream ( [ string restreamOption = &amp;quot;world&amp;quot; ] )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Optional Arguments===&lt;br /&gt;
*'''restreamOption:''' The specific group of models you want to re-stream. It can be: &amp;quot;world&amp;quot;, &amp;quot;vehicles&amp;quot;, &amp;quot;peds&amp;quot;, &amp;quot;objects&amp;quot; &lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns ''true'' if the re-stream was successful, ''false'' otherwise.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
This function can be used after a model (or more) is loaded with [[engineImageLinkDFF]]:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
addEventHandler (&amp;quot;onClientResourceStart&amp;quot;, resourceRoot, function ()&lt;br /&gt;
    engineRestream (&amp;quot;vehicles&amp;quot;)&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Engine functions}}&lt;/div&gt;</summary>
		<author><name>LamarDev</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/RU/Script_security</id>
		<title>RU/Script security</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/RU/Script_security"/>
		<updated>2026-01-08T19:13:07Z</updated>

		<summary type="html">&lt;p&gt;Flox: Created page with &amp;quot;==Внимание к клиентской памяти ==  Начнем с самых основ:  * Вы должны знать, что все, что вы храните на стороне клиента, подвержено риску, в том числе и lua-файлы. Злоумышленники могут получить доступ к любым конфиденциальным (и/или) важным данным, которые хранятся ил...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Внимание к клиентской памяти ==&lt;br /&gt;
&lt;br /&gt;
Начнем с самых основ:&lt;br /&gt;
&lt;br /&gt;
* Вы должны знать, что все, что вы храните на стороне клиента, подвержено риску, в том числе и lua-файлы. Злоумышленники могут получить доступ к любым конфиденциальным (и/или) важным данным, которые хранятся или передаются на стороне клиента (ПК игрока).&lt;br /&gt;
* Для обеспечения безопасности конфиденциальных данных (и/или) логики Lua используйте серверную часть.&lt;br /&gt;
* Обратите внимание, что скрипты, помеченные как '''shared''', также действуют как '''client code''', что означает, что к ним применимо все вышесказанное. Например, определение:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;script.lua&amp;quot; type=&amp;quot;shared&amp;quot;/&amp;gt; &amp;lt;!-- этот скрипт будет выполняться отдельно как на клиенте, так и на сервере --&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это то же самое, что делать:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;script.lua&amp;quot; type=&amp;quot;client&amp;quot;/&amp;gt; &amp;lt;!-- define it separately on client --&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;script.lua&amp;quot; type=&amp;quot;server&amp;quot;/&amp;gt; &amp;lt;!-- do the same, but on server --&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Дополнительный уровень защиты ==&lt;br /&gt;
&lt;br /&gt;
Чтобы ''немного усложнить'' задачу для тех, у кого плохие намерения по отношению к вашему серверу, вы можете использовать атрибут cache (и/или [https://luac.mtasa.com / Lua compile (также известный как Luac) с дополнительной настройкой запутывания на уровне ''3''] - [https://wiki.multitheftauto.com/wiki/Lua_compilation_API API]), доступный в [https://wiki.multitheftauto.com/wiki/Meta.xml meta.xml ], а также о настройке встроенного AC в MTA путем переключения SD (Специальные средства обнаружения), смотрите: [https://wiki.multitheftauto.com/wiki/Anti-cheat_guide Руководство по борьбе с читерством].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;shared.lua&amp;quot; type=&amp;quot;shared&amp;quot; cache=&amp;quot;false&amp;quot;/&amp;gt; &amp;lt;!-- cache=&amp;quot;false&amp;quot; означает, что этот Lua-файл не будет сохранен на ПК игрока --&amp;gt;&lt;br /&gt;
&amp;lt;script src=&amp;quot;client.lua&amp;quot; type=&amp;quot;client&amp;quot; cache=&amp;quot;false&amp;quot;/&amp;gt; &amp;lt;!-- cache=&amp;quot;false&amp;quot; означает, что этот Lua-файл не будет сохранен на ПК игрока --&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* ''Для некоторых'' ''немного сложнее'', ''но не невозможно'', получить клиентский код, но при этом он отлично справляется с тем, что удерживает ''большинство'' пользователей от проверки ваших lua-файлов - тех, кто ищет возможные логические ошибки (баги) или отсутствующие / некорректные проверки на основе безопасности.&lt;br /&gt;
* Может использоваться как для ''клиентских (client)'', так и для ''общих (shared)'' скриптов (не влияет на Lua на стороне сервера).&lt;br /&gt;
* Не удаляет файлы Lua, которые были загружены ранее.&lt;br /&gt;
&lt;br /&gt;
==Обнаружение бэкдоров и читерских программ и борьба с ними==&lt;br /&gt;
'''Для обеспечения минимального ущерба (или его отсутствия) от Lua-скриптов:'''&lt;br /&gt;
* Поддерживайте свой сервер в актуальном состоянии, вы можете [https://nightly.multitheftauto.com/ загружать последние сборки сервера с сайта MTA:SA nightly.] Информацию о конкретных сборках можно [https://buildinfo.multitheftauto.com/ найти здесь.]&lt;br /&gt;
* Поддерживайте свои ресурсы в актуальном состоянии, вы можете \ [https://github.com/multitheftauto/mtasa-resources загружать последние (по умолчанию) ресурсы из репозитория GitHub.] Они часто содержат последние исправления для системы безопасности, что может привести к тому, что ваш сервер будет защищен от атак или нет.&lt;br /&gt;
* Убедитесь в правильной настройке [https://wiki.multitheftauto.com/wiki/Access%20Control%20List ACL (Список контроля доступа)], который будет блокировать использование ресурсами определенных потенциально опасных функций.&lt;br /&gt;
* Нулевое доверие с предоставлением прав администратора для ресурсов (включая карты), поступающих из неизвестных источников.&lt;br /&gt;
* Перед запуском любого ресурса, которому вы не доверяете, проанализируйте его:&lt;br /&gt;
** [https://wiki.multitheftauto.com/wiki/Meta.xml meta.xml] на предмет возможных скрытых скриптов, скрывающихся под другими расширениями файлов.&lt;br /&gt;
** Это исходный код, на предмет вредоносной логики.&lt;br /&gt;
* Не запускайте и не продолжайте использовать скомпилированные ресурсы (скрипты), в легитимности которых вы не уверены.&lt;br /&gt;
&lt;br /&gt;
'''Чтобы обеспечить минимальный ущерб при подключении мошенника к вашему серверу:'''&lt;br /&gt;
* При создании скриптов помните, что никогда не следует доверять данным, поступающим от клиента.&lt;br /&gt;
* При проверке скриптов на предмет возможных дыр в системе безопасности. Обратите внимание на любые данные, поступающие от клиента, которым вы доверяете.&lt;br /&gt;
* Могут быть отправлены любые данные, следовательно, серверные скрипты, которые взаимодействуют с клиентом, получая данные, отправленные игроками, должны проверить их перед дальнейшим использованием в последующих частях кода. В основном, это будет сделано либо с помощью [[setElementData]], либо с помощью [[triggerServerEvent]].&lt;br /&gt;
* Вам не следует полагаться только на игрока [https://wiki.multitheftauto.com/wiki/Serial серийный номер ], когда речь заходит о выполнении важных операций (авторегистрация/действия администратора). '''Не гарантируется, что серийные номера будут уникальными или не поддающимися подделке'''. Вот почему вам следует &amp;quot;оставить это позади&amp;quot; системы учетных записей, как '''важный фактор аутентификации''' (например, '''логин и пароль''').&lt;br /&gt;
* Логика на стороне сервера '''не может быть обойдена''' или '''изменена''' (если только сервер не взломан или если в коде есть ошибка, но это совсем другой сценарий) - &amp;quot;используйте это в своих интересах&amp;quot;. В большинстве случаев вы сможете выполнить проверку безопасности без участия клиента.&lt;br /&gt;
* Используя концепцию &amp;quot;&amp;quot;'“, все параметры, включая источник, могут быть подделаны, и им не следует доверять. Глобальной переменной client можно доверять.”&amp;quot;&amp;quot;&amp;quot; - дает вам надежную гарантию того, что игрок, на которого вы ссылаетесь (через &amp;quot;&amp;quot;client&amp;quot;&amp;quot;) &amp;quot;&amp;quot;на самом деле&amp;quot;&amp;quot;тот, кто действительно вызвал событие&amp;quot;&amp;quot;. Такой подход защитит вас от ситуаций, когда мошенник может вызывать и обрабатывать, например, события администратора (например, кикнуть/забанить игрока), передавая фактический администратор (&amp;quot;'2-й&amp;quot;' аргумент в &amp;quot;'[[triggerServerEvent]]&amp;quot;'), или запускать события для других целей. игроки (как будто это они их вызвали, но на самом деле это было принудительно сделано читером) - как следствие использования неправильной переменной. Чтобы убедиться, что вы полностью поняли это, взгляните на примеры ниже:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
--[[&lt;br /&gt;
   НИКОГДА НЕ ДЕЛАЙТЕ ЭТОГО - ЭТО СОВЕРШЕННО НЕПРАВИЛЬНО И НЕБЕЗОПАСНО&lt;br /&gt;
   ПРОБЛЕМА: ИСПОЛЬЗУЯ &amp;quot;source&amp;quot; В hasObjectPermissionTo, ВЫ ОСТАВЛЯЕТЕ ДВЕРЬ ОТКРЫТОЙ ДЛЯ МОШЕННИКОВ&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
function onServerWrongAdminEvent(playerToBan)&lt;br /&gt;
	if (not client) then -- &amp;quot;client&amp;quot; указывает на игрока, который инициировал событие, и должен использоваться в качестве меры безопасности (чтобы предотвратить подделку игрока).&lt;br /&gt;
		return false -- если эта переменная в данный момент не существует (по неизвестной причине, или это сервер инициировал это событие), остановите выполнение кода&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local defaultPermission = false -- не разрешайте действие по умолчанию, смотрите (defaultPermission): https://wiki.multitheftauto.com/wiki/HasObjectPermissionTo&lt;br /&gt;
	local canAdminBanPlayer = hasObjectPermissionTo(source, &amp;quot;function.banPlayer&amp;quot;, defaultPermission) -- уязвимость кроется именно здесь...&lt;br /&gt;
&lt;br /&gt;
	if (not canAdminBanPlayer) then -- если у игрока нет прав доступа&lt;br /&gt;
		return false -- не делайте этого&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local validElement = isElement(playerToBan) -- проверяет, является ли аргумент, переданный от клиента, элементом&lt;br /&gt;
&lt;br /&gt;
	if (not validElement) then -- it is not&lt;br /&gt;
		return false -- остановить обработку кода&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local elementType = getElementType(playerToBan) -- это элемент, поэтому укажите его тип&lt;br /&gt;
	local playerType = (elementType == &amp;quot;player&amp;quot;) -- убедитесь, что это игрок&lt;br /&gt;
&lt;br /&gt;
	if (not playerType) then -- it's not a player&lt;br /&gt;
		return false - остановись здесь&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- banPlayer(...) -- do what needs to be done&lt;br /&gt;
end&lt;br /&gt;
addEvent(&amp;quot;onServerWrongAdminEvent&amp;quot;, true)&lt;br /&gt;
addEventHandler(&amp;quot;onServerWrongAdminEvent&amp;quot;, root, onServerWrongAdminEvent)&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
   onServerCorrectAdminEvent ПОЛНОСТЬЮ ЗАЩИЩЕН, КАК И ДОЛЖНО БЫТЬ&lt;br /&gt;
   ЗДЕСЬ НЕТ ПРОБЛЕМ: МЫ ИСПОЛЬЗОВАЛИ &amp;quot;клиент&amp;quot; В hasObjectPermissionTo, ЧТО ПОЗВОЛЯЕТ ЗАЩИТИТЬ ЕГО ОТ ПОДДЕЛКИ ИГРОКОМ, ВЫЗВАВШИМ СОБЫТИЕ&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
function onServerCorrectAdminEvent(playerToBan)&lt;br /&gt;
	if (not client) then -- 'client' points to the player who triggered the event, and should be used as security measure (in order to prevent player faking)&lt;br /&gt;
		return false -- if this variable doesn't exists at the moment (for unknown reason, or it was the server who triggered this event), stop code execution&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local defaultPermission = false -- do not allow action by default, see (defaultPermission): https://wiki.multitheftauto.com/wiki/HasObjectPermissionTo&lt;br /&gt;
	local canAdminBanPlayer = hasObjectPermissionTo(client, &amp;quot;function.banPlayer&amp;quot;, defaultPermission) -- is player allowed to do that?&lt;br /&gt;
&lt;br /&gt;
	if (not canAdminBanPlayer) then -- if player doesn't have permissions&lt;br /&gt;
		return false -- don't do it&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local validElement = isElement(playerToBan) -- check whether argument passed from client is an element&lt;br /&gt;
&lt;br /&gt;
	if (not validElement) then -- it is not&lt;br /&gt;
		return false -- stop code processing&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local elementType = getElementType(playerToBan) -- it's an element, so get it's type&lt;br /&gt;
	local playerType = (elementType == &amp;quot;player&amp;quot;) -- make sure that it's a player&lt;br /&gt;
&lt;br /&gt;
	if (not playerType) then -- it's not a player&lt;br /&gt;
		return false -- stop here&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- banPlayer(...) -- do what needs to be done&lt;br /&gt;
end&lt;br /&gt;
addEvent(&amp;quot;onServerCorrectAdminEvent&amp;quot;, true)&lt;br /&gt;
addEventHandler(&amp;quot;onServerCorrectAdminEvent&amp;quot;, root, onServerCorrectAdminEvent)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Защита данных setElementData==&lt;br /&gt;
&lt;br /&gt;
* Вам следует воздержаться от использования [[element data]] везде, его следует использовать только тогда, когда это действительно необходимо. Рекомендуется заменить его на [[triggerClientEvent]].&lt;br /&gt;
* Если вы все еще настаиваете на его использовании, рекомендуется установить для '''4-го''' аргумента в [[setElementData]] значение '''false''' (отключив синхронизацию для этих определенных данных) и использовать режим подписчика - [[addElementDataSubscriber]], как по соображениям безопасности, так и по соображениям производительности, описанным в [https://wiki.multitheftauto.com/wiki/Script_security#Securing_triggerServerEvent разделе &amp;quot;события&amp;quot;.]&lt;br /&gt;
{{Важное примечание|Отключение синхронизации, однако, не обеспечивает полной защиты ключа данных. По умолчанию он по-прежнему уязвим, но в этом случае вы не оставляете его на виду. Использование [[getAllElementData]] или копание в оперативной памяти не выявит его, поскольку оно не будет синхронизировано с клиентом в первую очередь. Следовательно, его также необходимо добавить в античит.}}&lt;br /&gt;
* Все параметры, включая '''source''', могут быть подделаны, и им не следует доверять.&lt;br /&gt;
* Глобальной переменной '''client''' можно доверять.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;section name=&amp;quot;Server&amp;quot; class=&amp;quot;server&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
Пример защиты данных базового элемента от обмана.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local function reportAndRevertDataChange(clientElement, sourceElement, dataKey, oldValue, newValue) -- вспомогательная функция для логирования и отката изменений&lt;br /&gt;
	local logClient = inspect(clientElement) -- подробный вид игрока, который инициировал синхронизацию данных элемента&lt;br /&gt;
	local logSerial = getPlayerSerial(clientElement) or &amp;quot;N/A&amp;quot; -- серийник клиента, или &amp;quot;N/A&amp;quot;, если по какой-то причине это невозможно&lt;br /&gt;
	local logSource = tostring(sourceElement) -- элемент, который получил данные&lt;br /&gt;
	local logOldValue = tostring(oldValue) -- старое значение&lt;br /&gt;
	local logNewValue = tostring(newValue) -- новое значение&lt;br /&gt;
	local logText = -- заполняем наш отчет данными&lt;br /&gt;
		&amp;quot;=======================================\n&amp;quot;..&lt;br /&gt;
		&amp;quot;Detected element data abnormality:\n&amp;quot;..&lt;br /&gt;
		&amp;quot;Client: &amp;quot;..logClient..&amp;quot;\n&amp;quot;..&lt;br /&gt;
		&amp;quot;Client serial: &amp;quot;..logSerial..&amp;quot;\n&amp;quot;..&lt;br /&gt;
		&amp;quot;Source: &amp;quot;..logSource..&amp;quot;\n&amp;quot;..&lt;br /&gt;
		&amp;quot;Data key: &amp;quot;..dataKey..&amp;quot;\n&amp;quot;..&lt;br /&gt;
		&amp;quot;Old data value: &amp;quot;..logOldValue..&amp;quot;\n&amp;quot;..&lt;br /&gt;
		&amp;quot;New data value: &amp;quot;..logNewValue..&amp;quot;\n&amp;quot;..&lt;br /&gt;
		&amp;quot;=======================================&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	local logVisibleTo = root -- указываем, кто увидит этот лог в консоли, в данном случае каждый игрок, подключенный к серверу&lt;br /&gt;
	local hadData = (oldValue ~= nil) -- проверяем, был ли у элемента такой данные раньше&lt;br /&gt;
&lt;br /&gt;
	if (hadData) then -- если у элемента ранее были такие данные&lt;br /&gt;
		setElementData(sourceElement, dataKey, oldValue, true) -- откатываем изменения, это вызовет событие onElementDataChange, но не пройдет (остановится) на первом условии - потому что сервер (не клиент) принудительно изменил данные&lt;br /&gt;
	else&lt;br /&gt;
		removeElementData(sourceElement, dataKey) -- полностью удаляем его&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	outputConsole(logText, logVisibleTo) -- выводим это в консоль&lt;br /&gt;
&lt;br /&gt;
	return true -- все успешно&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function onElementDataChangeBasicAC(dataKey, oldValue, newValue) -- сердце нашего античита, которое выполняет все магические меры безопасности&lt;br /&gt;
	if (not client) then -- проверяем, идут ли данные от клиента&lt;br /&gt;
		return false -- если нет, не идем дальше&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local checkSpecialThing = (dataKey == &amp;quot;special_thing&amp;quot;) -- сравниваем, совпадает ли dataKey с &amp;quot;special_thing&amp;quot;&lt;br /&gt;
	local checkFlagWaving = (dataKey == &amp;quot;flag_waving&amp;quot;) -- сравниваем, совпадает ли dataKey с &amp;quot;flag_waving&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	if (checkSpecialThing) then -- если совпадает, проводим проверки безопасности&lt;br /&gt;
		local invalidElement = (client ~= source) -- проверяем, отличается ли исходный элемент от игрока, изменившего данные&lt;br /&gt;
&lt;br /&gt;
		if (invalidElement) then -- если так и есть&lt;br /&gt;
			reportAndRevertDataChange(client, source, dataKey, oldValue, newValue) -- откатываем изменение данных, потому что &amp;quot;special_thing&amp;quot; может быть установлен только для самого игрока&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if (checkFlagWaving) then -- если совпадает, проводим проверки безопасности&lt;br /&gt;
		local playerVehicle = getPedOccupiedVehicle(client) -- получаем текущий транспорт игрока&lt;br /&gt;
		local invalidVehicle = (playerVehicle ~= source) -- проверяем, отличается ли исходный элемент от транспорта игрока&lt;br /&gt;
&lt;br /&gt;
		if (invalidVehicle) then -- если так и есть&lt;br /&gt;
			reportAndRevertDataChange(client, source, dataKey, oldValue, newValue) -- откатываем изменение данных, потому что &amp;quot;flag_waving&amp;quot; может быть установлен только для собственного транспорта игрока&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
addEventHandler(&amp;quot;onElementDataChange&amp;quot;, root, onElementDataChangeBasicAC)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;section name=&amp;quot;Server&amp;quot; class=&amp;quot;server&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
Пример расширенной защиты данных element от обмана.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
--[[&lt;br /&gt;
	Для максимальной безопасности установите punishPlayerOnDetect, punishmentBan, allowOnlyProtectedKeys в true (как настроено по умолчанию)&lt;br /&gt;
	Если включен allowOnlyProtectedKeys, не забудьте добавить каждый ключ элемент данных на стороне клиента в таблицу protectedKeys - иначе возникнут ложные срабатывания&lt;br /&gt;
&lt;br /&gt;
	Структура таблицы античита (handleDataChange) и её параметры:&lt;br /&gt;
&lt;br /&gt;
	[&amp;quot;keyName&amp;quot;] = { -- имя ключа, который будет защищен&lt;br /&gt;
		onlyForPlayerHimself = true, -- включение этого (true) гарантирует, что этот ключ данных элемента может быть установлен только игроком, который его синхронизировал (игнорирует onlyForOwnPlayerVeh и allowForElements), используйте false/nil для отключения&lt;br /&gt;
		onlyForOwnPlayerVeh = false, -- включение этого (true) гарантирует, что этот ключ данных элемента может быть установлен только на текущем транспорте игрока, который его синхронизировал (игнорирует allowForElements), используйте false/nil для отключения&lt;br /&gt;
		allowForElements = { -- ограничить этот ключ для определенных типов элементов, установите false/nil или оставьте пустым, чтобы не проверять это (полный список типов элементов: https://wiki.multitheftauto.com/wiki/GetElementsByType)&lt;br /&gt;
			[&amp;quot;player&amp;quot;] = true,&lt;br /&gt;
			[&amp;quot;ped&amp;quot;] = true,&lt;br /&gt;
			[&amp;quot;vehicle&amp;quot;] = true,&lt;br /&gt;
			[&amp;quot;object&amp;quot;] = true,&lt;br /&gt;
		},&lt;br /&gt;
		allowedDataTypes = { -- ограничить этот ключ для определенных типов значений, установите false/nil или оставьте пустым, чтобы не проверять это&lt;br /&gt;
			[&amp;quot;string&amp;quot;] = true,&lt;br /&gt;
			[&amp;quot;number&amp;quot;] = true,&lt;br /&gt;
			[&amp;quot;table&amp;quot;] = true,&lt;br /&gt;
			[&amp;quot;boolean&amp;quot;] = true,&lt;br /&gt;
			[&amp;quot;nil&amp;quot;] = true,&lt;br /&gt;
		},&lt;br /&gt;
		allowedStringLength = {1, 32}, -- если значение является строкой, то её длина должна быть в пределах (мин-макс), установите false/nil, чтобы не проверять длину строки - учтите, что allowedDataTypes должен содержать [&amp;quot;string&amp;quot;] = true&lt;br /&gt;
		allowedTableLength = {1, 64}, -- если значение является таблицей, то её длина должна быть в пределах (мин-макс), установите false/nil, чтобы не проверять длину таблицы - учтите, что allowedDataTypes должен содержать [&amp;quot;table&amp;quot;] = true&lt;br /&gt;
		allowedNumberRange = {1, 128}, -- если значение является числом, то оно должно быть в пределах (мин-макс), установите false/nil, чтобы не проверять диапазон чисел - учтите, что allowedDataTypes должен содержать [&amp;quot;number&amp;quot;] = true&lt;br /&gt;
	}&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local punishPlayerOnDetect = true -- должен ли игрок быть наказан при обнаружении (убедитесь, что ресурс, запускающий этот код, имеет права администратора)&lt;br /&gt;
local punishmentBan = true -- актуально только если punishPlayerOnDetect установлен в true; используйте true для бана или false для кика&lt;br /&gt;
local punishmentReason = &amp;quot;Altering element data&amp;quot; -- актуально только если punishPlayerOnDetect установлен в true; причина, которая будет показана наказанному игроку&lt;br /&gt;
local punishedBy = &amp;quot;Console&amp;quot; -- актуально только если punishPlayerOnDetect установлен в true; кто ответственен за наказание, также показывается наказанному игроку&lt;br /&gt;
local banByIP = false -- актуально только если punishPlayerOnDetect и punishmentBan установлены в true; бан по IP в настоящее время не рекомендуется (...)&lt;br /&gt;
local banByUsername = false -- имя пользователя сообщества - устаревшая вещь, поэтому установлено в false и должно оставаться таким&lt;br /&gt;
local banBySerial = true -- актуально только если punishPlayerOnDetect и punishmentBan установлены в true; (...) если есть серийный номер игрока, который можно использовать вместо этого&lt;br /&gt;
local banTime = 0 -- актуально только если punishPlayerOnDetect и punishmentBan установлены в true; время в секундах, 0 навсегда&lt;br /&gt;
local allowOnlyProtectedKeys = true -- запрещать (удалять с помощью removeElementData) любые данные элементов, кроме тех, что указаны в таблице protectedKeys; на случай, если кто-то захочет завалить сервер мусорными ключами, которые будут храниться в памяти до перезапуска сервера или ручного удаления - setElementData(source, key, nil) не удалит их; необходимо использовать removeElementData&lt;br /&gt;
local debugLevel = 4 -- этот уровень отладки позволяет скрыть префикс INFO: и использовать пользовательские цвета&lt;br /&gt;
local debugR = 255 -- сообщение отладки - красный цвет&lt;br /&gt;
local debugG = 127 -- сообщение отладки - зеленый цвет&lt;br /&gt;
local debugB = 0 -- сообщение отладки - синий цвет&lt;br /&gt;
local protectedKeys = {&lt;br /&gt;
	[&amp;quot;vehicleNumber&amp;quot;] = { -- мы хотим, чтобы vehicleNumber устанавливался только на транспорте, с четкими числами в диапазоне 1-100&lt;br /&gt;
		allowForElements = {&lt;br /&gt;
			[&amp;quot;vehicle&amp;quot;] = true,&lt;br /&gt;
		},&lt;br /&gt;
		allowedDataTypes = {&lt;br /&gt;
			[&amp;quot;number&amp;quot;] = true,&lt;br /&gt;
		},&lt;br /&gt;
		allowedNumberRange = {1, 100},&lt;br /&gt;
	},&lt;br /&gt;
	[&amp;quot;personalVehData&amp;quot;] = { -- мы хотим иметь возможность устанавливать personalVehData только на текущем транспорте, также это должна быть строка длиной от 1 до 24&lt;br /&gt;
		onlyForOwnPlayerVeh = true,&lt;br /&gt;
		allowedDataTypes = {&lt;br /&gt;
			[&amp;quot;string&amp;quot;] = true,&lt;br /&gt;
		},&lt;br /&gt;
		allowedStringLength = {1, 24},&lt;br /&gt;
	},&lt;br /&gt;
	-- выполнять проверки безопасности для ключей, хранящихся в этой таблице, удобным способом&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function reportAndRevertDataChange(clientElement, sourceElement, dataKey, oldValue, newValue, failReason, forceRemove) -- вспомогательная функция для логирования и отката изменений&lt;br /&gt;
	local logClient = inspect(clientElement) -- подробный вид игрока, который инициировал синхронизацию данных элемента&lt;br /&gt;
	local logSerial = getPlayerSerial(clientElement) or &amp;quot;N/A&amp;quot; -- серийник клиента, или &amp;quot;N/A&amp;quot;, если по какой-то причине это невозможно&lt;br /&gt;
	local logSource = inspect(sourceElement) -- подробный вид элемента, который получил данные&lt;br /&gt;
	local logOldValue = inspect(oldValue) -- подробный вид старого значения&lt;br /&gt;
	local logNewValue = inspect(newValue) -- подробный вид нового значения&lt;br /&gt;
	local logText = -- заполняем наш отчет данными&lt;br /&gt;
		&amp;quot;*\n&amp;quot;..&lt;br /&gt;
		&amp;quot;Detected element data abnormality:\n&amp;quot;..&lt;br /&gt;
		&amp;quot;Client: &amp;quot;..logClient..&amp;quot;\n&amp;quot;..&lt;br /&gt;
		&amp;quot;Client serial: &amp;quot;..logSerial..&amp;quot;\n&amp;quot;..&lt;br /&gt;
		&amp;quot;Source: &amp;quot;..logSource..&amp;quot;\n&amp;quot;..&lt;br /&gt;
		&amp;quot;Data key: &amp;quot;..dataKey..&amp;quot;\n&amp;quot;..&lt;br /&gt;
		&amp;quot;Old data value: &amp;quot;..logOldValue..&amp;quot;\n&amp;quot;..&lt;br /&gt;
		&amp;quot;New data value: &amp;quot;..logNewValue..&amp;quot;\n&amp;quot;..&lt;br /&gt;
		&amp;quot;Fail reason: &amp;quot;..failReason..&amp;quot;\n&amp;quot;..&lt;br /&gt;
		&amp;quot;*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	outputDebugString(logText, debugLevel, debugR, debugG, debugB) -- выводим это в отладку&lt;br /&gt;
&lt;br /&gt;
	if (forceRemove) then -- мы вообще не хотим, чтобы этот ключ данных элемента существовал&lt;br /&gt;
		removeElementData(sourceElement, dataKey) -- удаляем его&lt;br /&gt;
&lt;br /&gt;
		return true -- возвращаем успех и останавливаемся здесь, дальнейшие проверки не нужны&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	setElementData(sourceElement, dataKey, oldValue, true) -- откатываем изменения, это вызовет событие onElementDataChange, но не пройдет (остановится) на первом условии - потому что сервер (не клиент) принудительно изменил данные&lt;br /&gt;
&lt;br /&gt;
	return true -- возвращаем успех&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function handleDataChange(clientElement, sourceElement, dataKey, oldValue, newValue) -- сердце нашего античита, которое выполняет все магические меры безопасности, возвращает true, если не было изменений от клиента (на основе данных из protectedKeys), иначе false&lt;br /&gt;
	local protectedKey = protectedKeys[dataKey] -- проверяем, хранится ли измененный ключ в таблице protectedKeys&lt;br /&gt;
&lt;br /&gt;
	if (not protectedKey) then -- если его нет&lt;br /&gt;
&lt;br /&gt;
		if (allowOnlyProtectedKeys) then -- если мы не хотим мусорные ключи&lt;br /&gt;
			local failReason = &amp;quot;Key isn't present in protectedKeys&amp;quot; -- причина, показанная в отчете&lt;br /&gt;
			local forceRemove = true -- должен ли ключ быть полностью удален&lt;br /&gt;
&lt;br /&gt;
			reportAndRevertDataChange(clientElement, sourceElement, dataKey, oldValue, newValue, failReason, forceRemove) -- сообщить о происшествии и обработать (или нет) этого игрока&lt;br /&gt;
&lt;br /&gt;
			return false -- вернуть неудачу&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		return true -- этот ключ не защищен, пропускаем его&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local onlyForPlayerHimself = protectedKey.onlyForPlayerHimself -- если у ключа есть блокировка &amp;quot;только для себя&amp;quot;&lt;br /&gt;
	local onlyForOwnPlayerVeh = protectedKey.onlyForOwnPlayerVeh -- если у ключа есть блокировка &amp;quot;свой транспорт&amp;quot;&lt;br /&gt;
	local allowForElements = protectedKey.allowForElements -- если у ключа есть проверка типа элемента&lt;br /&gt;
	local allowedDataTypes = protectedKey.allowedDataTypes -- если у ключа есть проверка разрешенного типа данных&lt;br /&gt;
&lt;br /&gt;
	if (onlyForPlayerHimself) then -- если блокировка &amp;quot;только для себя&amp;quot; активна&lt;br /&gt;
		local matchingElement = (clientElement == sourceElement) -- проверяем, равен ли игрок, установивший данные, элементу, который получил данные&lt;br /&gt;
&lt;br /&gt;
		if (not matchingElement) then -- если не совпадает&lt;br /&gt;
			local failReason = &amp;quot;Can only set on player himself&amp;quot; -- причина, показанная в отчете&lt;br /&gt;
			local forceRemove = false -- должен ли ключ быть полностью удален&lt;br /&gt;
&lt;br /&gt;
			reportAndRevertDataChange(clientElement, sourceElement, dataKey, oldValue, newValue, failReason, forceRemove) -- сообщить о происшествии и обработать (или нет) этого игрока&lt;br /&gt;
&lt;br /&gt;
			return false -- вернуть неудачу&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if (onlyForOwnPlayerVeh) then -- если блокировка &amp;quot;свой транспорт&amp;quot; активна&lt;br /&gt;
		local playerVehicle = getPedOccupiedVehicle(clientElement) -- получить текущий транспорт игрока, который установил данные&lt;br /&gt;
		local matchingVehicle = (playerVehicle == sourceElement) -- проверяем, совпадает ли он с тем, который получил данные&lt;br /&gt;
&lt;br /&gt;
		if (not matchingVehicle) then -- если не совпадает&lt;br /&gt;
			local failReason = &amp;quot;Can only set on player's own vehicle&amp;quot; -- причина, показанная в отчете&lt;br /&gt;
			local forceRemove = false -- должен ли ключ быть полностью удален&lt;br /&gt;
&lt;br /&gt;
			reportAndRevertDataChange(clientElement, sourceElement, dataKey, oldValue, newValue, failReason, forceRemove) -- сообщить о происшествии и обработать (или нет) этого игрока&lt;br /&gt;
&lt;br /&gt;
			return false -- вернуть неудачу&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if (allowForElements) then -- проверяем, является ли оно одним из них&lt;br /&gt;
		local elementType = getElementType(sourceElement) -- получить тип элемента, данные которого изменились&lt;br /&gt;
		local matchingElementType = allowForElements[elementType] -- проверяем, разрешено ли это&lt;br /&gt;
&lt;br /&gt;
		if (not matchingElementType) then -- это не совпадает&lt;br /&gt;
			local failReason = &amp;quot;Invalid element type&amp;quot; -- причина, показанная в отчете&lt;br /&gt;
			local forceRemove = false -- должен ли ключ быть полностью удален&lt;br /&gt;
&lt;br /&gt;
			reportAndRevertDataChange(clientElement, sourceElement, dataKey, oldValue, newValue, failReason, forceRemove) -- сообщить о происшествии и обработать (или нет) этого игрока&lt;br /&gt;
&lt;br /&gt;
			return false -- вернуть неудачу&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if (allowedDataTypes) then -- если есть разрешенные типы данных&lt;br /&gt;
		local valueType = type(newValue) -- получить тип данных значения&lt;br /&gt;
		local matchingType = allowedDataTypes[valueType] -- проверяем, является ли оно одним из разрешенных&lt;br /&gt;
&lt;br /&gt;
		if (not matchingType) then -- если нет, тогда&lt;br /&gt;
			local failReason = &amp;quot;Invalid data type&amp;quot; -- причина, показанная в отчете&lt;br /&gt;
			local forceRemove = false -- должен ли ключ быть полностью удален&lt;br /&gt;
&lt;br /&gt;
			reportAndRevertDataChange(clientElement, sourceElement, dataKey, oldValue, newValue, failReason, forceRemove) -- сообщить о происшествии и обработать (или нет) этого игрока&lt;br /&gt;
&lt;br /&gt;
			return false -- вернуть неудачу&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local allowedStringLength = protectedKey.allowedStringLength -- если у ключа есть указанная проверка длины строки&lt;br /&gt;
		local dataString = (valueType == &amp;quot;string&amp;quot;) -- убеждаемся, что это строка&lt;br /&gt;
&lt;br /&gt;
		if (allowedStringLength and dataString) then -- если мы должны проверить длину строки&lt;br /&gt;
			local minLength = allowedStringLength[1] -- получить минимальную длину&lt;br /&gt;
			local maxLength = allowedStringLength[2] -- получить максимальную длину&lt;br /&gt;
			local stringLength = utf8.len(newValue) -- получить длину строки данных&lt;br /&gt;
			local matchingLength = (stringLength &amp;gt;= minLength) and (stringLength &amp;lt;= maxLength) -- сравниваем, подходит ли значение в промежуток&lt;br /&gt;
&lt;br /&gt;
			if (not matchingLength) then -- если не подходит&lt;br /&gt;
				local failReason = &amp;quot;Invalid string length (must be between &amp;quot;..minLength..&amp;quot;-&amp;quot;..maxLength..&amp;quot;)&amp;quot; -- причина, показанная в отчете&lt;br /&gt;
				local forceRemove = false -- должен ли ключ быть полностью удален&lt;br /&gt;
&lt;br /&gt;
				reportAndRevertDataChange(clientElement, sourceElement, dataKey, oldValue, newValue, failReason, forceRemove) -- сообщить о происшествии и обработать (или нет) этого игрока&lt;br /&gt;
&lt;br /&gt;
				return false -- вернуть неудачу&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local allowedTableLength = protectedKey.allowedTableLength -- если у ключа есть проверка длины таблицы&lt;br /&gt;
		local dataTable = (valueType == &amp;quot;table&amp;quot;) -- убеждаемся, что это таблица&lt;br /&gt;
&lt;br /&gt;
		if (allowedTableLength and dataTable) then -- если мы должны проверить длину таблицы&lt;br /&gt;
			local minLength = allowedTableLength[1] -- получить минимальную длину&lt;br /&gt;
			local maxLength = allowedTableLength[2] -- получить максимальную длину&lt;br /&gt;
			local minLengthAchieved = false -- переменная, которая проверяет 'была ли достигнута минимальная длина'&lt;br /&gt;
			local maxLengthExceeded = false -- переменная, которая проверяет 'превысила ли длина разрешенный максимум'&lt;br /&gt;
			local tableLength = 0 -- сохранить начальную длину таблицы&lt;br /&gt;
&lt;br /&gt;
			for _, _ in pairs(newValue) do -- проходим по всей таблице&lt;br /&gt;
				tableLength = (tableLength + 1) -- добавляем + 1 для каждой записи таблицы&lt;br /&gt;
				minLengthAchieved = (tableLength &amp;gt;= minLength) -- больше ли длина или по крайней мере такой минимум, который мы требуем&lt;br /&gt;
				maxLengthExceeded = (tableLength &amp;gt; maxLength) -- превысила ли таблица максимальную длину?&lt;br /&gt;
&lt;br /&gt;
				if (maxLengthExceeded) then -- она больше, чем должна быть&lt;br /&gt;
					break -- прерываем цикл (из-за того, что условие выше выполнено, нет смысла считать дальше и тратить процессор на таблицу, которая потенциально может иметь огромное количество записей)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			local matchingLength = (minLengthAchieved and not maxLengthExceeded) -- проверяем, достигнута ли минимальная длина, и убеждаемся, что она не превышает максимальную&lt;br /&gt;
&lt;br /&gt;
			if (not matchingLength) then -- эта таблица не соответствует требованиям&lt;br /&gt;
				local failReason = &amp;quot;Invalid table length (must be between &amp;quot;..minLength..&amp;quot;-&amp;quot;..maxLength..&amp;quot;)&amp;quot; -- причина, показанная в отчете&lt;br /&gt;
				local forceRemove = false -- должен ли ключ быть полностью удален&lt;br /&gt;
&lt;br /&gt;
				reportAndRevertDataChange(clientElement, sourceElement, dataKey, oldValue, newValue, failReason, forceRemove) -- сообщить о происшествии и обработать (или нет) этого игрока&lt;br /&gt;
&lt;br /&gt;
				return false -- вернуть неудачу&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local allowedNumberRange = protectedKey.allowedNumberRange -- если у ключа есть проверка разрешенного диапазона чисел&lt;br /&gt;
		local dataNumber = (valueType == &amp;quot;number&amp;quot;) -- убеждаемся, что это число&lt;br /&gt;
&lt;br /&gt;
		if (allowedNumberRange and dataNumber) then -- если мы должны проверить диапазон чисел&lt;br /&gt;
			local minRange = allowedNumberRange[1] -- получить минимальный диапазон чисел&lt;br /&gt;
			local maxRange = allowedNumberRange[2] -- получить максимальный диапазон чисел&lt;br /&gt;
			local matchingRange = (newValue &amp;gt;= minRange) and (newValue &amp;lt;= maxRange) -- сравниваем, подходит ли значение в промежуток&lt;br /&gt;
&lt;br /&gt;
			if (not matchingRange) then -- если не подходит&lt;br /&gt;
				local failReason = &amp;quot;Invalid number range (must be between &amp;quot;..minRange..&amp;quot;-&amp;quot;..maxRange..&amp;quot;)&amp;quot; -- причина, показанная в отчете&lt;br /&gt;
				local forceRemove = false -- должен ли ключ быть полностью удален&lt;br /&gt;
&lt;br /&gt;
				reportAndRevertDataChange(clientElement, sourceElement, dataKey, oldValue, newValue, failReason, forceRemove) -- сообщить о происшествии и обработать (или нет) этого игрока&lt;br /&gt;
&lt;br /&gt;
				return false -- вернуть неудачу&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return true -- проверки безопасности пройдены, с этим ключом данных всё в порядке&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function onElementDataChangeAdvancedAC(dataKey, oldValue, newValue) -- это событие использует handleDataChange, код был разделен для лучшей читаемости&lt;br /&gt;
	if (not client) then -- проверяем, идут ли данные от клиента&lt;br /&gt;
		return false -- если нет, не продолжаем&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local approvedChange = handleDataChange(client, source, dataKey, oldValue, newValue) -- запускаем наши проверки безопасности&lt;br /&gt;
&lt;br /&gt;
	if (approvedChange) then -- всё круто и хорошо&lt;br /&gt;
		return false -- нам не нужны дальнейшие действия&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if (not punishPlayerOnDetect) then -- мы не хотим наказывать игрока по какой-то причине&lt;br /&gt;
		return false -- так что останавливаемся здесь&lt;br /&gt;
	end&lt;br /&gt;
		&lt;br /&gt;
	if (punishmentBan) then -- если это бан&lt;br /&gt;
		banPlayer(client, banByIP, banByUsername, banBySerial, punishedBy, punishmentReason, banTime) -- удаляем его присутствие с сервера&lt;br /&gt;
	else -- иначе&lt;br /&gt;
		kickPlayer(client, punishedBy, punishmentReason) -- просто кикаем игрока с сервера&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
addEventHandler(&amp;quot;onElementDataChange&amp;quot;, root, onElementDataChangeAdvancedAC)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Защита triggerServerEvent==&lt;br /&gt;
* Все параметры, включая &amp;quot;source&amp;quot;, могут быть подделаны, и им не следует доверять.&lt;br /&gt;
* Глобальной переменной &amp;quot;client&amp;quot; можно доверять.&lt;br /&gt;
* &amp;quot;События&amp;quot; в стиле &amp;quot;Admin&amp;quot; должны подтверждать &amp;quot;права доступа&amp;quot; игрока (клиента) либо с помощью [https://wiki.multitheftauto.com/wiki/IsObjectInACLGroup isObjectInACLGroup], либо [https://wiki.multitheftauto.com/wiki/HasObjectPermissionTo hasObjectPermissionTo].&lt;br /&gt;
* Не используйте для своего пользовательского события то же имя, что и для событий собственного сервера MTA (которые по умолчанию не запускаются удаленно), например: &amp;quot;onPlayerLogin&amp;quot;; это откроет дверь для манипуляций мошенников.&lt;br /&gt;
* Будьте в курсе, каким игрокам отправляется событие через [[triggerClientEvent]]. Как по соображениям безопасности, так и по соображениям производительности, события, подобные admin, должны приниматься только администраторами (чтобы предотвратить доступ к конфиденциальным данным), в то же время вы не должны отправлять каждое событие всем пользователям сервера (например, событие успешного входа в систему, которое скрывает панель входа для определенного игрока). [[triggerClientEvent]] позволяет вам указать получатель события в качестве первого (необязательного) аргумента. По умолчанию используется значение [[root]], что означает, что если вы его не укажете, оно будет отправлено всем, кто подключен к серверу, даже тем, кто все еще загружает серверный кэш (что приводит к &amp;quot;событию, инициированному сервером на стороне клиента, eventName, но событие не добавлено на стороне клиента&amp;quot;). Вы можете передать либо элемент игрока, либо таблицу с получателями:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local playersToReceiveEvent = {player1, player2, player3} -- каждый PlayerX является элементом игрока&lt;br /&gt;
&lt;br /&gt;
triggerClientEvent(playersToReceiveEvent, ...) -- не забудьте заполнить последнюю часть аргументов&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----------&lt;br /&gt;
&amp;lt;section name=&amp;quot;Server&amp;quot; class=&amp;quot;server&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
Пример функции защиты от мошенничества, разработанной для событий, используемых для проверки данных как для обычных, так и для административных событий, которые вызываются со стороны клиента.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
--[[&lt;br /&gt;
	Для максимальной безопасности установите punishPlayerOnDetect, punishmentBan в true (как настроено по умолчанию)&lt;br /&gt;
&lt;br /&gt;
	Структура таблицы античита (processServerEventData) и её параметры:&lt;br /&gt;
&lt;br /&gt;
	checkACLGroup = { -- проверить, принадлежит ли игрок, вызвавший событие, хотя бы к одной из групп ниже, установите false/nil, чтобы не проверять это&lt;br /&gt;
		&amp;quot;Admin&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	checkPermissions = { -- проверить, есть ли у игрока, вызвавшего событие, разрешение хотя бы на одно из нижеперечисленного, установите false/nil, чтобы не проверять это&lt;br /&gt;
		&amp;quot;function.kickPlayer&amp;quot;,&lt;br /&gt;
	},&lt;br /&gt;
	checkEventData = {&lt;br /&gt;
		{&lt;br /&gt;
			debugData = &amp;quot;source&amp;quot;, -- дополнительные данные для отчета, показанные в сообщении отладки&lt;br /&gt;
			eventData = source, -- данные, которые мы хотим проверить&lt;br /&gt;
			equalTo = client, -- сравнить, совпадают ли eventData и equalTo&lt;br /&gt;
			allowedElements = { -- ограничить eventData определенными типами элементов, установите false/nil или оставьте пустым, чтобы не проверять это (полный список типов элементов: https://wiki.multitheftauto.com/wiki/GetElementsByType)&lt;br /&gt;
				[&amp;quot;player&amp;quot;] = true,&lt;br /&gt;
				[&amp;quot;ped&amp;quot;] = true,&lt;br /&gt;
				[&amp;quot;vehicle&amp;quot;] = true,&lt;br /&gt;
				[&amp;quot;object&amp;quot;] = true,&lt;br /&gt;
			},&lt;br /&gt;
			allowedDataTypes = { -- ограничить eventData определенными типами значений, установите false/nil или оставьте пустым, чтобы не проверять это&lt;br /&gt;
				[&amp;quot;string&amp;quot;] = true,&lt;br /&gt;
				[&amp;quot;number&amp;quot;] = true,&lt;br /&gt;
				[&amp;quot;table&amp;quot;] = true,&lt;br /&gt;
				[&amp;quot;boolean&amp;quot;] = true,&lt;br /&gt;
				[&amp;quot;nil&amp;quot;] = true,&lt;br /&gt;
			},&lt;br /&gt;
			allowedStringLength = {1, 32}, -- если eventData является строкой, то её длина должна быть в пределах (мин-макс), установите false/nil, чтобы не проверять длину строки - учтите, что allowedDataTypes должен содержать [&amp;quot;string&amp;quot;] = true&lt;br /&gt;
			allowedTableLength = {1, 64}, -- если eventData является таблицей, то её длина должна быть в пределах (мин-макс), установите false/nil, чтобы не проверять длину таблицы - учтите, что allowedDataTypes должен содержать [&amp;quot;table&amp;quot;] = true&lt;br /&gt;
			allowedNumberRange = {1, 128}, -- если eventData является числом, то оно должно быть в пределах (мин-макс), установите false/nil, чтобы не проверять диапазон чисел - учтите, что allowedDataTypes должен содержать [&amp;quot;number&amp;quot;] = true&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local punishPlayerOnDetect = true -- должен ли игрок быть наказан при обнаружении (убедитесь, что ресурс, запускающий этот код, имеет права администратора)&lt;br /&gt;
local punishmentBan = true -- актуально только если punishPlayerOnDetect установлен в true; используйте true для бана или false для кика&lt;br /&gt;
local punishmentReason = &amp;quot;Altering server event data&amp;quot; -- актуально только если punishPlayerOnDetect установлен в true; причина, которая будет показана наказанному игроку&lt;br /&gt;
local punishedBy = &amp;quot;Console&amp;quot; -- актуально только если punishPlayerOnDetect установлен в true; кто ответственен за наказание, также показывается наказанному игроку&lt;br /&gt;
local banByIP = false -- актуально только если punishPlayerOnDetect и punishmentBan установлены в true; бан по IP в настоящее время не рекомендуется (...)&lt;br /&gt;
local banByUsername = false -- имя пользователя сообщества - устаревшая вещь, поэтому установлено в false и должно оставаться таким&lt;br /&gt;
local banBySerial = true -- актуально только если punishPlayerOnDetect и punishmentBan установлены в true; (...) если есть серийный номер игрока, который можно использовать вместо этого&lt;br /&gt;
local banTime = 0 -- актуально только если punishPlayerOnDetect и punishmentBan установлены в true; время в секундах, 0 навсегда&lt;br /&gt;
local debugLevel = 4 -- этот уровень отладки позволяет скрыть префикс INFO: и использовать пользовательские цвета&lt;br /&gt;
local debugR = 255 -- сообщение отладки - красный цвет&lt;br /&gt;
local debugG = 127 -- сообщение отладки - зеленый цвет&lt;br /&gt;
local debugB = 0 -- сообщение отладки - синий цвет&lt;br /&gt;
&lt;br /&gt;
function processServerEventData(clientElement, sourceElement, serverEvent, securityChecks) -- сердце нашего античита, которое выполняет все магические меры безопасности, возвращает true, если не было изменений от клиента (на основе данных из securityChecks), иначе false&lt;br /&gt;
	if (not securityChecks) then -- если мы не передали никаких проверок безопасности&lt;br /&gt;
		return true -- нечего проверять, даем коду идти дальше&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if (not clientElement) then -- если переменная client недоступна по какой-то причине (хотя это не должно произойти)&lt;br /&gt;
		local failReason = &amp;quot;Client variable not present&amp;quot; -- причина, показанная в отчете&lt;br /&gt;
		local skipPunishment = true -- должен ли сервер пропустить наказание&lt;br /&gt;
&lt;br /&gt;
		reportAndHandleEventAbnormality(clientElement, sourceElement, serverEvent, failReason, skipPunishment) -- сообщить о происшествии и обработать (или нет) этого игрока&lt;br /&gt;
&lt;br /&gt;
		return false -- вернуть неудачу&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local checkACLGroup = securityChecks.checkACLGroup -- если есть какие-либо группы ACL для проверки&lt;br /&gt;
	local checkPermissions = securityChecks.checkPermissions -- если есть какие-либо разрешения для проверки&lt;br /&gt;
	local checkEventData = securityChecks.checkEventData -- если есть какие-либо проверки данных&lt;br /&gt;
&lt;br /&gt;
	if (checkACLGroup) then -- проверим группы ACL игрока&lt;br /&gt;
		local playerAccount = getPlayerAccount(clientElement) -- получить текущий аккаунт игрока&lt;br /&gt;
		local guestAccount = isGuestAccount(playerAccount) -- если аккаунт гость (это значит, что игрок не вошел в систему)&lt;br /&gt;
&lt;br /&gt;
		if (guestAccount) then -- это так&lt;br /&gt;
			local failReason = &amp;quot;Can't retrieve player login - guest account&amp;quot; -- причина, показанная в отчете&lt;br /&gt;
			local skipPunishment = true -- должен ли сервер пропустить наказание&lt;br /&gt;
&lt;br /&gt;
			reportAndHandleEventAbnormality(clientElement, sourceElement, serverEvent, failReason, skipPunishment) -- сообщить о происшествии и обработать (или нет) этого игрока&lt;br /&gt;
&lt;br /&gt;
			return false -- вернуть неудачу&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local accountName = getAccountName(playerAccount) -- получить имя текущего аккаунта игрока&lt;br /&gt;
		local aclString = &amp;quot;user.&amp;quot;..accountName -- форматируем это для дальнейшего использования в функции isObjectInACLGroup&lt;br /&gt;
&lt;br /&gt;
		for groupID = 1, #checkACLGroup do -- перебираем таблицу заданных групп&lt;br /&gt;
			local groupName = checkACLGroup[groupID] -- получить имя каждой группы&lt;br /&gt;
			local aclGroup = aclGetGroup(groupName) -- проверить, существует ли такая группа&lt;br /&gt;
&lt;br /&gt;
			if (not aclGroup) then -- не существует&lt;br /&gt;
				local failReason = &amp;quot;ACL group '&amp;quot;..groupName..&amp;quot;' is missing&amp;quot; -- причина, показанная в отчете&lt;br /&gt;
				local skipPunishment = true -- должен ли сервер пропустить наказание&lt;br /&gt;
&lt;br /&gt;
				reportAndHandleEventAbnormality(clientElement, sourceElement, serverEvent, failReason, skipPunishment) -- сообщить о происшествии и обработать (или нет) этого игрока&lt;br /&gt;
&lt;br /&gt;
				return false -- вернуть неудачу&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			local playerInACLGroup = isObjectInACLGroup(aclString, aclGroup) -- проверить, принадлежит ли игрок к группе&lt;br /&gt;
&lt;br /&gt;
			if (playerInACLGroup) then -- да, это так&lt;br /&gt;
				return true -- значит, успех&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local failReason = &amp;quot;Player doesn't belong to any given ACL group&amp;quot; -- причина, показанная в отчете&lt;br /&gt;
		local skipPunishment = true -- должен ли сервер пропустить наказание&lt;br /&gt;
&lt;br /&gt;
		reportAndHandleEventAbnormality(clientElement, sourceElement, serverEvent, failReason, skipPunishment) -- сообщить о происшествии и обработать (или нет) этого игрока&lt;br /&gt;
&lt;br /&gt;
		return false -- вернуть неудачу&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if (checkPermissions) then -- проверить, есть ли у игрока хотя бы одно желаемое разрешение&lt;br /&gt;
		local allowedByDefault = false -- есть ли у него доступ по умолчанию&lt;br /&gt;
&lt;br /&gt;
		for permissionID = 1, #checkPermissions do -- перебираем все разрешения&lt;br /&gt;
			local permissionName = checkPermissions[permissionID] -- получить имя разрешения&lt;br /&gt;
			local hasPermission = hasObjectPermissionTo(clientElement, permissionName, allowedByDefault) -- проверить, разрешено ли игроку выполнять определенное действие&lt;br /&gt;
&lt;br /&gt;
			if (hasPermission) then -- если у игрока есть доступ&lt;br /&gt;
				return true -- одно доступно (и достаточно), сервер не станет проверять остальные (так как return также прерывает цикл)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local failReason = &amp;quot;Not enough permissions&amp;quot; -- причина, показанная в отчете&lt;br /&gt;
		local skipPunishment = true -- должен ли сервер пропустить наказание&lt;br /&gt;
&lt;br /&gt;
		reportAndHandleEventAbnormality(clientElement, sourceElement, serverEvent, failReason, skipPunishment) -- сообщить о происшествии и обработать (или нет) этого игрока&lt;br /&gt;
&lt;br /&gt;
		return false -- вернуть неудачу&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if (checkEventData) then -- если есть какие-то данные для проверки&lt;br /&gt;
&lt;br /&gt;
		for dataID = 1, #checkEventData do -- перебираем каждые данные&lt;br /&gt;
			local dataToCheck = checkEventData[dataID] -- получить каждый набор данных&lt;br /&gt;
			local eventData = dataToCheck.eventData -- это то, что мы будем проверять&lt;br /&gt;
			local equalTo = dataToCheck.equalTo -- мы хотим сравнить, совпадают ли eventData и equalTo&lt;br /&gt;
			local allowedElements = dataToCheck.allowedElements -- проверить, является ли это элементом и принадлежит ли к определенным типам элементов&lt;br /&gt;
			local allowedDataTypes = dataToCheck.allowedDataTypes -- ограничиваем ли мы данные определенным типом?&lt;br /&gt;
			local debugData = dataToCheck.debugData -- дополнительные вспомогательные данные&lt;br /&gt;
			local debugText = debugData and &amp;quot; (&amp;quot;..debugData..&amp;quot;)&amp;quot; or &amp;quot;&amp;quot; -- если оно присутствует, красиво форматируем&lt;br /&gt;
&lt;br /&gt;
			if (equalTo) then -- проверка на равенство существует&lt;br /&gt;
				local matchingData = (eventData == equalTo) -- сравнить, равны ли эти два значения&lt;br /&gt;
&lt;br /&gt;
				if (not matchingData) then -- они не равны&lt;br /&gt;
					local failReason = &amp;quot;Data isn't equal @ argument &amp;quot;..dataID..debugText -- причина, показанная в отчете&lt;br /&gt;
					local skipPunishment = false -- должен ли сервер пропустить наказание&lt;br /&gt;
&lt;br /&gt;
					reportAndHandleEventAbnormality(clientElement, sourceElement, serverEvent, failReason, skipPunishment) -- сообщить о происшествии и обработать (или нет) этого игрока&lt;br /&gt;
&lt;br /&gt;
					return false -- вернуть неудачу&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			if (allowedElements) then -- мы проверяем, является ли это элементом и принадлежит ли хотя бы одному из списка&lt;br /&gt;
				local validElement = isElement(eventData) -- проверить, является ли это фактическим элементом&lt;br /&gt;
&lt;br /&gt;
				if (not validElement) then -- это не так&lt;br /&gt;
					local failReason = &amp;quot;Data isn't element @ argument &amp;quot;..dataID..debugText -- причина, показанная в отчете&lt;br /&gt;
					local skipPunishment = false -- должен ли сервер пропустить наказание&lt;br /&gt;
&lt;br /&gt;
					reportAndHandleEventAbnormality(clientElement, sourceElement, serverEvent, failReason, skipPunishment) -- сообщить о происшествии и обработать (или нет) этого игрока&lt;br /&gt;
&lt;br /&gt;
					return false -- вернуть неудачу&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				local elementType = getElementType(eventData) -- это элемент, поэтому мы хотим узнать его тип&lt;br /&gt;
				local matchingElementType = allowedElements[elementType] -- проверить, разрешено ли это&lt;br /&gt;
&lt;br /&gt;
				if (not matchingElementType) then -- не разрешено&lt;br /&gt;
					local failReason = &amp;quot;Invalid element type @ argument &amp;quot;..dataID..debugText -- причина, показанная в отчете&lt;br /&gt;
					local skipPunishment = false -- должен ли сервер пропустить наказание&lt;br /&gt;
&lt;br /&gt;
					reportAndHandleEventAbnormality(clientElement, sourceElement, serverEvent, failReason, skipPunishment) -- сообщить о происшествии и обработать (или нет) этого игрока&lt;br /&gt;
&lt;br /&gt;
					return false -- вернуть неудачу&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			if (allowedDataTypes) then -- проверим разрешенные типы данных&lt;br /&gt;
				local dataType = type(eventData) -- получить тип данных&lt;br /&gt;
				local matchingType = allowedDataTypes[dataType] -- проверить, разрешено ли это&lt;br /&gt;
&lt;br /&gt;
				if (not matchingType) then -- не разрешено&lt;br /&gt;
					local failReason = &amp;quot;Invalid data type @ argument &amp;quot;..dataID..debugText -- причина, показанная в отчете&lt;br /&gt;
					local skipPunishment = false -- должен ли сервер пропустить наказание&lt;br /&gt;
&lt;br /&gt;
					reportAndHandleEventAbnormality(clientElement, sourceElement, serverEvent, failReason, skipPunishment) -- сообщить о происшествии и обработать (или нет) этого игрока&lt;br /&gt;
&lt;br /&gt;
					return false -- вернуть неудачу&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				local allowedStringLength = dataToCheck.allowedStringLength -- если данные имеют проверку длины строки&lt;br /&gt;
				local dataString = (dataType == &amp;quot;string&amp;quot;) -- убеждаемся, что это строка&lt;br /&gt;
&lt;br /&gt;
				if (allowedStringLength and dataString) then -- если мы должны проверить длину строки&lt;br /&gt;
					local minLength = allowedStringLength[1] -- получить минимальную длину&lt;br /&gt;
					local maxLength = allowedStringLength[2] -- получить максимальную длину&lt;br /&gt;
					local stringLength = utf8.len(eventData) -- получить длину строки данных&lt;br /&gt;
					local matchingLength = (stringLength &amp;gt;= minLength) and (stringLength &amp;lt;= maxLength) -- сравниваем, подходит ли значение в промежуток&lt;br /&gt;
&lt;br /&gt;
					if (not matchingLength) then -- если не подходит&lt;br /&gt;
						local failReason = &amp;quot;Invalid string length (must be between &amp;quot;..minLength..&amp;quot;-&amp;quot;..maxLength..&amp;quot;) @ argument &amp;quot;..dataID..debugText -- причина, показанная в отчете&lt;br /&gt;
						local skipPunishment = false -- должен ли сервер пропустить наказание&lt;br /&gt;
&lt;br /&gt;
						reportAndHandleEventAbnormality(clientElement, sourceElement, serverEvent, failReason, skipPunishment) -- сообщить о происшествии и обработать (или нет) этого игрока&lt;br /&gt;
&lt;br /&gt;
						return false -- вернуть неудачу&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				local allowedTableLength = dataToCheck.allowedTableLength -- если данные имеют проверку длины таблицы&lt;br /&gt;
				local dataTable = (dataType == &amp;quot;table&amp;quot;) -- убеждаемся, что это таблица&lt;br /&gt;
&lt;br /&gt;
				if (allowedTableLength and dataTable) then -- если мы должны проверить длину таблицы&lt;br /&gt;
					local minLength = allowedTableLength[1] -- получить минимальную длину&lt;br /&gt;
					local maxLength = allowedTableLength[2] -- получить максимальную длину&lt;br /&gt;
					local minLengthAchieved = false -- переменная, которая проверяет 'была ли достигнута минимальная длина'&lt;br /&gt;
					local maxLengthExceeded = false -- переменная, которая проверяет 'превысила ли длина разрешенный максимум'&lt;br /&gt;
					local tableLength = 0 -- сохранить начальную длину таблицы&lt;br /&gt;
&lt;br /&gt;
					for _, _ in pairs(eventData) do -- проходим по всей таблице&lt;br /&gt;
						tableLength = (tableLength + 1) -- добавляем + 1 для каждой записи таблицы&lt;br /&gt;
						minLengthAchieved = (tableLength &amp;gt;= minLength) -- больше ли длина или по крайней мере такой минимум, который мы требуем&lt;br /&gt;
						maxLengthExceeded = (tableLength &amp;gt; maxLength) -- превысила ли таблица максимальную длину?&lt;br /&gt;
&lt;br /&gt;
						if (maxLengthExceeded) then -- она больше, чем должна быть&lt;br /&gt;
							break -- прерываем цикл (из-за того, что условие выше выполнено, нет смысла считать дальше и тратить процессор на таблицу, которая потенциально может иметь огромное количество записей)&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
&lt;br /&gt;
					local matchingLength = (minLengthAchieved and not maxLengthExceeded) -- проверяем, достигнута ли минимальная длина, и убеждаемся, что она не превышает максимальную&lt;br /&gt;
&lt;br /&gt;
					if (not matchingLength) then -- эта таблица не соответствует требованиям&lt;br /&gt;
						local failReason = &amp;quot;Invalid table length (must be between &amp;quot;..minLength..&amp;quot;-&amp;quot;..maxLength..&amp;quot;) @ argument &amp;quot;..dataID..debugText -- причина, показанная в отчете&lt;br /&gt;
						local skipPunishment = false -- должен ли сервер пропустить наказание&lt;br /&gt;
&lt;br /&gt;
						reportAndHandleEventAbnormality(clientElement, sourceElement, serverEvent, failReason, skipPunishment) -- сообщить о происшествии и обработать (или нет) этого игрока&lt;br /&gt;
&lt;br /&gt;
						return false -- вернуть неудачу&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				local allowedNumberRange = dataToCheck.allowedNumberRange -- если данные имеют проверку диапазона чисел&lt;br /&gt;
				local dataNumber = (dataType == &amp;quot;number&amp;quot;) -- убеждаемся, что это число&lt;br /&gt;
&lt;br /&gt;
				if (allowedNumberRange and dataNumber) then -- если мы должны проверить диапазон чисел&lt;br /&gt;
					local minRange = allowedNumberRange[1] -- получить минимальный диапазон чисел&lt;br /&gt;
					local maxRange = allowedNumberRange[2] -- получить максимальный диапазон чисел&lt;br /&gt;
					local matchingRange = (eventData &amp;gt;= minRange) and (eventData &amp;lt;= maxRange) -- сравниваем, подходит ли значение в промежуток&lt;br /&gt;
&lt;br /&gt;
					if (not matchingRange) then -- если не подходит&lt;br /&gt;
						local failReason = &amp;quot;Invalid number range (must be between &amp;quot;..minRange..&amp;quot;-&amp;quot;..maxRange..&amp;quot;) @ argument &amp;quot;..dataID..debugText -- причина, показанная в отчете&lt;br /&gt;
						local skipPunishment = false -- должен ли сервер пропустить наказание&lt;br /&gt;
&lt;br /&gt;
						reportAndHandleEventAbnormality(clientElement, sourceElement, serverEvent, failReason, skipPunishment) -- сообщить о происшествии и обработать (или нет) этого игрока&lt;br /&gt;
&lt;br /&gt;
						return false -- вернуть неудачу&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return true -- проверки безопасности пройдены, с этим вызовом события всё в порядке&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function reportAndHandleEventAbnormality(clientElement, sourceElement, serverEvent, failReason, skipPunishment) -- вспомогательная функция для логирования и обработки инцидентов&lt;br /&gt;
	local logClient = inspect(clientElement) -- подробный вид игрока, вызвавшего событие&lt;br /&gt;
	local logSerial = getPlayerSerial(clientElement) or &amp;quot;N/A&amp;quot; -- серийник клиента, или &amp;quot;N/A&amp;quot;, если по какой-то причине это невозможно&lt;br /&gt;
	local logSource = inspect(sourceElement) -- подробный вид исходного элемента&lt;br /&gt;
	local logText = -- заполняем наш отчет данными&lt;br /&gt;
		&amp;quot;*\n&amp;quot;..&lt;br /&gt;
		&amp;quot;Detected event abnormality:\n&amp;quot;..&lt;br /&gt;
		&amp;quot;Client: &amp;quot;..logClient..&amp;quot;\n&amp;quot;..&lt;br /&gt;
		&amp;quot;Client serial: &amp;quot;..logSerial..&amp;quot;\n&amp;quot;..&lt;br /&gt;
		&amp;quot;Source: &amp;quot;..logSource..&amp;quot;\n&amp;quot;..&lt;br /&gt;
		&amp;quot;Event: &amp;quot;..serverEvent..&amp;quot;\n&amp;quot;..&lt;br /&gt;
		&amp;quot;Reason: &amp;quot;..failReason..&amp;quot;\n&amp;quot;..&lt;br /&gt;
		&amp;quot;*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	outputDebugString(logText, debugLevel, debugR, debugG, debugB) -- выводим это в отладку&lt;br /&gt;
&lt;br /&gt;
	if (not punishPlayerOnDetect or skipPunishment) then -- мы не хотим наказывать игрока по какой-то причине&lt;br /&gt;
		return true -- останавливаемся здесь&lt;br /&gt;
	end&lt;br /&gt;
		&lt;br /&gt;
	if (punishmentBan) then -- если это бан&lt;br /&gt;
		banPlayer(clientElement, banByIP, banByUsername, banBySerial, punishedBy, punishmentReason, banTime) -- удаляем его присутствие с сервера&lt;br /&gt;
	else -- иначе&lt;br /&gt;
		kickPlayer(clientElement, punishedBy, punishmentReason) -- просто кикаем игрока с сервера&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return true -- всё готово, сообщаем об успехе&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function onServerEvent(clientData)&lt;br /&gt;
	--[[&lt;br /&gt;
		Предположим, что это серверское событие (функция) вызывается следующим образом:&lt;br /&gt;
&lt;br /&gt;
		local dataToPass = 10&lt;br /&gt;
&lt;br /&gt;
		triggerServerEvent(&amp;quot;onServerEvent&amp;quot;, localPlayer, dataToPass)&lt;br /&gt;
	]]&lt;br /&gt;
&lt;br /&gt;
	local shouldProcessServerCode = processServerEventData(&lt;br /&gt;
		client, -- элемент клиента - ответственный за вызов события&lt;br /&gt;
		source, -- исходный элемент - переданный в triggerServerEvent (в качестве 2-го аргумента)&lt;br /&gt;
		eventName, -- имя события - в данном случае 'onServerEvent'&lt;br /&gt;
		{&lt;br /&gt;
			checkEventData = { -- мы хотим проверить всё, что приходит от клиента&lt;br /&gt;
				{&lt;br /&gt;
					eventData = source, -- первое на проверку, переменная source&lt;br /&gt;
					equalTo = client, -- мы хотим проверить, совпадает ли это с игроком, вызвавшим событие&lt;br /&gt;
					debugData = &amp;quot;source&amp;quot;, -- вспомогательные данные, которые будут показаны в отчете отладки&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					eventData = clientData, -- давайте проверим данные, которые клиент прислал нам&lt;br /&gt;
					allowedDataTypes = {&lt;br /&gt;
						[&amp;quot;number&amp;quot;] = true, -- мы хотим, чтобы это было только число&lt;br /&gt;
					},&lt;br /&gt;
					allowedNumberRange = {1, 100}, -- в диапазоне от 1 до 100&lt;br /&gt;
					debugData = &amp;quot;clientData&amp;quot;, -- если что-то пойдет не так, дадим серверу знать где (это появится в отчете отладки)&lt;br /&gt;
				},&lt;br /&gt;
			},&lt;br /&gt;
		}&lt;br /&gt;
	)&lt;br /&gt;
&lt;br /&gt;
	if (not shouldProcessServerCode) then -- что-то не так, зеленого света для выполнения кода за этим пределом нет&lt;br /&gt;
		return false -- остановить выполнение кода&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- выполняем код как обычно&lt;br /&gt;
end&lt;br /&gt;
addEvent(&amp;quot;onServerEvent&amp;quot;, true)&lt;br /&gt;
addEventHandler(&amp;quot;onServerEvent&amp;quot;, root, onServerEvent)&lt;br /&gt;
&lt;br /&gt;
function onServerAdminEvent(playerToBan)&lt;br /&gt;
	--[[&lt;br /&gt;
		Предположим, что это серверское событие администратора (функция) вызывается следующим образом:&lt;br /&gt;
&lt;br /&gt;
		local playerToBan = getPlayerFromName(&amp;quot;playerToBan&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
		triggerServerEvent(&amp;quot;onServerAdminEvent&amp;quot;, localPlayer, playerToBan)&lt;br /&gt;
	]]&lt;br /&gt;
&lt;br /&gt;
	local shouldProcessServerCode = processServerEventData(&lt;br /&gt;
		client, -- элемент клиента - ответственный за вызов события&lt;br /&gt;
		source, -- исходный элемент - переданный в triggerServerEvent (в качестве 2-го аргумента)&lt;br /&gt;
		eventName, -- имя события - в данном случае 'onServerAdminEvent'&lt;br /&gt;
		{&lt;br /&gt;
			checkACLGroup = { -- нам нужно проверить, принадлежит ли игрок, вызвавший событие, к группам ACL&lt;br /&gt;
				&amp;quot;Admin&amp;quot;, -- в данном случае группа администраторов&lt;br /&gt;
			},&lt;br /&gt;
			checkEventData = { -- мы хотим проверить всё, что приходит от клиента&lt;br /&gt;
				{&lt;br /&gt;
					eventData = source, -- первое на проверку, переменная source&lt;br /&gt;
					equalTo = client, -- мы хотим проверить, совпадает ли это с игроком, вызвавшим событие&lt;br /&gt;
					debugData = &amp;quot;source&amp;quot;, -- вспомогательные данные, которые будут показаны в отчете отладки&lt;br /&gt;
				},&lt;br /&gt;
				{&lt;br /&gt;
					eventData = playerToBan, -- давайте проверим данные, которые клиент прислал нам&lt;br /&gt;
					allowedDataTypes = {&lt;br /&gt;
						[&amp;quot;player&amp;quot;] = true, -- мы хотим, чтобы это был игрок&lt;br /&gt;
					},&lt;br /&gt;
					debugData = &amp;quot;playerToBan&amp;quot;, -- если что-то пойдет не так, дадим серверу знать где (это появится в отчете отладки)&lt;br /&gt;
				},&lt;br /&gt;
			},&lt;br /&gt;
		}&lt;br /&gt;
	)&lt;br /&gt;
&lt;br /&gt;
	if (not shouldProcessServerCode) then -- что-то не так, зеленого света для выполнения кода за этим пределом нет&lt;br /&gt;
		return false -- остановить выполнение кода&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- выполняем код как обычно&lt;br /&gt;
end&lt;br /&gt;
addEvent(&amp;quot;onServerAdminEvent&amp;quot;, true)&lt;br /&gt;
addEventHandler(&amp;quot;onServerAdminEvent&amp;quot;, root, onServerAdminEvent)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Защита событий, относящихся только к серверу ==&lt;br /&gt;
* Очень важно отключить удаленный запуск''' в [https://wiki.multitheftauto.com/wiki/AddEvent addEvent], чтобы предотвратить вызов событий, относящихся только к серверу, со стороны клиента.&lt;br /&gt;
* '''События''' в стиле '''Admin''' должны подтверждать '''права доступа''' игрока, либо с помощью [https://wiki.multitheftauto.com/wiki/IsObjectInACLGroup isObjectInACLGroup], либо [https://wiki.multitheftauto.com/wiki/HasObjectPermissionTo hasObjectPermissionTo].&lt;br /&gt;
&lt;br /&gt;
----------&lt;br /&gt;
&amp;lt;section name=&amp;quot;Server&amp;quot; class=&amp;quot;server&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
В этом примере показано, как вы должны создавать события только на стороне сервера.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function onServerSideOnlyEvent()&lt;br /&gt;
	-- делаем какие-то вещи на стороне сервера&lt;br /&gt;
end&lt;br /&gt;
addEvent(&amp;quot;onServerSideOnlyEvent&amp;quot;, false) -- установите второй аргумент (allowRemoteTriger) в false, чтобы его нельзя было вызвать с клиента&lt;br /&gt;
addEventHandler(&amp;quot;onServerSideOnlyEvent&amp;quot;, root, onServerSideOnlyEvent) -- связываем наше событие с функцией onServerSideOnlyEvent&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Защита снарядов и взрывных устройств ==&lt;br /&gt;
Этот раздел (и '''код''' - '''работа продолжается''') - '''используйте на свой страх и риск'''.&lt;br /&gt;
----------&lt;br /&gt;
&amp;lt;section name=&amp;quot;Server&amp;quot; class=&amp;quot;server&amp;quot; show=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
Устройство для отслеживания боеприпасов к снарядам:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local playerProjectileAmmo = {} -- хранить здесь боезапас оружия игрока&lt;br /&gt;
local playerWeaponsToTrack = { -- отслеживать боезапас для определенных типов оружия игрока, в основном тех, которые создают снаряды; [weaponID] = weaponSlot&lt;br /&gt;
	[16] = 8, -- grenade&lt;br /&gt;
	[17] = 8, -- teargas&lt;br /&gt;
	[18] = 8, -- molotov&lt;br /&gt;
	[35] = 7, -- rocket launcher&lt;br /&gt;
	[36] = 7, -- rocket launcher (heat-seeking)&lt;br /&gt;
	[39] = 8, -- satchel charge&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function updateProjectileAmmoForPlayer(playerElement)&lt;br /&gt;
	local validElement = isElement(playerElement)&lt;br /&gt;
&lt;br /&gt;
	if (not validElement) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local playerDead = isPedDead(playerElement)&lt;br /&gt;
&lt;br /&gt;
	if (playerDead) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for weaponID, weaponSlot in pairs(playerWeaponsToTrack) do&lt;br /&gt;
		local weaponInSlot = getPedWeapon(playerElement, weaponSlot)&lt;br /&gt;
		local weaponTotalAmmo = getPedTotalAmmo(playerElement, weaponSlot)&lt;br /&gt;
		local weaponHasAmmo = (weaponTotalAmmo &amp;gt; 0)&lt;br /&gt;
		local weaponMatching = (weaponInSlot == weaponID)&lt;br /&gt;
		local updateWeaponAmmo = (weaponMatching and weaponHasAmmo)&lt;br /&gt;
&lt;br /&gt;
		if (updateWeaponAmmo) then&lt;br /&gt;
			local storedProjectileAmmo = playerProjectileAmmo[playerElement]&lt;br /&gt;
			local newWeaponAmmo = (updateWeaponAmmo and weaponTotalAmmo or nil)&lt;br /&gt;
&lt;br /&gt;
			if (not storedProjectileAmmo) then&lt;br /&gt;
				playerProjectileAmmo[playerElement] = {}&lt;br /&gt;
				storedProjectileAmmo = playerProjectileAmmo[playerElement]&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			storedProjectileAmmo[weaponID] = newWeaponAmmo&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function hasPlayerProjectileAmmo(playerElement, projectileWeapon)&lt;br /&gt;
	local validElement = isElement(playerElement)&lt;br /&gt;
&lt;br /&gt;
	if (not validElement) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local playerDead = isPedDead(playerElement)&lt;br /&gt;
&lt;br /&gt;
	if (playerDead) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local projectileData = playerProjectileAmmo[playerElement]&lt;br /&gt;
	local projectileAmmo = (projectileData and projectileData[projectileWeapon])&lt;br /&gt;
&lt;br /&gt;
	return projectileAmmo&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function decreasePlayerProjectileAmmo(playerElement, projectileWeapon)&lt;br /&gt;
	local validElement = isElement(playerElement)&lt;br /&gt;
&lt;br /&gt;
	if (not validElement) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local playerDead = isPedDead(playerElement)&lt;br /&gt;
&lt;br /&gt;
	if (playerDead) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local playerProjectileData = playerProjectileAmmo[playerElement]&lt;br /&gt;
&lt;br /&gt;
	if (not playerProjectileData) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local projectileWeaponAmmo = playerProjectileData[projectileWeapon]&lt;br /&gt;
	local tempProjectileAmmo = (projectileWeaponAmmo - 1)&lt;br /&gt;
	local newProjectileAmmo = (tempProjectileAmmo &amp;gt; 0 and tempProjectileAmmo or nil)&lt;br /&gt;
&lt;br /&gt;
	playerProjectileData[projectileWeapon] = newProjectileAmmo&lt;br /&gt;
&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function onPlayerWeaponSwitchAntiCheat(previousWeaponID, currentWeaponID)&lt;br /&gt;
	setTimer(updateProjectileAmmoForPlayer, 50, 1, source)&lt;br /&gt;
end&lt;br /&gt;
addEventHandler(&amp;quot;onPlayerWeaponSwitch&amp;quot;, root, onPlayerWeaponSwitchAntiCheat)&lt;br /&gt;
&lt;br /&gt;
function onResourceStartAntiCheat()&lt;br /&gt;
	local playersTable = getElementsByType(&amp;quot;player&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	for playerID = 1, #playersTable do&lt;br /&gt;
		local playerElement = playersTable[playerID]&lt;br /&gt;
&lt;br /&gt;
		updateProjectileAmmoForPlayer(playerElement)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
addEventHandler(&amp;quot;onResourceStart&amp;quot;, resourceRoot, onResourceStartAntiCheat)&lt;br /&gt;
&lt;br /&gt;
function onPlayerWastedQuitAntiCheat()&lt;br /&gt;
	playerProjectileAmmo[source] = nil&lt;br /&gt;
end&lt;br /&gt;
addEventHandler(&amp;quot;onPlayerWasted&amp;quot;, root, onPlayerWastedQuitAntiCheat)&lt;br /&gt;
addEventHandler(&amp;quot;onPlayerQuit&amp;quot;, root, onPlayerWastedQuitAntiCheat)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;section name=&amp;quot;Server&amp;quot; class=&amp;quot;server&amp;quot; show=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
Манипулятор со снарядом:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local playerCreatedProjectiles = {} -- хранить количество легитимно созданных снарядов игрока; [playerElement] = {[projectileType] = activeProjectiles}&lt;br /&gt;
local projectileTypes = {&lt;br /&gt;
	[16] = { -- Grenade&lt;br /&gt;
		projectileAllowed = true,&lt;br /&gt;
		projectileMaxDistanceFromCreator = 2,&lt;br /&gt;
		projectileAllowedWeapons = {&lt;br /&gt;
			[16] = true, -- grenade&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	[17] = { -- Teargas&lt;br /&gt;
		projectileAllowed = true,&lt;br /&gt;
		projectileMaxDistanceFromCreator = 2,&lt;br /&gt;
		projectileAllowedWeapons = {&lt;br /&gt;
			[17] = true, -- teargas&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	[18] = { -- Molotov&lt;br /&gt;
		projectileAllowed = true,&lt;br /&gt;
		projectileMaxDistanceFromCreator = 2,&lt;br /&gt;
		projectileAllowedWeapons = {&lt;br /&gt;
			[18] = true, -- molotov&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	[19] = { -- Rocket&lt;br /&gt;
		projectileAllowed = true,&lt;br /&gt;
		projectileMaxDistanceFromCreator = 5,&lt;br /&gt;
		projectileMaxVelocity = 2,&lt;br /&gt;
		projectileAllowedWeapons = {&lt;br /&gt;
			[35] = true, -- rocket launcher&lt;br /&gt;
		},&lt;br /&gt;
		projectileAllowedVehicles = {&lt;br /&gt;
			[425] = true, -- hunter&lt;br /&gt;
			[520] = true, -- hydra&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	[20] = { -- Rocket (heat-seeking)&lt;br /&gt;
		projectileAllowed = true,&lt;br /&gt;
		projectileMaxDistanceFromCreator = 5,&lt;br /&gt;
		projectileMaxVelocity = 2,&lt;br /&gt;
		projectileAllowedWeapons = {&lt;br /&gt;
			[36] = true, -- rocket launcher (heat-seeking)&lt;br /&gt;
		},&lt;br /&gt;
		projectileAllowedVehicles = {&lt;br /&gt;
			[520] = true, -- hydra&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	[21] = { -- Airbomb&lt;br /&gt;
		projectileAllowed = true,&lt;br /&gt;
		projectileAllowedVehicles = {&lt;br /&gt;
			[520] = true, -- hydra&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	[39] = { -- Satchel charge&lt;br /&gt;
		projectileAllowed = true,&lt;br /&gt;
		projectileMaxDistanceFromCreator = 2,&lt;br /&gt;
		projectileAllowedWeapons = {&lt;br /&gt;
			[39] = true, -- satchel charge&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	[58] = { -- Hydra flare&lt;br /&gt;
		projectileAllowed = true,&lt;br /&gt;
		projectileMaxDistanceFromCreator = 5,&lt;br /&gt;
		projectileAllowedVehicles = {&lt;br /&gt;
			[520] = true, -- hydra&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local reportAbnormality = true -- сообщать ли о нарушениях в скрипте отладки - по умолчанию&lt;br /&gt;
local punishPlayerOnDetect = false -- должен ли игрок быть наказан при обнаружении; true - да, или false, чтобы ничего не делать (убедитесь, что ресурс, запускающий этот код, имеет права администратора)&lt;br /&gt;
local punishmentBan = true -- актуально только если punishPlayerOnDetect установлен в true; используйте true для бана или false для кика&lt;br /&gt;
local punishmentReason = &amp;quot;Projectile/explosion anti-cheat&amp;quot; -- актуально только если punishPlayerOnDetect установлен в true; причина, которая будет показана наказанному игроку&lt;br /&gt;
local punishedBy = &amp;quot;Console&amp;quot; -- актуально только если punishPlayerOnDetect установлен в true; кто ответственен за наказание, также показывается наказанному игроку&lt;br /&gt;
local banByIP = false -- актуально только если punishPlayerOnDetect и punishmentBan установлены в true; бан по IP в настоящее время не рекомендуется (...)&lt;br /&gt;
local banByUsername = false -- имя пользователя сообщества - устаревшая вещь, поэтому установлено в false и должно оставаться таким&lt;br /&gt;
local banBySerial = true -- актуально только если punishPlayerOnDetect и punishmentBan установлены в true; (...) если есть серийный номер игрока, который можно использовать вместо этого&lt;br /&gt;
local banTime = 0 -- актуально только если punishPlayerOnDetect и punishmentBan установлены в true; время в секундах, 0 навсегда&lt;br /&gt;
local debugMsgLevel = 4 -- этот уровень отладки позволяет скрыть префикс INFO: и использовать пользовательские цвета&lt;br /&gt;
local debugMsgR = 255 -- сообщение отладки - красный цвет&lt;br /&gt;
local debugMsgG = 127 -- сообщение отладки - зеленый цвет&lt;br /&gt;
local debugMsgB = 0 -- сообщение отладки - синий цвет&lt;br /&gt;
&lt;br /&gt;
local function reportProjectileAbnormality(playerElement, projectileType, projectileX, projectileY, projectileZ, projectileForce, projectileTarget, projectileRX, projectileRY, projectileRZ, projectileVX, projectileVY, projectileVZ, detectionCode)&lt;br /&gt;
	local projectileSyncer = inspect(playerElement)&lt;br /&gt;
	local projectilePosition = projectileX..&amp;quot;, &amp;quot;..projectileY..&amp;quot;, &amp;quot;..projectileZ&lt;br /&gt;
	local projectileZoneName = getZoneName(projectileX, projectileY, projectileZ, false)&lt;br /&gt;
	local projectileCityName = getZoneName(projectileX, projectileY, projectileZ, true)&lt;br /&gt;
	local projectileLog =&lt;br /&gt;
		&amp;quot;* Detected projectile abnormality - &amp;quot;..detectionCode..&amp;quot; *\n&amp;quot;..&lt;br /&gt;
		&amp;quot;Projectile syncer: &amp;quot;..projectileSyncer..&amp;quot;\n&amp;quot;..&lt;br /&gt;
		&amp;quot;Projectile type: &amp;quot;..projectileType..&amp;quot;\n&amp;quot;..&lt;br /&gt;
		&amp;quot;Projectile position: &amp;quot;..projectilePosition.. &amp;quot; (&amp;quot;..projectileZoneName..&amp;quot;, &amp;quot;..projectileCityName..&amp;quot;)\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	outputDebugString(projectileLog, debugMsgLevel, debugMsgR, debugMsgG, debugMsgB)&lt;br /&gt;
&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function processProjectileChecks(playerElement, projectileType, projectileX, projectileY, projectileZ, projectileForce, projectileTarget, projectileRX, projectileRY, projectileRZ, projectileVX, projectileVY, projectileVZ)&lt;br /&gt;
	local projectileData = projectileTypes[projectileType]&lt;br /&gt;
	local projectileAllowed = projectileData.projectileAllowed&lt;br /&gt;
&lt;br /&gt;
	if (not projectileAllowed) then&lt;br /&gt;
		return false, &amp;quot;Projectile not allowed&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local projectileAllowedWeapons = projectileData.projectileAllowedWeapons&lt;br /&gt;
&lt;br /&gt;
	if (projectileAllowedWeapons) then&lt;br /&gt;
		local playerWeapon = getPedWeapon(playerElement)&lt;br /&gt;
		local allowedWeapon = projectileAllowedWeapons[playerWeapon]&lt;br /&gt;
&lt;br /&gt;
		if (not allowedWeapon) then&lt;br /&gt;
			return false, &amp;quot;Player is not holding correct weapon&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local weaponAmmo = hasPlayerProjectileAmmo(playerElement, playerWeapon)&lt;br /&gt;
		local playerHasAmmo = (weaponAmmo &amp;gt; 0)&lt;br /&gt;
&lt;br /&gt;
		if (not playerHasAmmo) then&lt;br /&gt;
			return false, &amp;quot;Player doesn't have ammo for weapon&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		decreasePlayerProjectileAmmo(playerElement, playerWeapon)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local playerVehicle = getPedOccupiedVehicle(playerElement)&lt;br /&gt;
&lt;br /&gt;
	if (playerVehicle) then&lt;br /&gt;
		local projectileAllowedVehicles = projectileData.projectileAllowedVehicles&lt;br /&gt;
&lt;br /&gt;
		if (projectileAllowedVehicles) then&lt;br /&gt;
			local vehicleModel = getElementModel(playerVehicle)&lt;br /&gt;
			local allowedVehicle = projectileAllowedVehicles[vehicleModel]&lt;br /&gt;
&lt;br /&gt;
			if (not allowedVehicle) then&lt;br /&gt;
				return false, &amp;quot;Player is not inside allowed vehicles&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			local vehicleDriver = getVehicleController(playerVehicle)&lt;br /&gt;
			local playerDriver = (playerElement == vehicleDriver)&lt;br /&gt;
&lt;br /&gt;
			if (not playerDriver) then&lt;br /&gt;
				return false, &amp;quot;Player is not vehicle driver&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		return false, &amp;quot;Player in vehicle&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local projectileMaxDistanceFromCreator = projectileData.projectileMaxDistanceFromCreator&lt;br /&gt;
&lt;br /&gt;
	if (projectileMaxDistanceFromCreator) then&lt;br /&gt;
		local playerX, playerY, playerZ = getElementPosition(playerElement)&lt;br /&gt;
		local distanceToProjectile = getDistanceBetweenPoints3D(playerX, playerY, playerZ, projectileX, projectileY, projectileZ)&lt;br /&gt;
		local matchingProjectileDistance = (distanceToProjectile &amp;lt;= projectileMaxDistanceFromCreator)&lt;br /&gt;
&lt;br /&gt;
		if (not matchingProjectileDistance) then&lt;br /&gt;
			return false, &amp;quot;Projectile distance mismatch&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local projectileMaxVelocity = projectileData.projectileMaxVelocity&lt;br /&gt;
&lt;br /&gt;
	if (projectileMaxVelocity) then&lt;br /&gt;
		local projectileVelocity = (projectileVX ^ 2 + projectileVY ^ 2 + projectileVZ ^ 2)&lt;br /&gt;
		local projectileSpeed = math.sqrt(projectileVelocity)&lt;br /&gt;
		local matchingProjectileVelocity = (projectileSpeed &amp;lt;= projectileMaxVelocity)&lt;br /&gt;
&lt;br /&gt;
		if (not matchingProjectileVelocity) then&lt;br /&gt;
			return false, &amp;quot;Projectile velocity mismatch&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function trackPlayerProjectile(playerElement, projectileID)&lt;br /&gt;
	local validElement = isElement(playerElement)&lt;br /&gt;
&lt;br /&gt;
	if (not validElement) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local playerProjectiles = playerCreatedProjectiles[playerElement]&lt;br /&gt;
&lt;br /&gt;
	if (not playerProjectiles) then&lt;br /&gt;
		playerCreatedProjectiles[playerElement] = {}&lt;br /&gt;
		playerProjectiles = playerCreatedProjectiles[playerElement]&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local projectilesByType = playerProjectiles[projectileID] or 0&lt;br /&gt;
	local newProjectilesCount = (projectilesByType + 1)&lt;br /&gt;
&lt;br /&gt;
	playerProjectiles[projectileID] = newProjectilesCount&lt;br /&gt;
&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getProjectileDetectionOverwrittenBehavior(projectileType)&lt;br /&gt;
	local projectileData = projectileTypes[projectileType]&lt;br /&gt;
&lt;br /&gt;
	if (not projectileData) then&lt;br /&gt;
		return reportAbnormality, punishPlayerOnDetect, punishmentBan&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local projectileBehaviour = projectileData.projectileOverwriteBehaviour&lt;br /&gt;
&lt;br /&gt;
	if (not projectileBehaviour) then&lt;br /&gt;
		return reportAbnormality, punishPlayerOnDetect, punishmentBan&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local overwriteReport = projectileBehaviour.reportAbnormality&lt;br /&gt;
	local overwritePunish = projectileBehaviour.punishPlayerOnDetect&lt;br /&gt;
	local overwriteBan = projectileBehaviour.punishmentBan&lt;br /&gt;
&lt;br /&gt;
	return overwriteReport, overwritePunish, overwriteBan&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function decreasePlayerProjectiles(playerElement, projectileID)&lt;br /&gt;
	local validElement = isElement(playerElement)&lt;br /&gt;
&lt;br /&gt;
	if (not validElement) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local playerProjectiles = playerCreatedProjectiles[playerElement]&lt;br /&gt;
&lt;br /&gt;
	if (not playerProjectiles) then&lt;br /&gt;
		return false, true&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local projectilesByType = playerProjectiles[projectileID]&lt;br /&gt;
&lt;br /&gt;
	if (not projectilesByType) then&lt;br /&gt;
		return false, true&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local tempProjectilesCount = (projectilesByType - 1)&lt;br /&gt;
	local newProjectilesCount = (tempProjectilesCount &amp;gt; 0 and tempProjectilesCount or nil)&lt;br /&gt;
&lt;br /&gt;
	playerProjectiles[projectileID] = newProjectilesCount&lt;br /&gt;
&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function onPlayerProjectileCreationAntiCheat(projectileType, projectileX, projectileY, projectileZ, projectileForce, projectileTarget, projectileRX, projectileRY, projectileRZ, projectileVX, projectileVY, projectileVZ)&lt;br /&gt;
	local approvedProjectile, detectionCode = processProjectileChecks(source, projectileType, projectileX, projectileY, projectileZ, projectileForce, projectileTarget, projectileRX, projectileRY, projectileRZ, projectileVX, projectileVY, projectileVZ)&lt;br /&gt;
&lt;br /&gt;
	if (approvedProjectile) then&lt;br /&gt;
		trackPlayerProjectile(source, projectileType)&lt;br /&gt;
&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local reportAbnormality, punishPlayerOnDetect, punishmentBan = getProjectileDetectionOverwrittenBehavior(projectileType)&lt;br /&gt;
&lt;br /&gt;
	if (reportAbnormality) then&lt;br /&gt;
		reportProjectileAbnormality(source, projectileType, projectileX, projectileY, projectileZ, projectileForce, projectileTarget, projectileRX, projectileRY, projectileRZ, projectileVX, projectileVY, projectileVZ, detectionCode)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	cancelEvent()&lt;br /&gt;
&lt;br /&gt;
	if (not punishPlayerOnDetect) then -- мы не хотим наказывать игрока по какой-то причине&lt;br /&gt;
		return false -- так что останавливаемся здесь&lt;br /&gt;
	end&lt;br /&gt;
		&lt;br /&gt;
	if (punishmentBan) then -- если это бан&lt;br /&gt;
		banPlayer(source, banByIP, banByUsername, banBySerial, punishedBy, punishmentReason, banTime) -- удаляем его присутствие с сервера&lt;br /&gt;
	else -- иначе&lt;br /&gt;
		kickPlayer(source, punishedBy, punishmentReason) -- просто кикаем игрока с сервера&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
addEventHandler(&amp;quot;onPlayerProjectileCreation&amp;quot;, root, onPlayerProjectileCreationAntiCheat)&lt;br /&gt;
&lt;br /&gt;
function onPlayerQuitAntiCheat()&lt;br /&gt;
	playerCreatedProjectiles[source] = nil&lt;br /&gt;
end&lt;br /&gt;
addEventHandler(&amp;quot;onPlayerQuit&amp;quot;, root, onPlayerQuitAntiCheat)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;section name=&amp;quot;Server&amp;quot; class=&amp;quot;server&amp;quot; show=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
Обработчик взрывов:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local rocketInstantExplosionDistanceThreshold = 1.55 -- дистанция, ниже которой будет создан только взрыв (а не снаряд ракеты, следовательно, не вызывается onPlayerProjectileCreation); не меняйте это&lt;br /&gt;
local explosionTypes = { -- более конкретная информация о взрыве и разрешен ли он&lt;br /&gt;
	[0] = { -- Grenade&lt;br /&gt;
		explosionAllowed = true,&lt;br /&gt;
		explosionAllowedProjectiles = {&lt;br /&gt;
			[16] = true, -- grenade&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	[1] = { -- Molotov&lt;br /&gt;
		explosionAllowed = true,&lt;br /&gt;
		explosionAllowedProjectiles = {&lt;br /&gt;
			[18] = true, -- molotov&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	[2] = { -- Rocket&lt;br /&gt;
		explosionAllowed = true,&lt;br /&gt;
		explosionAllowedWeapons = {&lt;br /&gt;
			[35] = true, -- rocket launcher&lt;br /&gt;
			[36] = true, -- rocket launcher (heat-seeking)&lt;br /&gt;
		},&lt;br /&gt;
		explosionAllowedProjectiles = {&lt;br /&gt;
			[19] = true, -- rocket&lt;br /&gt;
			[20] = true, -- rocket (heat-seeking)&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	[3] = { -- Rocket weak&lt;br /&gt;
		explosionAllowed = true,&lt;br /&gt;
		explosionAllowedProjectiles = {&lt;br /&gt;
			[19] = true, -- rocket&lt;br /&gt;
			[20] = true, -- rocket (heat-seeking)&lt;br /&gt;
		},&lt;br /&gt;
	},&lt;br /&gt;
	[4] = { -- Car&lt;br /&gt;
		explosionAllowed = true,&lt;br /&gt;
	},&lt;br /&gt;
	[5] = { -- Car quick&lt;br /&gt;
		explosionAllowed = true,&lt;br /&gt;
	},&lt;br /&gt;
	[6] = { -- Boat&lt;br /&gt;
		explosionAllowed = true,&lt;br /&gt;
	},&lt;br /&gt;
	[7] = { -- Heli&lt;br /&gt;
		explosionAllowed = true,&lt;br /&gt;
	},&lt;br /&gt;
	[8] = { -- Mine&lt;br /&gt;
		explosionAllowed = true,&lt;br /&gt;
	},&lt;br /&gt;
	[9] = { -- Object&lt;br /&gt;
		explosionAllowed = true,&lt;br /&gt;
	},&lt;br /&gt;
	[10] = { -- Tank grenade&lt;br /&gt;
		explosionAllowed = true,&lt;br /&gt;
		explosionMaxDistanceFromCreator = 80,&lt;br /&gt;
		explosionAllowedVehicles = {&lt;br /&gt;
			[432] = true,&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	[11] = { -- Small&lt;br /&gt;
		explosionAllowed = true,&lt;br /&gt;
	},&lt;br /&gt;
	[12] = { -- Tiny&lt;br /&gt;
		explosionAllowed = true,&lt;br /&gt;
	},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local reportAbnormality = true -- сообщать ли о нарушениях в скрипте отладки - по умолчанию&lt;br /&gt;
local punishPlayerOnDetect = false -- должен ли игрок быть наказан при обнаружении; true - да, или false, чтобы ничего не делать (убедитесь, что ресурс, запускающий этот код, имеет права администратора)&lt;br /&gt;
local punishmentBan = true -- актуально только если punishPlayerOnDetect установлен в true; используйте true для бана или false для кика&lt;br /&gt;
local punishmentReason = &amp;quot;Projectile/explosion anti-cheat&amp;quot; -- актуально только если punishPlayerOnDetect установлен в true; причина, которая будет показана наказанному игроку&lt;br /&gt;
local punishedBy = &amp;quot;Console&amp;quot; -- актуально только если punishPlayerOnDetect установлен в true; кто ответственен за наказание, также показывается наказанному игроку&lt;br /&gt;
local banByIP = false -- актуально только если punishPlayerOnDetect и punishmentBan установлены в true; бан по IP в настоящее время не рекомендуется (...)&lt;br /&gt;
local banByUsername = false -- имя пользователя сообщества - устаревшая вещь, поэтому установлено в false и должно оставаться таким&lt;br /&gt;
local banBySerial = true -- актуально только если punishPlayerOnDetect и punishmentBan установлены в true; (...) если есть серийный номер игрока, который можно использовать вместо этого&lt;br /&gt;
local banTime = 0 -- актуально только если punishPlayerOnDetect и punishmentBan установлены в true; время в секундах, 0 навсегда&lt;br /&gt;
local debugMsgLevel = 4 -- этот уровень отладки позволяет скрыть префикс INFO: и использовать пользовательские цвета&lt;br /&gt;
local debugMsgR = 255 -- сообщение отладки - красный цвет&lt;br /&gt;
local debugMsgG = 127 -- сообщение отладки - зеленый цвет&lt;br /&gt;
local debugMsgB = 0 -- сообщение отладки - синий цвет&lt;br /&gt;
&lt;br /&gt;
local function reportExplosionAbnormality(playerElement, explosionType, explosionX, explosionY, explosionZ, detectionCode)&lt;br /&gt;
	local explosionSyncer = inspect(playerElement)&lt;br /&gt;
	local explosionType = explosionType&lt;br /&gt;
	local explosionPosition = explosionX..&amp;quot;, &amp;quot;..explosionY..&amp;quot;, &amp;quot;..explosionZ&lt;br /&gt;
	local explosionZoneName = getZoneName(explosionX, explosionY, explosionZ, false)&lt;br /&gt;
	local explosionCityName = getZoneName(explosionX, explosionY, explosionZ, true)&lt;br /&gt;
	local explosionLog =&lt;br /&gt;
		&amp;quot;* Detected explosion abnormality - &amp;quot;..detectionCode..&amp;quot; *\n&amp;quot;..&lt;br /&gt;
		&amp;quot;Explosion syncer: &amp;quot;..explosionSyncer..&amp;quot;\n&amp;quot;..&lt;br /&gt;
		&amp;quot;Explosion type: &amp;quot;..explosionType..&amp;quot;\n&amp;quot;..&lt;br /&gt;
		&amp;quot;Explosion position: &amp;quot;..explosionPosition.. &amp;quot; (&amp;quot;..explosionZoneName..&amp;quot;, &amp;quot;..explosionCityName..&amp;quot;)\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	outputDebugString(explosionLog, debugMsgLevel, debugMsgR, debugMsgG, debugMsgB)&lt;br /&gt;
&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function processExplosionChecks(playerElement, explosionType, explosionX, explosionY, explosionZ)&lt;br /&gt;
	local explosionData = explosionTypes[explosionType]&lt;br /&gt;
	local explosionAllowed = explosionData.explosionAllowed&lt;br /&gt;
&lt;br /&gt;
	if (not explosionAllowed) then&lt;br /&gt;
		return false, &amp;quot;Explosion type not allowed&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local rocketExplosion = (explosionType == 2)&lt;br /&gt;
&lt;br /&gt;
	if (rocketExplosion) then&lt;br /&gt;
		local playerX, playerY, playerZ = getElementPosition(playerElement)&lt;br /&gt;
		local distanceToExplosion = getDistanceBetweenPoints3D(playerX, playerY, playerZ, explosionX, explosionY, explosionZ)&lt;br /&gt;
		local instantExplosion = (distanceToExplosion &amp;lt; rocketInstantExplosionDistanceThreshold)&lt;br /&gt;
&lt;br /&gt;
		if (instantExplosion) then&lt;br /&gt;
			local explosionAllowedWeapons = explosionData.explosionAllowedWeapons&lt;br /&gt;
			local playerWeapon = getPedWeapon(playerElement)&lt;br /&gt;
			local allowedWeapon = explosionAllowedWeapons[playerWeapon]&lt;br /&gt;
&lt;br /&gt;
			if (not allowedWeapon) then&lt;br /&gt;
				return false, &amp;quot;Player is not holding rocket launcher&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			local weaponAmmo = hasPlayerProjectileAmmo(playerElement, playerWeapon)&lt;br /&gt;
			local playerHasAmmo = (weaponAmmo &amp;gt; 0)&lt;br /&gt;
&lt;br /&gt;
			if (not playerHasAmmo) then&lt;br /&gt;
				return false, &amp;quot;Player doesn't have ammo for rocket launcher&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			decreasePlayerProjectileAmmo(playerElement, playerWeapon)&lt;br /&gt;
&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local explosionAllowedProjectiles = explosionData.explosionAllowedProjectiles&lt;br /&gt;
&lt;br /&gt;
	if (explosionAllowedProjectiles) then&lt;br /&gt;
&lt;br /&gt;
		for projectileID, _ in pairs(explosionAllowedProjectiles) do&lt;br /&gt;
			local atleastOneProjectile = decreasePlayerProjectiles(playerElement, projectileID)&lt;br /&gt;
&lt;br /&gt;
			if (atleastOneProjectile) then&lt;br /&gt;
				return true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		return false, &amp;quot;Explosion created without respective projectile&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local explosionAllowedVehicles = explosionData.explosionAllowedVehicles&lt;br /&gt;
&lt;br /&gt;
	if (explosionAllowedVehicles) then&lt;br /&gt;
		local playerVehicle = getPedOccupiedVehicle(playerElement)&lt;br /&gt;
&lt;br /&gt;
		if (not playerVehicle) then&lt;br /&gt;
			return false, &amp;quot;Player is not in vehicle&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local vehicleModel = getElementModel(playerVehicle)&lt;br /&gt;
		local allowedVehicle = explosionAllowedVehicles[vehicleModel]&lt;br /&gt;
&lt;br /&gt;
		if (not allowedVehicle) then&lt;br /&gt;
			return false, &amp;quot;Player is inside not allowed vehicles&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local vehicleDriver = getVehicleController(playerVehicle)&lt;br /&gt;
		local playerDriver = (playerElement == vehicleDriver)&lt;br /&gt;
&lt;br /&gt;
		if (not playerDriver) then&lt;br /&gt;
			return false, &amp;quot;Player is not vehicle driver&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local explosionMaxDistanceFromCreator = explosionData.explosionMaxDistanceFromCreator&lt;br /&gt;
&lt;br /&gt;
	if (explosionMaxDistanceFromCreator) then&lt;br /&gt;
		local playerX, playerY, playerZ = getElementPosition(playerElement)&lt;br /&gt;
		local distanceToExplosion = getDistanceBetweenPoints3D(playerX, playerY, playerZ, explosionX, explosionY, explosionZ)&lt;br /&gt;
		local matchingExplosionDistance = (distanceToExplosion &amp;lt; explosionMaxDistanceFromCreator)&lt;br /&gt;
&lt;br /&gt;
		if (not matchingExplosionDistance) then&lt;br /&gt;
			return false, &amp;quot;Explosion distance mismatch&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getExplosionDetectionOverwrittenBehavior(explosionType)&lt;br /&gt;
	local explosionData = explosionTypes[explosionType]&lt;br /&gt;
&lt;br /&gt;
	if (not explosionData) then&lt;br /&gt;
		return reportAbnormality, punishPlayerOnDetect, punishmentBan&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local explosionBehaviour = explosionData.explosionOverwriteBehaviour&lt;br /&gt;
&lt;br /&gt;
	if (not explosionBehaviour) then&lt;br /&gt;
		return reportAbnormality, punishPlayerOnDetect, punishmentBan&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local overwriteReport = explosionBehaviour.reportAbnormality&lt;br /&gt;
	local overwritePunish = explosionBehaviour.punishPlayerOnDetect&lt;br /&gt;
	local overwriteBan = explosionBehaviour.punishmentBan&lt;br /&gt;
&lt;br /&gt;
	return overwriteReport, overwritePunish, overwriteBan&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function onExplosionAntiCheat(explosionX, explosionY, explosionZ, explosionType)&lt;br /&gt;
	local serverSyncExplosion = (source == root)&lt;br /&gt;
&lt;br /&gt;
	if (serverSyncExplosion) then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local approvedExplosion, detectionCode = processExplosionChecks(source, explosionType, explosionX, explosionY, explosionZ)&lt;br /&gt;
&lt;br /&gt;
	if (approvedExplosion) then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local reportAbnormality, punishPlayerOnDetect, punishmentBan = getExplosionDetectionOverwrittenBehavior(explosionType)&lt;br /&gt;
&lt;br /&gt;
	if (reportAbnormality) then&lt;br /&gt;
		reportExplosionAbnormality(source, explosionType, explosionX, explosionY, explosionZ, detectionCode)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	cancelEvent()&lt;br /&gt;
&lt;br /&gt;
	if (not punishPlayerOnDetect) then -- мы не хотим наказывать игрока по какой-то причине&lt;br /&gt;
		return false -- так что останавливаемся здесь&lt;br /&gt;
	end&lt;br /&gt;
		&lt;br /&gt;
	if (punishmentBan) then -- если это бан&lt;br /&gt;
		banPlayer(source, banByIP, banByUsername, banBySerial, punishedBy, punishmentReason, banTime) -- удаляем его присутствие с сервера&lt;br /&gt;
	else -- иначе&lt;br /&gt;
		kickPlayer(source, punishedBy, punishmentReason) -- просто кикаем игрока с сервера&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
addEventHandler(&amp;quot;onExplosion&amp;quot;, root, onExplosionAntiCheat)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Обработка незарегистрированных событий==&lt;br /&gt;
Смотрите: [[onPlayerTriggerInvalidEvent]]&lt;br /&gt;
&lt;br /&gt;
==Обработка нежелательных событий==&lt;br /&gt;
Смотрите: [[onPlayerTriggerEventThreshold]]&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
__NOEDITSECTION__&lt;br /&gt;
[[ru:Script security]]&lt;br /&gt;
[[en:Script security]]&lt;/div&gt;</summary>
		<author><name>Flox</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/RU/Forks</id>
		<title>RU/Forks</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/RU/Forks"/>
		<updated>2026-01-02T20:15:14Z</updated>

		<summary type="html">&lt;p&gt;Flox: Created page with &amp;quot;__NOTOC__ {{Note|Information on this page does not apply to the official builds of MTA.}}  Multi Theft Auto - Это программное обеспечение с открытым исходным кодом, доступное бесплатно на [https://github.com/multitheftauto/mtasa-blue GitHub multitheftauto/mtasa-blue]. Любой может создать форк проекта, если будет соблюдать условия нашей лиценз...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ {{Note|Information on this page does not apply to the official builds of MTA.}}&lt;br /&gt;
&lt;br /&gt;
Multi Theft Auto - Это программное обеспечение с открытым исходным кодом, доступное бесплатно на [https://github.com/multitheftauto/mtasa-blue GitHub multitheftauto/mtasa-blue].&lt;br /&gt;
Любой может создать форк проекта, если будет соблюдать условия нашей лицензии — Стандартной общественной лицензии GNU версии 3.&lt;br /&gt;
&lt;br /&gt;
Вы можете ознакомиться с пояснениями к GNU GPL v3 здесь: [https://choosealicense.com/licenses/gpl-3.0/ choosealicense.com] и [https://tldrlegal.com/license/gnu-general-public-license-v3-(gpl-3) tldrlegal.com]. Приоритет [https://github.com/multitheftauto/mtasa-blue/blob/master/LICENSE license] отдается нашей лицензии, но обычно это означает, что вы должны:&lt;br /&gt;
&lt;br /&gt;
* указать существенные изменения, внесенные в программное обеспечение&lt;br /&gt;
* раскрыть исходный код &lt;br /&gt;
* поделиться своим кодом под той же лицензией&lt;br /&gt;
* включить оригинальное уведомление об авторских правах&lt;br /&gt;
&lt;br /&gt;
Если вы работаете над форком, мы просим вас указать ссылку на вашу домашнюю страницу и указать, где мы можем найти исходный код. Это позволяет нам быть в курсе событий, связанных с проектами, и даже вносить улучшения для подавляющего большинства игроков в MTA. Указывать имя в Discord не обязательно, но если вы обратитесь за помощью в разработке на наш GitHub, форум или в Discord, это поможет нам понять, из какого вы проекта и соблюдаете ли вы условия лицензии.&lt;br /&gt;
&lt;br /&gt;
== Forks and anti-cheat==&lt;br /&gt;
&lt;br /&gt;
(from https://wiki.multitheftauto.com/wiki/Anti-cheat_support_for_custom_builds)&lt;br /&gt;
&lt;br /&gt;
=== '''// UPDATE (December 2022)''' ===&lt;br /&gt;
Теперь вы также можете использовать «полный античит для форков». Для получения дополнительной информации прочтите эту статью: '''[[Forks Full AC]]'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
.. But otherwise&lt;br /&gt;
&lt;br /&gt;
Пользовательские сборки MTA и форки столкнутся с некоторыми проблемами, связанными с античитом (AC). Из-за того, что многие форки и пользовательские сборки работают не так, как ожидает модуль античита, мы были вынуждены удалить множество расширенных средств обнаружения и защиты от античита, чтобы создать и предоставить отдельный модуль (тот, что с https://mirror-cdn.multitheftauto.com/bdata/netc.dll), который, проще говоря, является гораздо более слабым античитом, чем «настоящий» MTA. Таким образом, если вы не примете меры, ваш форк-проект может (и будет) легко заражён мошенниками. Этого можно избежать с помощью [[Forks Full AC]] (нажмите, чтобы прочитать статью). Но в стандартном сценарии вам поможет информация, представленная ниже.&lt;br /&gt;
&lt;br /&gt;
Компоненты античита и неткода (netc.dll, net.dll, FairplayKD.sys), в отличие от самого MTA, имеют закрытый исходный код, поэтому без дополнительной информации вам будет сложно справиться с трудностями.&lt;br /&gt;
&lt;br /&gt;
AC, как правило, не поддерживается в форках и в будущем может быть полностью исключён. Это означает, что вы, как правило, ''не можете'' полагаться на античит MTA в своём форке. '''Мы настоятельно рекомендуем вам написать и внедрить собственный античит.'''&lt;br /&gt;
&lt;br /&gt;
Если вы не можете написать свой собственный AC, вот несколько шагов, которые помогут вам максимально эффективно использовать наш (не поддерживаемый) AC:&lt;br /&gt;
&lt;br /&gt;
* Всегда используйте версию наших сетевых модулей (например, [https://mirror-cdn.multitheftauto.com/bdata/netc.dll netc.dll] и [https://mirror-cdn.multitheftauto.com/bdata/net.dll net.dll]), которая соответствует нашему коммиту в основной ветке, на которой основан ваш форк&lt;br /&gt;
** Если говорить конкретно, вы можете использовать последнюю версию модуля, совместимую с битовым потоком&lt;br /&gt;
** Вы можете загрузить эти модули, выполнив команду https://github.com/multitheftauto/mtasa-blue/blob/master/win-build.bat&lt;br /&gt;
* Никогда не блокируйте трафик MTA (клиент и сервер взаимодействуют с официальными серверами MTAHQ) в своём проекте&lt;br /&gt;
'''* Обязательно используйте тип сборки «нестабильный», а не «пользовательский», иначе 15 % функций AC для «bdata forks netc» снизятся до 1 %. Подробную информацию и правильную конфигурацию см. в документации по типу сборки по адресу [https://github.com/multitheftauto/mtasa-blue/blob/master/Shared/sdk/version.h mtasa-blue/Shared/sdk/version.h] '''&lt;br /&gt;
&lt;br /&gt;
=== Функции AC отсутствуют в пользовательских сборках === &lt;br /&gt;
* Не обнаруживаются изменения в разделе кода gta_sa&lt;br /&gt;
* Не обнаруживаются изменения в некоторых переменных gta_sa&lt;br /&gt;
* Не обнаруживаются изменения в памяти&lt;br /&gt;
* Не обнаруживаются различные методы внедрения Lua&lt;br /&gt;
* SetElementData не защищён от внешних изменений с помощью хаков&lt;br /&gt;
* Гораздо меньше эвристических методов защиты от читов и внутренних средств защиты&lt;br /&gt;
* Не гарантируется постоянное обновление всех исправленных методов и уязвимостей, на основе которых можно писать читы (иногда они выбираются случайным образом; это одна из причин, по которой рекомендуется обновлять netc.dll до последней доступной версии). Это самая большая (и самая важная) часть оригинального античита.&lt;br /&gt;
* Модули MTA не проверяются на предмет модификаций или удалённого перехвата/манипулирования&lt;br /&gt;
* и многое другое&lt;br /&gt;
&lt;br /&gt;
Как правило, лучше всего работают системы обнаружения на основе сигнатур. Никаких эвристических методов, исправленных методов и исправленных уязвимостей. Системы обнаружения на основе сигнатур — самые слабые, и основная античит-система решает реальную проблему, а не полагается на сигнатуры. Обратите внимание, что в некоторых форках (например, в российской «MTA Province») античит-система MTA поддерживается ещё хуже, чем в большинстве других форков. Это связано с тем, что разработчики форков имеют возможность полностью блокировать или прерывать коммуникационный трафик клиента &amp;gt; MTAHQ (на что мы в значительной степени полагаемся, чтобы помочь форкам противодействовать мошенничеству, поскольку большинство обычных функций AC недоступны), или выполнять и изменять другие действия, которые с технической точки зрения приведут к тому, что функции AC не будут работать. работайте по назначению или немедленно выйдите из строя. Если вы не хотите, чтобы ваш форк был заражен читерами так же сильно, как &amp;quot;провинция MTA&amp;quot; и как они ее называют, &amp;quot;их клоны&amp;quot; (из провинции).. в дополнение к тому, что вы установили тип сборки «custom», тогда как он должен быть «unstable». Теперь, надеюсь, вы знаете, на что следует обратить внимание как разработчику форка. Кроме того, было бы неплохо, если бы это сообщение дошло до разработчиков форков с большим количеством читеров, таких как Province.&lt;br /&gt;
&lt;br /&gt;
 Кроме того, команда по борьбе с мошенничеством в MTA выполняет дополнительную работу вручную, чтобы пресекать мошенничество на форках, например, время от времени блокируя читеров из известных форков с помощью слишком простых методов обнаружения, прилагая все усилия (без каких-либо гарантий). Это всего лишь любезность со стороны MTA, которую мы проявляем, когда нам этого хочется, или, может быть, когда вы обращаетесь к нам... и на это нельзя полагаться.&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Известно, что вышеупомянутые волны банов приводят к банам по причинам, которые выглядят одинаково и известны читерам как «БАН: RPBOX / NEXTRP / PROVINCE CHEAT» (в зависимости от названий форков, затронутых определенным читом). Поэтому, пожалуйста, не направляйте этих пользователей в MTA для обжалования банов.&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Flox</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/SetVehicleDirtEnabled</id>
		<title>SetVehicleDirtEnabled</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/SetVehicleDirtEnabled"/>
		<updated>2026-01-01T18:09:25Z</updated>

		<summary type="html">&lt;p&gt;IManGaaX: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Useful Function}} __NOTOC__&lt;br /&gt;
&amp;lt;lowercasetitle&amp;gt;setVehicleDirtEnabled&amp;lt;/lowercasetitle&amp;gt;&lt;br /&gt;
This function toggles a dirt removal [[shader]] effect on the specified [[vehicle]].&lt;br /&gt;
&lt;br /&gt;
[[Image:SetVehicleDirtEnabled-false.png|thumb|320px|right|[[Image:SetVehicleDirtEnabled-true.png|320px|right]]]]&lt;br /&gt;
&lt;br /&gt;
{{Note|This function applies or removes a custom [[shader]] that removes dirt [[texture]] from the [[vehicle]]'s surface. It also handles [[shader]] cleanup automatically when the [[vehicle]] is destroyed.}}&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;bool setVehicleDirtEnabled( element theVehicle, boolean enabledState )&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''theVehicle''': the vehicle element on which to toggle the dirt effect.&lt;br /&gt;
* '''enabledState''': set to false to remove dirt, true to show default dirt.&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
* '''true''' if the operation was successful (shader applied or removed, or already in the requested state).&lt;br /&gt;
* '''false''' if the operation failed (shader creation failure).&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;
local enabledVehicles = {}&lt;br /&gt;
&lt;br /&gt;
local shaderCode = [[texture removeDirtyTexture;&lt;br /&gt;
technique TexReplace {&lt;br /&gt;
    pass P0 {&lt;br /&gt;
        Texture[0] = removeDirtyTexture;&lt;br /&gt;
    }&lt;br /&gt;
}]]&lt;br /&gt;
&lt;br /&gt;
function isVehicleDirtEnabled(theVehicle)&lt;br /&gt;
    assert(isElement(theVehicle) and getElementType(theVehicle) == &amp;quot;vehicle&amp;quot;, &amp;quot;Bad argument @ 'isVehicleDirtEnabled' [Expected vehicle element at argument 1, got &amp;quot;..(isElement(theVehicle) and getElementType(theVehicle) or type(theVehicle))..&amp;quot;]&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    if isElement(enabledVehicles[theVehicle]) then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function setVehicleDirtEnabled(theVehicle, enabledState)&lt;br /&gt;
    assert(isElement(theVehicle) and getElementType(theVehicle) == &amp;quot;vehicle&amp;quot;, &amp;quot;Bad argument @ 'setVehicleDirtEnabled' [Expected vehicle element at argument 1, got &amp;quot;..(isElement(theVehicle) and getElementType(theVehicle) or type(theVehicle))..&amp;quot;]&amp;quot;)&lt;br /&gt;
    assert(type(enabledState) == &amp;quot;boolean&amp;quot;, &amp;quot;Bad argument @ 'setVehicleDirtEnabled' [Expected boolean at argument 2, got &amp;quot;..(type(enabledState))..&amp;quot;]&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    if not enabledState then&lt;br /&gt;
        if not isElement(enabledVehicles[theVehicle]) then&lt;br /&gt;
            enabledVehicles[theVehicle] = dxCreateShader(shaderCode, 0, 100, false, &amp;quot;vehicle&amp;quot;)&lt;br /&gt;
            if isElement(enabledVehicles[theVehicle]) then&lt;br /&gt;
                engineApplyShaderToWorldTexture(enabledVehicles[theVehicle], &amp;quot;vehiclegrunge256&amp;quot;, theVehicle)&lt;br /&gt;
            else&lt;br /&gt;
                return false&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        if isElement(enabledVehicles[theVehicle]) then&lt;br /&gt;
            engineRemoveShaderFromWorldTexture(enabledVehicles[theVehicle], &amp;quot;vehiclegrunge256&amp;quot;, theVehicle)&lt;br /&gt;
            destroyElement(enabledVehicles[theVehicle])&lt;br /&gt;
            enabledVehicles[theVehicle] = nil&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
addEventHandler(&amp;quot;onClientElementDestroy&amp;quot;, root, function()&lt;br /&gt;
    if getElementType(source) == &amp;quot;vehicle&amp;quot; then&lt;br /&gt;
        setVehicleDirtEnabled(source, true)&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;
'''Author:''' [[User:IManGaaX|Youssef Maged (iManGaaX)]]&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;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
--// Disable dirt on the localPlayer's vehicle&lt;br /&gt;
local theVeh = getPedOccupiedVehicle(localPlayer)&lt;br /&gt;
if theVeh then&lt;br /&gt;
    setVehicleDirtEnabled(theVeh, false)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--// Show the dirt on a vehicle after 5 seconds&lt;br /&gt;
setTimer(function()&lt;br /&gt;
    if theVeh then&lt;br /&gt;
        setVehicleDirtEnabled(theVeh, true)&lt;br /&gt;
    end&lt;br /&gt;
end, 5000, 1)&lt;br /&gt;
&lt;br /&gt;
--// Also u can use 'isVehicleDirtEnabled' to check.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IManGaaX</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/IsPostFXEnabled</id>
		<title>IsPostFXEnabled</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/IsPostFXEnabled"/>
		<updated>2025-12-03T11:08:22Z</updated>

		<summary type="html">&lt;p&gt;O22: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{New feature/item|3.0161|1.6|23644	|&lt;br /&gt;
Checks whether a specific PostFX effect is currently enabled.&lt;br /&gt;
}}&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 isPostFXEnabled ( string fxType )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required arguments===&lt;br /&gt;
*'''fxType''': An string of the PostFX. Possible values are:&lt;br /&gt;
**'''Gamma'''&lt;br /&gt;
**'''Brightness'''&lt;br /&gt;
**'''Contrast'''&lt;br /&gt;
**'''Saturation'''&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns '''true''' if the selected type is enabled, otherwise '''false'''&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
This example gets whether the gamma PostFX is enabled and displays it in the chat.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
addCommandHandler(&amp;quot;isGammaEnabled&amp;quot;, &lt;br /&gt;
    function()&lt;br /&gt;
        local isEnabled = isPostFXEnabled(&amp;quot;Gamma&amp;quot;)&lt;br /&gt;
        outputChatBox(&amp;quot;Your gamma mode is: &amp;quot;..(isEnabled and &amp;quot;Enabled&amp;quot; or &amp;quot;Disabled&amp;quot;))&lt;br /&gt;
    end, false, false&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Client_PostFX_functions}}&lt;/div&gt;</summary>
		<author><name>O22</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/GetPostFXValue</id>
		<title>GetPostFXValue</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/GetPostFXValue"/>
		<updated>2025-12-03T11:06:32Z</updated>

		<summary type="html">&lt;p&gt;O22: Created page with &amp;quot;__NOTOC__  {{Client function}} {{New feature/item|3.0161|1.6|23644| Gets the current float value of the selected PostFX type. }}  ==Syntax==  &amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt; float getPostFXValue ( string fxType ) &amp;lt;/syntaxhighlight&amp;gt;  ===Required arguments=== *'''fxType''': An string of the PostFX. Possible values are: **'''Gamma''' **'''Brightness''' **'''Contrast''' **'''Saturation'''  ===Returns=== Returns the current value of the specified PostFX parameter.  ==Example== T...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{New feature/item|3.0161|1.6|23644|&lt;br /&gt;
Gets the current float value of the selected PostFX type.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Syntax== &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
float getPostFXValue ( string fxType )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required arguments===&lt;br /&gt;
*'''fxType''': An string of the PostFX. Possible values are:&lt;br /&gt;
**'''Gamma'''&lt;br /&gt;
**'''Brightness'''&lt;br /&gt;
**'''Contrast'''&lt;br /&gt;
**'''Saturation'''&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns the current value of the specified PostFX parameter.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
This example gets the current gamma PostFX value and display it in the chat.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
addCommandHandler(&amp;quot;getGammaValue&amp;quot;, &lt;br /&gt;
    function()&lt;br /&gt;
        local gammaValue = getPostFXValue(&amp;quot;Gamma&amp;quot;)&lt;br /&gt;
        outputChatBox(&amp;quot;Your gamma value is: &amp;quot;..tostring(gammaValue))&lt;br /&gt;
    end, false, false&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Client_PostFX_functions}}&lt;/div&gt;</summary>
		<author><name>O22</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/GetPostFXMode</id>
		<title>GetPostFXMode</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/GetPostFXMode"/>
		<updated>2025-12-03T11:05:40Z</updated>

		<summary type="html">&lt;p&gt;O22: Created page with &amp;quot;__NOTOC__  {{Client function}} {{New feature/item|3.0161|1.6|23644| Gets the current mode of PostFX. }}  ==Syntax==  &amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt; int getPostFXMode ( ) &amp;lt;/syntaxhighlight&amp;gt;  ===Returns=== An integer for the current PostFX mode: * 0: Disabled * 1: Enabled in fullscreen mode * 2: Enabled in windowed/borderless mode  ==Example== This example gets the current PostFX mode and displays it in the chat. &amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt; local modes = {     [0] = &amp;quot;Disabl...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{New feature/item|3.0161|1.6|23644|&lt;br /&gt;
Gets the current mode of PostFX.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Syntax== &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
int getPostFXMode ( )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
An integer for the current PostFX mode:&lt;br /&gt;
* 0: Disabled&lt;br /&gt;
* 1: Enabled in fullscreen mode&lt;br /&gt;
* 2: Enabled in windowed/borderless mode&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
This example gets the current PostFX mode and displays it in the chat.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local modes = {&lt;br /&gt;
    [0] = &amp;quot;Disabled&amp;quot;,&lt;br /&gt;
    [1] = &amp;quot;Enabled in fullscreen mode&amp;quot;,&lt;br /&gt;
    [2] = &amp;quot;Enabled in windowed/borderless mode&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
addCommandHandler(&amp;quot;getMyMode&amp;quot;, &lt;br /&gt;
    function()&lt;br /&gt;
        local currentMode = getPostFXMode()&lt;br /&gt;
        outputChatBox(&amp;quot;Your PostFX mode is: &amp;quot;..modes[currentMode])&lt;br /&gt;
    end, false, false&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Client_PostFX_functions}}&lt;/div&gt;</summary>
		<author><name>O22</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/IsPlayerNameRandomized</id>
		<title>IsPlayerNameRandomized</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/IsPlayerNameRandomized"/>
		<updated>2025-12-01T19:04:39Z</updated>

		<summary type="html">&lt;p&gt;O22: Created page with &amp;quot;{{Useful Function}} __NOTOC__ Checks whether the given player name looks like an automatically-generated random nickname.  ==Syntax== &amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;bool isPlayerNameRandomized ( string name )&amp;lt;/syntaxhighlight&amp;gt;  ===Required Arguments=== * '''name''': The player name to check.  ===Returns=== Returns '''true''' if the given name is an auto-generated random nickname, or '''false''' otherwise.  ==Code== &amp;lt;section name=&amp;quot;Shared&amp;quot; class=&amp;quot;both&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt; &amp;lt;syntaxhig...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Useful Function}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
Checks whether the given player name looks like an automatically-generated random nickname.&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;bool isPlayerNameRandomized ( string name )&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''name''': The player name to check.&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns '''true''' if the given name is an auto-generated random nickname, or '''false''' otherwise.&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Shared&amp;quot; class=&amp;quot;both&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;
local firstName, secondName = {&lt;br /&gt;
    &amp;quot;Aback&amp;quot;,      &amp;quot;Abaft&amp;quot;,      &amp;quot;Abandoned&amp;quot;,  &amp;quot;Abashed&amp;quot;,    &amp;quot;Aberrant&amp;quot;,   &amp;quot;Abhorrent&amp;quot;,  &amp;quot;Abiding&amp;quot;,    &amp;quot;Abject&amp;quot;,     &amp;quot;Ablaze&amp;quot;,     &amp;quot;Able&amp;quot;,       &amp;quot;Abnormal&amp;quot;,&lt;br /&gt;
    &amp;quot;Aboard&amp;quot;,     &amp;quot;Aboriginal&amp;quot;, &amp;quot;Abortive&amp;quot;,   &amp;quot;Abounding&amp;quot;,  &amp;quot;Abrasive&amp;quot;,   &amp;quot;Abrupt&amp;quot;,     &amp;quot;Absent&amp;quot;,     &amp;quot;Absorbed&amp;quot;,   &amp;quot;Absorbing&amp;quot;,  &amp;quot;Abstracted&amp;quot;, &amp;quot;Absurd&amp;quot;,&lt;br /&gt;
    &amp;quot;Abundant&amp;quot;,   &amp;quot;Abusive&amp;quot;,    &amp;quot;Acceptable&amp;quot;, &amp;quot;Accessible&amp;quot;, &amp;quot;Accidental&amp;quot;, &amp;quot;Accurate&amp;quot;,   &amp;quot;Acid&amp;quot;,       &amp;quot;Acidic&amp;quot;,     &amp;quot;Acoustic&amp;quot;,   &amp;quot;Acrid&amp;quot;,      &amp;quot;Actually&amp;quot;,&lt;br /&gt;
    &amp;quot;Adhoc&amp;quot;,      &amp;quot;Adamant&amp;quot;,    &amp;quot;Adaptable&amp;quot;,  &amp;quot;Addicted&amp;quot;,   &amp;quot;Adhesive&amp;quot;,   &amp;quot;Adjoining&amp;quot;,  &amp;quot;Adorable&amp;quot;,   &amp;quot;Afraid&amp;quot;,     &amp;quot;Aggressive&amp;quot;, &amp;quot;Agonizing&amp;quot;,  &amp;quot;Agreeable&amp;quot;,&lt;br /&gt;
    &amp;quot;Ahead&amp;quot;,      &amp;quot;Ajar&amp;quot;,       &amp;quot;Alcoholic&amp;quot;,  &amp;quot;Alert&amp;quot;,      &amp;quot;Alike&amp;quot;,      &amp;quot;Alive&amp;quot;,      &amp;quot;Alleged&amp;quot;,    &amp;quot;Alluring&amp;quot;,   &amp;quot;Aloof&amp;quot;,      &amp;quot;Amazing&amp;quot;,    &amp;quot;Ambiguous&amp;quot;,&lt;br /&gt;
    &amp;quot;Ambitious&amp;quot;,  &amp;quot;Amuck&amp;quot;,      &amp;quot;Amused&amp;quot;,     &amp;quot;Amusing&amp;quot;,    &amp;quot;Ancient&amp;quot;,    &amp;quot;Angry&amp;quot;,      &amp;quot;Animated&amp;quot;,   &amp;quot;Annoyed&amp;quot;,    &amp;quot;Annoying&amp;quot;,   &amp;quot;Anxious&amp;quot;,    &amp;quot;Apathetic&amp;quot;,&lt;br /&gt;
    &amp;quot;Aquatic&amp;quot;,    &amp;quot;Aromatic&amp;quot;,   &amp;quot;Arrogant&amp;quot;,   &amp;quot;Ashamed&amp;quot;,    &amp;quot;Aspiring&amp;quot;,   &amp;quot;Assorted&amp;quot;,   &amp;quot;Attractive&amp;quot;, &amp;quot;Auspicious&amp;quot;, &amp;quot;Automatic&amp;quot;,  &amp;quot;Available&amp;quot;,  &amp;quot;Average&amp;quot;,&lt;br /&gt;
    &amp;quot;Awake&amp;quot;,      &amp;quot;Aware&amp;quot;,      &amp;quot;Awesome&amp;quot;,    &amp;quot;Awful&amp;quot;,      &amp;quot;Axiomatic&amp;quot;,  &amp;quot;Bad&amp;quot;,        &amp;quot;Barbarous&amp;quot;,  &amp;quot;Bashful&amp;quot;,    &amp;quot;Bawdy&amp;quot;,      &amp;quot;Beautiful&amp;quot;,  &amp;quot;Befitting&amp;quot;,&lt;br /&gt;
    &amp;quot;Beneficial&amp;quot;, &amp;quot;Bent&amp;quot;,       &amp;quot;Berserk&amp;quot;,    &amp;quot;Best&amp;quot;,       &amp;quot;Better&amp;quot;,     &amp;quot;Bewildered&amp;quot;, &amp;quot;Big&amp;quot;,        &amp;quot;Billowy&amp;quot;,    &amp;quot;Bite-sized&amp;quot;, &amp;quot;Bitter&amp;quot;,     &amp;quot;Bizarre&amp;quot;,&lt;br /&gt;
    &amp;quot;Black&amp;quot;,      &amp;quot;Bloody&amp;quot;,     &amp;quot;Blue&amp;quot;,       &amp;quot;Blue-eyed&amp;quot;,  &amp;quot;Blushing&amp;quot;,   &amp;quot;Boiling&amp;quot;,    &amp;quot;Boorish&amp;quot;,    &amp;quot;Bored&amp;quot;,      &amp;quot;Boring&amp;quot;,     &amp;quot;Bouncy&amp;quot;,     &amp;quot;Boundless&amp;quot;,&lt;br /&gt;
    &amp;quot;Brainy&amp;quot;,     &amp;quot;Brash&amp;quot;,      &amp;quot;Brave&amp;quot;,      &amp;quot;Brawny&amp;quot;,     &amp;quot;Breakable&amp;quot;,  &amp;quot;Breezy&amp;quot;,     &amp;quot;Brief&amp;quot;,      &amp;quot;Bright&amp;quot;,     &amp;quot;Broad&amp;quot;,      &amp;quot;Broken&amp;quot;,     &amp;quot;Brown&amp;quot;,&lt;br /&gt;
    &amp;quot;Bumpy&amp;quot;,      &amp;quot;Burly&amp;quot;,      &amp;quot;Bustling&amp;quot;,   &amp;quot;Busy&amp;quot;,       &amp;quot;Cagey&amp;quot;,      &amp;quot;Callous&amp;quot;,    &amp;quot;Calm&amp;quot;,       &amp;quot;Capable&amp;quot;,    &amp;quot;Capricious&amp;quot;, &amp;quot;Careful&amp;quot;,    &amp;quot;Careless&amp;quot;,&lt;br /&gt;
    &amp;quot;Caring&amp;quot;,     &amp;quot;Cautious&amp;quot;,   &amp;quot;Ceaseless&amp;quot;,  &amp;quot;Certain&amp;quot;,    &amp;quot;Changeable&amp;quot;, &amp;quot;Charming&amp;quot;,   &amp;quot;Cheap&amp;quot;,      &amp;quot;Cheerful&amp;quot;,   &amp;quot;Chemical&amp;quot;,   &amp;quot;Chief&amp;quot;,      &amp;quot;Childlike&amp;quot;,&lt;br /&gt;
    &amp;quot;Chilly&amp;quot;,     &amp;quot;Chivalrous&amp;quot;, &amp;quot;Chubby&amp;quot;,     &amp;quot;Chunky&amp;quot;,     &amp;quot;Clammy&amp;quot;,     &amp;quot;Classy&amp;quot;,     &amp;quot;Clean&amp;quot;,      &amp;quot;Clear&amp;quot;,      &amp;quot;Clever&amp;quot;,     &amp;quot;Cloistered&amp;quot;, &amp;quot;Cloudy&amp;quot;,&lt;br /&gt;
    &amp;quot;Closed&amp;quot;,     &amp;quot;Clumsy&amp;quot;,     &amp;quot;Cluttered&amp;quot;,  &amp;quot;Coherent&amp;quot;,   &amp;quot;Cold&amp;quot;,       &amp;quot;Colorful&amp;quot;,   &amp;quot;Colossal&amp;quot;,   &amp;quot;Combative&amp;quot;,  &amp;quot;Common&amp;quot;,     &amp;quot;Complete&amp;quot;,   &amp;quot;Complex&amp;quot;,&lt;br /&gt;
    &amp;quot;Concerned&amp;quot;,  &amp;quot;Condemned&amp;quot;,  &amp;quot;Confused&amp;quot;,   &amp;quot;Conscious&amp;quot;,  &amp;quot;Cooing&amp;quot;,     &amp;quot;Cool&amp;quot;,       &amp;quot;Courageous&amp;quot;, &amp;quot;Cowardly&amp;quot;,   &amp;quot;Crabby&amp;quot;,     &amp;quot;Craven&amp;quot;,     &amp;quot;Crazy&amp;quot;,&lt;br /&gt;
    &amp;quot;Creepy&amp;quot;,     &amp;quot;Crooked&amp;quot;,    &amp;quot;Crowded&amp;quot;,    &amp;quot;Cruel&amp;quot;,      &amp;quot;Cuddly&amp;quot;,     &amp;quot;Cultured&amp;quot;,   &amp;quot;Cumbersome&amp;quot;, &amp;quot;Curious&amp;quot;,    &amp;quot;Curly&amp;quot;,      &amp;quot;Curved&amp;quot;,     &amp;quot;Curvy&amp;quot;,&lt;br /&gt;
    &amp;quot;Cut&amp;quot;,        &amp;quot;Cute&amp;quot;,       &amp;quot;Cynical&amp;quot;,    &amp;quot;Daffy&amp;quot;,      &amp;quot;Daily&amp;quot;,      &amp;quot;Damaged&amp;quot;,    &amp;quot;Damaging&amp;quot;,   &amp;quot;Damp&amp;quot;,       &amp;quot;Dangerous&amp;quot;,  &amp;quot;Dapper&amp;quot;,     &amp;quot;Dark&amp;quot;,&lt;br /&gt;
    &amp;quot;Dashing&amp;quot;,    &amp;quot;Dazzling&amp;quot;,   &amp;quot;Dead&amp;quot;,       &amp;quot;Deadpan&amp;quot;,    &amp;quot;Deafening&amp;quot;,  &amp;quot;Dear&amp;quot;,       &amp;quot;Debonair&amp;quot;,   &amp;quot;Decisive&amp;quot;,   &amp;quot;Decorous&amp;quot;,   &amp;quot;Deep&amp;quot;,       &amp;quot;Deeply&amp;quot;,&lt;br /&gt;
    &amp;quot;Defeated&amp;quot;,   &amp;quot;Defective&amp;quot;,  &amp;quot;Defiant&amp;quot;,    &amp;quot;Delicate&amp;quot;,   &amp;quot;Delicious&amp;quot;,  &amp;quot;Delightful&amp;quot;, &amp;quot;Demonic&amp;quot;,    &amp;quot;Delirious&amp;quot;,  &amp;quot;Dependent&amp;quot;,  &amp;quot;Depressed&amp;quot;,  &amp;quot;Deranged&amp;quot;,&lt;br /&gt;
    &amp;quot;Deserted&amp;quot;,   &amp;quot;Detailed&amp;quot;,   &amp;quot;Determined&amp;quot;, &amp;quot;Devilish&amp;quot;,   &amp;quot;Didactic&amp;quot;,   &amp;quot;Different&amp;quot;,  &amp;quot;Difficult&amp;quot;,  &amp;quot;Diligent&amp;quot;,   &amp;quot;Direful&amp;quot;,    &amp;quot;Dirty&amp;quot;,      &amp;quot;Disastrous&amp;quot;,&lt;br /&gt;
    &amp;quot;Discreet&amp;quot;,   &amp;quot;Disgusted&amp;quot;,  &amp;quot;Disgusting&amp;quot;, &amp;quot;Distinct&amp;quot;,   &amp;quot;Disturbed&amp;quot;,  &amp;quot;Divergent&amp;quot;,  &amp;quot;Dizzy&amp;quot;,      &amp;quot;Doubtful&amp;quot;,   &amp;quot;Drab&amp;quot;,       &amp;quot;Draconian&amp;quot;,  &amp;quot;Dramatic&amp;quot;,&lt;br /&gt;
    &amp;quot;Dreary&amp;quot;,     &amp;quot;Drunk&amp;quot;,      &amp;quot;Dry&amp;quot;,        &amp;quot;Dull&amp;quot;,       &amp;quot;Dusty&amp;quot;,      &amp;quot;Dynamic&amp;quot;,    &amp;quot;Eager&amp;quot;,      &amp;quot;Early&amp;quot;,      &amp;quot;Earthy&amp;quot;,     &amp;quot;Easy&amp;quot;,       &amp;quot;Eatable&amp;quot;,&lt;br /&gt;
    &amp;quot;Economic&amp;quot;,   &amp;quot;Educated&amp;quot;,   &amp;quot;Efficient&amp;quot;,  &amp;quot;Eight&amp;quot;,      &amp;quot;Elastic&amp;quot;,    &amp;quot;Elated&amp;quot;,     &amp;quot;Elderly&amp;quot;,    &amp;quot;Electric&amp;quot;,   &amp;quot;Elegant&amp;quot;,    &amp;quot;Elfin&amp;quot;,      &amp;quot;Elite&amp;quot;,&lt;br /&gt;
    &amp;quot;Eminent&amp;quot;,    &amp;quot;Empty&amp;quot;,      &amp;quot;Enchanted&amp;quot;,  &amp;quot;Enchanting&amp;quot;, &amp;quot;Endurable&amp;quot;,  &amp;quot;Energetic&amp;quot;,  &amp;quot;Enormous&amp;quot;,   &amp;quot;Envious&amp;quot;,    &amp;quot;Equable&amp;quot;,    &amp;quot;Equal&amp;quot;,      &amp;quot;Erect&amp;quot;,&lt;br /&gt;
    &amp;quot;Erratic&amp;quot;,    &amp;quot;Ethereal&amp;quot;,   &amp;quot;Evanescent&amp;quot;, &amp;quot;Evasive&amp;quot;,    &amp;quot;Even&amp;quot;,       &amp;quot;Excellent&amp;quot;,  &amp;quot;Excited&amp;quot;,    &amp;quot;Exciting&amp;quot;,   &amp;quot;Exclusive&amp;quot;,  &amp;quot;Exotic&amp;quot;,     &amp;quot;Expensive&amp;quot;,&lt;br /&gt;
    &amp;quot;Exuberant&amp;quot;,  &amp;quot;Exultant&amp;quot;,   &amp;quot;Fabulous&amp;quot;,   &amp;quot;Faded&amp;quot;,      &amp;quot;Faint&amp;quot;,      &amp;quot;Fair&amp;quot;,       &amp;quot;Faithful&amp;quot;,   &amp;quot;Fallacious&amp;quot;, &amp;quot;False&amp;quot;,      &amp;quot;Familiar&amp;quot;,   &amp;quot;Famous&amp;quot;,&lt;br /&gt;
    &amp;quot;Fanatical&amp;quot;,  &amp;quot;Fancy&amp;quot;,      &amp;quot;Fantastic&amp;quot;,  &amp;quot;Far&amp;quot;,        &amp;quot;Far-flung&amp;quot;,  &amp;quot;Fascinated&amp;quot;, &amp;quot;Fast&amp;quot;,       &amp;quot;Fat&amp;quot;,        &amp;quot;Faulty&amp;quot;,     &amp;quot;Fearful&amp;quot;,    &amp;quot;Fearless&amp;quot;,&lt;br /&gt;
    &amp;quot;Feeble&amp;quot;,     &amp;quot;Feigned&amp;quot;,    &amp;quot;Female&amp;quot;,     &amp;quot;Fertile&amp;quot;,    &amp;quot;Festive&amp;quot;,    &amp;quot;Few&amp;quot;,        &amp;quot;Fierce&amp;quot;,     &amp;quot;Filthy&amp;quot;,     &amp;quot;Fine&amp;quot;,       &amp;quot;Finicky&amp;quot;,    &amp;quot;First&amp;quot;,&lt;br /&gt;
    &amp;quot;Five&amp;quot;,       &amp;quot;Fixed&amp;quot;,      &amp;quot;Flagrant&amp;quot;,   &amp;quot;Flaky&amp;quot;,      &amp;quot;Flashy&amp;quot;,     &amp;quot;Flat&amp;quot;,       &amp;quot;Flawless&amp;quot;,   &amp;quot;Flimsy&amp;quot;,     &amp;quot;Flippant&amp;quot;,   &amp;quot;Flowery&amp;quot;,    &amp;quot;Fluffy&amp;quot;,&lt;br /&gt;
    &amp;quot;Fluttering&amp;quot;, &amp;quot;Foamy&amp;quot;,      &amp;quot;Foolish&amp;quot;,    &amp;quot;Foregoing&amp;quot;,  &amp;quot;Forgetful&amp;quot;,  &amp;quot;Fortunate&amp;quot;,  &amp;quot;Four&amp;quot;,       &amp;quot;Frail&amp;quot;,      &amp;quot;Fragile&amp;quot;,    &amp;quot;Frantic&amp;quot;,    &amp;quot;Free&amp;quot;,&lt;br /&gt;
    &amp;quot;Freezing&amp;quot;,   &amp;quot;Frequent&amp;quot;,   &amp;quot;Fresh&amp;quot;,      &amp;quot;Fretful&amp;quot;,    &amp;quot;Friendly&amp;quot;,   &amp;quot;Frightened&amp;quot;, &amp;quot;Full&amp;quot;,       &amp;quot;Fumbling&amp;quot;,   &amp;quot;Functional&amp;quot;, &amp;quot;Funny&amp;quot;,      &amp;quot;Furry&amp;quot;,&lt;br /&gt;
    &amp;quot;Furtive&amp;quot;,    &amp;quot;Future&amp;quot;,     &amp;quot;Futuristic&amp;quot;, &amp;quot;Fuzzy&amp;quot;,      &amp;quot;Gabby&amp;quot;,      &amp;quot;Gainful&amp;quot;,    &amp;quot;Gamy&amp;quot;,       &amp;quot;Gaping&amp;quot;,     &amp;quot;Garrulous&amp;quot;,  &amp;quot;Gaudy&amp;quot;,      &amp;quot;General&amp;quot;,&lt;br /&gt;
    &amp;quot;Gentle&amp;quot;,     &amp;quot;Giant&amp;quot;,      &amp;quot;Giddy&amp;quot;,      &amp;quot;Gifted&amp;quot;,     &amp;quot;Gigantic&amp;quot;,   &amp;quot;Glamorous&amp;quot;,  &amp;quot;Gleaming&amp;quot;,   &amp;quot;Glib&amp;quot;,       &amp;quot;Glistening&amp;quot;, &amp;quot;Glorious&amp;quot;,   &amp;quot;Glossy&amp;quot;,&lt;br /&gt;
    &amp;quot;Godly&amp;quot;,      &amp;quot;Good&amp;quot;,       &amp;quot;Goofy&amp;quot;,      &amp;quot;Gorgeous&amp;quot;,   &amp;quot;Graceful&amp;quot;,   &amp;quot;Grandiose&amp;quot;,  &amp;quot;Grateful&amp;quot;,   &amp;quot;Gratis&amp;quot;,     &amp;quot;Gray&amp;quot;,       &amp;quot;Greasy&amp;quot;,     &amp;quot;Great&amp;quot;,&lt;br /&gt;
    &amp;quot;Greedy&amp;quot;,     &amp;quot;Green&amp;quot;,      &amp;quot;Grey&amp;quot;,       &amp;quot;Grieving&amp;quot;,   &amp;quot;Groovy&amp;quot;,     &amp;quot;Grotesque&amp;quot;,  &amp;quot;Grouchy&amp;quot;,    &amp;quot;Grubby&amp;quot;,     &amp;quot;Gruesome&amp;quot;,   &amp;quot;Grumpy&amp;quot;,     &amp;quot;Guarded&amp;quot;,&lt;br /&gt;
    &amp;quot;Guiltless&amp;quot;,  &amp;quot;Gullible&amp;quot;,   &amp;quot;Gusty&amp;quot;,      &amp;quot;Guttural&amp;quot;,   &amp;quot;Habitual&amp;quot;,   &amp;quot;Half&amp;quot;,       &amp;quot;Hallowed&amp;quot;,   &amp;quot;Halting&amp;quot;,    &amp;quot;Handsome&amp;quot;,   &amp;quot;Handsomely&amp;quot;, &amp;quot;Handy&amp;quot;,&lt;br /&gt;
    &amp;quot;Hanging&amp;quot;,    &amp;quot;Hapless&amp;quot;,    &amp;quot;Happy&amp;quot;,      &amp;quot;Hard&amp;quot;,       &amp;quot;Harmonious&amp;quot;, &amp;quot;Harsh&amp;quot;,      &amp;quot;Hateful&amp;quot;,    &amp;quot;Heady&amp;quot;,      &amp;quot;Healthy&amp;quot;,    &amp;quot;Heavenly&amp;quot;,   &amp;quot;Heavy&amp;quot;,&lt;br /&gt;
    &amp;quot;Hellish&amp;quot;,    &amp;quot;Helpful&amp;quot;,    &amp;quot;Helpless&amp;quot;,   &amp;quot;Hesitant&amp;quot;,   &amp;quot;Hideous&amp;quot;,    &amp;quot;High&amp;quot;,       &amp;quot;Hilarious&amp;quot;,  &amp;quot;Hissing&amp;quot;,    &amp;quot;Historical&amp;quot;, &amp;quot;Holistic&amp;quot;,   &amp;quot;Hollow&amp;quot;,&lt;br /&gt;
    &amp;quot;Homeless&amp;quot;,   &amp;quot;Homely&amp;quot;,     &amp;quot;Honorable&amp;quot;,  &amp;quot;Horrible&amp;quot;,   &amp;quot;Hospitable&amp;quot;, &amp;quot;Hot&amp;quot;,        &amp;quot;Huge&amp;quot;,       &amp;quot;Hulking&amp;quot;,    &amp;quot;Humdrum&amp;quot;,    &amp;quot;Humorous&amp;quot;,   &amp;quot;Hungry&amp;quot;,&lt;br /&gt;
    &amp;quot;Hurried&amp;quot;,    &amp;quot;Hurt&amp;quot;,       &amp;quot;Hushed&amp;quot;,     &amp;quot;Husky&amp;quot;,      &amp;quot;Hypnotic&amp;quot;,   &amp;quot;Hysterical&amp;quot;, &amp;quot;Icky&amp;quot;,       &amp;quot;Icy&amp;quot;,        &amp;quot;Idiotic&amp;quot;,    &amp;quot;Ignorant&amp;quot;,   &amp;quot;Ill&amp;quot;,&lt;br /&gt;
    &amp;quot;Illegal&amp;quot;,    &amp;quot;Ill-fated&amp;quot;,  &amp;quot;Imaginary&amp;quot;,  &amp;quot;Immense&amp;quot;,    &amp;quot;Imminent&amp;quot;,   &amp;quot;Impartial&amp;quot;,  &amp;quot;Imperfect&amp;quot;,  &amp;quot;Impolite&amp;quot;,   &amp;quot;Important&amp;quot;,  &amp;quot;Imported&amp;quot;,   &amp;quot;Impossible&amp;quot;,&lt;br /&gt;
    &amp;quot;Incredible&amp;quot;, &amp;quot;Infamous&amp;quot;,   &amp;quot;Innate&amp;quot;,     &amp;quot;Innocent&amp;quot;,   &amp;quot;Insidious&amp;quot;,  &amp;quot;Internal&amp;quot;,   &amp;quot;Invincible&amp;quot;, &amp;quot;Irate&amp;quot;,      &amp;quot;Irritating&amp;quot;, &amp;quot;Itchy&amp;quot;,      &amp;quot;Jaded&amp;quot;,&lt;br /&gt;
    &amp;quot;Jagged&amp;quot;,     &amp;quot;Jazzy&amp;quot;,      &amp;quot;Jealous&amp;quot;,    &amp;quot;Jittery&amp;quot;,    &amp;quot;Jobless&amp;quot;,    &amp;quot;Jolly&amp;quot;,      &amp;quot;Joyous&amp;quot;,     &amp;quot;Judicious&amp;quot;,  &amp;quot;Juicy&amp;quot;,      &amp;quot;Jumbled&amp;quot;,    &amp;quot;Jumpy&amp;quot;,&lt;br /&gt;
    &amp;quot;Juvenile&amp;quot;,   &amp;quot;Kaput&amp;quot;,      &amp;quot;Keen&amp;quot;,       &amp;quot;Kind&amp;quot;,       &amp;quot;Kindly&amp;quot;,     &amp;quot;Knotty&amp;quot;,     &amp;quot;Knowing&amp;quot;,    &amp;quot;Known&amp;quot;,      &amp;quot;Labored&amp;quot;,    &amp;quot;Lacking&amp;quot;,    &amp;quot;Lame&amp;quot;,&lt;br /&gt;
    &amp;quot;Lamentable&amp;quot;, &amp;quot;Languid&amp;quot;,    &amp;quot;Large&amp;quot;,      &amp;quot;Last&amp;quot;,       &amp;quot;Late&amp;quot;,       &amp;quot;Laughable&amp;quot;,  &amp;quot;Lavish&amp;quot;,     &amp;quot;Lazy&amp;quot;,       &amp;quot;Lean&amp;quot;,       &amp;quot;Learned&amp;quot;,    &amp;quot;Left&amp;quot;,&lt;br /&gt;
    &amp;quot;Legal&amp;quot;,      &amp;quot;Lethal&amp;quot;,     &amp;quot;Level&amp;quot;,      &amp;quot;Lewd&amp;quot;,       &amp;quot;Light&amp;quot;,      &amp;quot;Like&amp;quot;,       &amp;quot;Likeable&amp;quot;,   &amp;quot;Limping&amp;quot;,    &amp;quot;Literate&amp;quot;,   &amp;quot;Little&amp;quot;,     &amp;quot;Lively&amp;quot;,&lt;br /&gt;
    &amp;quot;Living&amp;quot;,     &amp;quot;Lonely&amp;quot;,     &amp;quot;Long&amp;quot;,       &amp;quot;Longing&amp;quot;,    &amp;quot;Long-term&amp;quot;,  &amp;quot;Loose&amp;quot;,      &amp;quot;Lopsided&amp;quot;,   &amp;quot;Loud&amp;quot;,       &amp;quot;Loutish&amp;quot;,    &amp;quot;Lovely&amp;quot;,     &amp;quot;Loving&amp;quot;,&lt;br /&gt;
    &amp;quot;Low&amp;quot;,        &amp;quot;Lowly&amp;quot;,      &amp;quot;Lucky&amp;quot;,      &amp;quot;Ludicrous&amp;quot;,  &amp;quot;Lumpy&amp;quot;,      &amp;quot;Lush&amp;quot;,       &amp;quot;Luxuriant&amp;quot;,  &amp;quot;Lying&amp;quot;,      &amp;quot;Lyrical&amp;quot;,    &amp;quot;Macabre&amp;quot;,    &amp;quot;Macho&amp;quot;,&lt;br /&gt;
    &amp;quot;Maddening&amp;quot;,  &amp;quot;Madly&amp;quot;,      &amp;quot;Magenta&amp;quot;,    &amp;quot;Magical&amp;quot;,    &amp;quot;Majestic&amp;quot;,   &amp;quot;Makeshift&amp;quot;,  &amp;quot;Male&amp;quot;,       &amp;quot;Malicious&amp;quot;,  &amp;quot;Mammoth&amp;quot;,    &amp;quot;Maniacal&amp;quot;,   &amp;quot;Many&amp;quot;,&lt;br /&gt;
    &amp;quot;Marked&amp;quot;,     &amp;quot;Massive&amp;quot;,    &amp;quot;Married&amp;quot;,    &amp;quot;Marvelous&amp;quot;,  &amp;quot;Material&amp;quot;,   &amp;quot;Mature&amp;quot;,     &amp;quot;Mean&amp;quot;,       &amp;quot;Measly&amp;quot;,     &amp;quot;Meaty&amp;quot;,      &amp;quot;Medical&amp;quot;,    &amp;quot;Meek&amp;quot;,&lt;br /&gt;
    &amp;quot;Mellow&amp;quot;,     &amp;quot;Melodic&amp;quot;,    &amp;quot;Melted&amp;quot;,     &amp;quot;Merciful&amp;quot;,   &amp;quot;Mere&amp;quot;,       &amp;quot;Messy&amp;quot;,      &amp;quot;Mighty&amp;quot;,     &amp;quot;Military&amp;quot;,   &amp;quot;Milky&amp;quot;,      &amp;quot;Mindless&amp;quot;,   &amp;quot;Miniature&amp;quot;,&lt;br /&gt;
    &amp;quot;Minor&amp;quot;,      &amp;quot;Miscreant&amp;quot;,  &amp;quot;Misty&amp;quot;,      &amp;quot;Mixed&amp;quot;,      &amp;quot;Moaning&amp;quot;,    &amp;quot;Modern&amp;quot;,     &amp;quot;Moldy&amp;quot;,      &amp;quot;Momentous&amp;quot;,  &amp;quot;Motionless&amp;quot;, &amp;quot;Muddled&amp;quot;,    &amp;quot;Mundane&amp;quot;,&lt;br /&gt;
    &amp;quot;Murky&amp;quot;,      &amp;quot;Mushy&amp;quot;,      &amp;quot;Mute&amp;quot;,       &amp;quot;Mysterious&amp;quot;, &amp;quot;Naive&amp;quot;,      &amp;quot;Nappy&amp;quot;,      &amp;quot;Narrow&amp;quot;,     &amp;quot;Nasty&amp;quot;,      &amp;quot;Natural&amp;quot;,    &amp;quot;Naughty&amp;quot;,    &amp;quot;Nauseating&amp;quot;,&lt;br /&gt;
    &amp;quot;Near&amp;quot;,       &amp;quot;Neat&amp;quot;,       &amp;quot;Nebulous&amp;quot;,   &amp;quot;Necessary&amp;quot;,  &amp;quot;Needless&amp;quot;,   &amp;quot;Needy&amp;quot;,      &amp;quot;Neighborly&amp;quot;, &amp;quot;Nervous&amp;quot;,    &amp;quot;New&amp;quot;,        &amp;quot;Next&amp;quot;,       &amp;quot;Nice&amp;quot;,&lt;br /&gt;
    &amp;quot;Nifty&amp;quot;,      &amp;quot;Nimble&amp;quot;,     &amp;quot;Nine&amp;quot;,       &amp;quot;Nippy&amp;quot;,      &amp;quot;Noiseless&amp;quot;,  &amp;quot;Noisy&amp;quot;,      &amp;quot;Nonchalant&amp;quot;, &amp;quot;Nonstop&amp;quot;,    &amp;quot;Normal&amp;quot;,     &amp;quot;Nostalgic&amp;quot;,  &amp;quot;Nosy&amp;quot;,&lt;br /&gt;
    &amp;quot;Noxious&amp;quot;,    &amp;quot;Null&amp;quot;,       &amp;quot;Numberless&amp;quot;, &amp;quot;Numerous&amp;quot;,   &amp;quot;Nutritious&amp;quot;, &amp;quot;Nutty&amp;quot;,      &amp;quot;Oafish&amp;quot;,     &amp;quot;Obedient&amp;quot;,   &amp;quot;Obeisant&amp;quot;,   &amp;quot;Obese&amp;quot;,      &amp;quot;Obnoxious&amp;quot;,&lt;br /&gt;
    &amp;quot;Obscene&amp;quot;,    &amp;quot;Obsequious&amp;quot;, &amp;quot;Observant&amp;quot;,  &amp;quot;Obsolete&amp;quot;,   &amp;quot;Obtainable&amp;quot;, &amp;quot;Oceanic&amp;quot;,    &amp;quot;Odd&amp;quot;,        &amp;quot;Offbeat&amp;quot;,    &amp;quot;Old&amp;quot;,        &amp;quot;Omniscient&amp;quot;, &amp;quot;One&amp;quot;,&lt;br /&gt;
    &amp;quot;Onerous&amp;quot;,    &amp;quot;Open&amp;quot;,       &amp;quot;Opposite&amp;quot;,   &amp;quot;Optimal&amp;quot;,    &amp;quot;Orange&amp;quot;,     &amp;quot;Ordinary&amp;quot;,   &amp;quot;Organic&amp;quot;,    &amp;quot;Ossified&amp;quot;,   &amp;quot;Outgoing&amp;quot;,   &amp;quot;Outrageous&amp;quot;, &amp;quot;Oval&amp;quot;,&lt;br /&gt;
    &amp;quot;Overjoyed&amp;quot;,  &amp;quot;Overrated&amp;quot;,  &amp;quot;Overt&amp;quot;,      &amp;quot;Painful&amp;quot;,    &amp;quot;Pale&amp;quot;,       &amp;quot;Paltry&amp;quot;,     &amp;quot;Panicky&amp;quot;,    &amp;quot;Panoramic&amp;quot;,  &amp;quot;Parallel&amp;quot;,   &amp;quot;Parched&amp;quot;,    &amp;quot;Past&amp;quot;,&lt;br /&gt;
    &amp;quot;Pastoral&amp;quot;,   &amp;quot;Pathetic&amp;quot;,   &amp;quot;Peaceful&amp;quot;,   &amp;quot;Penitent&amp;quot;,   &amp;quot;Perfect&amp;quot;,    &amp;quot;Periodic&amp;quot;,   &amp;quot;Perpetual&amp;quot;,  &amp;quot;Petite&amp;quot;,     &amp;quot;Phobic&amp;quot;,     &amp;quot;Physical&amp;quot;,   &amp;quot;Picayune&amp;quot;,&lt;br /&gt;
    &amp;quot;Pink&amp;quot;,       &amp;quot;Piquant&amp;quot;,    &amp;quot;Placid&amp;quot;,     &amp;quot;Plain&amp;quot;,      &amp;quot;Plant&amp;quot;,      &amp;quot;Plastic&amp;quot;,    &amp;quot;Plausible&amp;quot;,  &amp;quot;Pleasant&amp;quot;,   &amp;quot;Plucky&amp;quot;,     &amp;quot;Pointless&amp;quot;,  &amp;quot;Poised&amp;quot;,&lt;br /&gt;
    &amp;quot;Polite&amp;quot;,     &amp;quot;Political&amp;quot;,  &amp;quot;Poor&amp;quot;,       &amp;quot;Possessive&amp;quot;, &amp;quot;Possible&amp;quot;,   &amp;quot;Powerful&amp;quot;,   &amp;quot;Precious&amp;quot;,   &amp;quot;Premium&amp;quot;,    &amp;quot;Present&amp;quot;,    &amp;quot;Pretty&amp;quot;,     &amp;quot;Previous&amp;quot;,&lt;br /&gt;
    &amp;quot;Pricey&amp;quot;,     &amp;quot;Prickly&amp;quot;,    &amp;quot;Private&amp;quot;,    &amp;quot;Probable&amp;quot;,   &amp;quot;Productive&amp;quot;, &amp;quot;Profuse&amp;quot;,    &amp;quot;Protective&amp;quot;, &amp;quot;Proud&amp;quot;,      &amp;quot;Psychotic&amp;quot;,  &amp;quot;Public&amp;quot;,     &amp;quot;Puffy&amp;quot;,&lt;br /&gt;
    &amp;quot;Pumped&amp;quot;,     &amp;quot;Puny&amp;quot;,       &amp;quot;Purple&amp;quot;,     &amp;quot;Purring&amp;quot;,    &amp;quot;Pushy&amp;quot;,      &amp;quot;Puzzled&amp;quot;,    &amp;quot;Puzzling&amp;quot;,   &amp;quot;Quack&amp;quot;,      &amp;quot;Quaint&amp;quot;,     &amp;quot;Quick&amp;quot;,      &amp;quot;Quickest&amp;quot;,&lt;br /&gt;
    &amp;quot;Quiet&amp;quot;,      &amp;quot;Quirky&amp;quot;,     &amp;quot;Quixotic&amp;quot;,   &amp;quot;Quizzical&amp;quot;,  &amp;quot;Rabid&amp;quot;,      &amp;quot;Racial&amp;quot;,     &amp;quot;Ragged&amp;quot;,     &amp;quot;Rainy&amp;quot;,      &amp;quot;Rampant&amp;quot;,    &amp;quot;Rapid&amp;quot;,      &amp;quot;Rare&amp;quot;,&lt;br /&gt;
    &amp;quot;Raspy&amp;quot;,      &amp;quot;Ratty&amp;quot;,      &amp;quot;Ready&amp;quot;,      &amp;quot;Real&amp;quot;,       &amp;quot;Rebel&amp;quot;,      &amp;quot;Receptive&amp;quot;,  &amp;quot;Recondite&amp;quot;,  &amp;quot;Red&amp;quot;,        &amp;quot;Redundant&amp;quot;,  &amp;quot;Reflective&amp;quot;, &amp;quot;Regular&amp;quot;,&lt;br /&gt;
    &amp;quot;Relieved&amp;quot;,   &amp;quot;Remarkable&amp;quot;, &amp;quot;Repulsive&amp;quot;,  &amp;quot;Resolute&amp;quot;,   &amp;quot;Resonant&amp;quot;,   &amp;quot;Rhetorical&amp;quot;, &amp;quot;Rich&amp;quot;,       &amp;quot;Right&amp;quot;,      &amp;quot;Righteous&amp;quot;,  &amp;quot;Rightful&amp;quot;,   &amp;quot;Rigid&amp;quot;,&lt;br /&gt;
    &amp;quot;Ripe&amp;quot;,       &amp;quot;Ritzy&amp;quot;,      &amp;quot;Roasted&amp;quot;,    &amp;quot;Robust&amp;quot;,     &amp;quot;Romantic&amp;quot;,   &amp;quot;Roomy&amp;quot;,      &amp;quot;Rotten&amp;quot;,     &amp;quot;Rough&amp;quot;,      &amp;quot;Round&amp;quot;,      &amp;quot;Royal&amp;quot;,      &amp;quot;Ruddy&amp;quot;,&lt;br /&gt;
    &amp;quot;Rude&amp;quot;,       &amp;quot;Rural&amp;quot;,      &amp;quot;Rustic&amp;quot;,     &amp;quot;Ruthless&amp;quot;,   &amp;quot;Sable&amp;quot;,      &amp;quot;Sad&amp;quot;,        &amp;quot;Safe&amp;quot;,       &amp;quot;Salty&amp;quot;,      &amp;quot;Same&amp;quot;,       &amp;quot;Sassy&amp;quot;,      &amp;quot;Satisfying&amp;quot;,&lt;br /&gt;
    &amp;quot;Savory&amp;quot;,     &amp;quot;Scandalous&amp;quot;, &amp;quot;Scarce&amp;quot;,     &amp;quot;Scared&amp;quot;,     &amp;quot;Scary&amp;quot;,      &amp;quot;Scattered&amp;quot;,  &amp;quot;Scientific&amp;quot;, &amp;quot;Scrawny&amp;quot;,    &amp;quot;Screeching&amp;quot;, &amp;quot;Second&amp;quot;,     &amp;quot;Secret&amp;quot;,&lt;br /&gt;
    &amp;quot;Secretive&amp;quot;,  &amp;quot;Sedate&amp;quot;,     &amp;quot;Seemly&amp;quot;,     &amp;quot;Selective&amp;quot;,  &amp;quot;Selfish&amp;quot;,    &amp;quot;Separate&amp;quot;,   &amp;quot;Serious&amp;quot;,    &amp;quot;Shaggy&amp;quot;,     &amp;quot;Shaky&amp;quot;,      &amp;quot;Shallow&amp;quot;,    &amp;quot;Sharp&amp;quot;,&lt;br /&gt;
    &amp;quot;Shiny&amp;quot;,      &amp;quot;Shivering&amp;quot;,  &amp;quot;Shocking&amp;quot;,   &amp;quot;Short&amp;quot;,      &amp;quot;Shrill&amp;quot;,     &amp;quot;Shut&amp;quot;,       &amp;quot;Shy&amp;quot;,        &amp;quot;Sick&amp;quot;,       &amp;quot;Silent&amp;quot;,     &amp;quot;Silky&amp;quot;,      &amp;quot;Silly&amp;quot;,&lt;br /&gt;
    &amp;quot;Simple&amp;quot;,     &amp;quot;Simplistic&amp;quot;, &amp;quot;Sincere&amp;quot;,    &amp;quot;Six&amp;quot;,        &amp;quot;Skillful&amp;quot;,   &amp;quot;Skinny&amp;quot;,     &amp;quot;Sleepy&amp;quot;,     &amp;quot;Slim&amp;quot;,       &amp;quot;Slimy&amp;quot;,      &amp;quot;Slippery&amp;quot;,   &amp;quot;Sloppy&amp;quot;,&lt;br /&gt;
    &amp;quot;Slow&amp;quot;,       &amp;quot;Small&amp;quot;,      &amp;quot;Smart&amp;quot;,      &amp;quot;Smelly&amp;quot;,     &amp;quot;Smiling&amp;quot;,    &amp;quot;Smoggy&amp;quot;,     &amp;quot;Smooth&amp;quot;,     &amp;quot;Sneaky&amp;quot;,     &amp;quot;Snobbish&amp;quot;,   &amp;quot;Snotty&amp;quot;,     &amp;quot;Soft&amp;quot;,&lt;br /&gt;
    &amp;quot;Soggy&amp;quot;,      &amp;quot;Solid&amp;quot;,      &amp;quot;Somber&amp;quot;,     &amp;quot;Sordid&amp;quot;,     &amp;quot;Sore&amp;quot;,       &amp;quot;Sour&amp;quot;,       &amp;quot;Sparkling&amp;quot;,  &amp;quot;Special&amp;quot;,    &amp;quot;Spicy&amp;quot;,      &amp;quot;Spiffy&amp;quot;,     &amp;quot;Spiky&amp;quot;,&lt;br /&gt;
    &amp;quot;Spiritual&amp;quot;,  &amp;quot;Spiteful&amp;quot;,   &amp;quot;Splendid&amp;quot;,   &amp;quot;Spooky&amp;quot;,     &amp;quot;Spotless&amp;quot;,   &amp;quot;Spotted&amp;quot;,    &amp;quot;Spotty&amp;quot;,     &amp;quot;Spurious&amp;quot;,   &amp;quot;Squalid&amp;quot;,    &amp;quot;Square&amp;quot;,     &amp;quot;Squealing&amp;quot;,&lt;br /&gt;
    &amp;quot;Squeamish&amp;quot;,  &amp;quot;Staking&amp;quot;,    &amp;quot;Stale&amp;quot;,      &amp;quot;Standing&amp;quot;,   &amp;quot;Statuesque&amp;quot;, &amp;quot;Steadfast&amp;quot;,  &amp;quot;Steady&amp;quot;,     &amp;quot;Stealthy&amp;quot;,   &amp;quot;Steep&amp;quot;,      &amp;quot;Sticky&amp;quot;,     &amp;quot;Stiff&amp;quot;,&lt;br /&gt;
    &amp;quot;Stingy&amp;quot;,     &amp;quot;Stormy&amp;quot;,     &amp;quot;Straight&amp;quot;,   &amp;quot;Strange&amp;quot;,    &amp;quot;Striped&amp;quot;,    &amp;quot;Strong&amp;quot;,     &amp;quot;Stupendous&amp;quot;, &amp;quot;Stupid&amp;quot;,     &amp;quot;Sturdy&amp;quot;,     &amp;quot;Subdued&amp;quot;,    &amp;quot;Subsequent&amp;quot;,&lt;br /&gt;
    &amp;quot;Successful&amp;quot;, &amp;quot;Succinct&amp;quot;,   &amp;quot;Sudden&amp;quot;,     &amp;quot;Sulky&amp;quot;,      &amp;quot;Super&amp;quot;,      &amp;quot;Superb&amp;quot;,     &amp;quot;Supreme&amp;quot;,    &amp;quot;Swanky&amp;quot;,     &amp;quot;Sweet&amp;quot;,      &amp;quot;Sweltering&amp;quot;, &amp;quot;Swift&amp;quot;,&lt;br /&gt;
    &amp;quot;Synonymous&amp;quot;, &amp;quot;Taboo&amp;quot;,      &amp;quot;Tacit&amp;quot;,      &amp;quot;Tacky&amp;quot;,      &amp;quot;Talented&amp;quot;,   &amp;quot;Tall&amp;quot;,       &amp;quot;Tame&amp;quot;,       &amp;quot;Tan&amp;quot;,        &amp;quot;Tangible&amp;quot;,   &amp;quot;Tangy&amp;quot;,      &amp;quot;Tart&amp;quot;,&lt;br /&gt;
    &amp;quot;Tasteful&amp;quot;,   &amp;quot;Tasteless&amp;quot;,  &amp;quot;Tasty&amp;quot;,      &amp;quot;Tawdry&amp;quot;,     &amp;quot;Tearful&amp;quot;,    &amp;quot;Tedious&amp;quot;,    &amp;quot;Teeny&amp;quot;,      &amp;quot;Teeny-tiny&amp;quot;, &amp;quot;Telling&amp;quot;,    &amp;quot;Temporary&amp;quot;,  &amp;quot;Ten&amp;quot;,&lt;br /&gt;
    &amp;quot;Tender&amp;quot;,     &amp;quot;Tense&amp;quot;,      &amp;quot;Tenuous&amp;quot;,    &amp;quot;Terrible&amp;quot;,   &amp;quot;Terrific&amp;quot;,   &amp;quot;Tested&amp;quot;,     &amp;quot;Testy&amp;quot;,      &amp;quot;Thankful&amp;quot;,   &amp;quot;Thick&amp;quot;,      &amp;quot;Thin&amp;quot;,       &amp;quot;Thinkable&amp;quot;,&lt;br /&gt;
    &amp;quot;Third&amp;quot;,      &amp;quot;Thirsty&amp;quot;,    &amp;quot;Thoughtful&amp;quot;, &amp;quot;Three&amp;quot;,      &amp;quot;Thundering&amp;quot;, &amp;quot;Tidy&amp;quot;,       &amp;quot;Tight&amp;quot;,      &amp;quot;Tiny&amp;quot;,       &amp;quot;Tired&amp;quot;,      &amp;quot;Tiresome&amp;quot;,   &amp;quot;Toothsome&amp;quot;,&lt;br /&gt;
    &amp;quot;Torpid&amp;quot;,     &amp;quot;Tough&amp;quot;,      &amp;quot;Towering&amp;quot;,   &amp;quot;Tranquil&amp;quot;,   &amp;quot;Trashy&amp;quot;,     &amp;quot;Tremendous&amp;quot;, &amp;quot;Tricky&amp;quot;,     &amp;quot;Trite&amp;quot;,      &amp;quot;Troubled&amp;quot;,   &amp;quot;Truculent&amp;quot;,  &amp;quot;True&amp;quot;,&lt;br /&gt;
    &amp;quot;Truthful&amp;quot;,   &amp;quot;Two&amp;quot;,        &amp;quot;Typical&amp;quot;,    &amp;quot;Ubiquitous&amp;quot;, &amp;quot;Ugliest&amp;quot;,    &amp;quot;Ugly&amp;quot;,       &amp;quot;Ultra&amp;quot;,      &amp;quot;Unable&amp;quot;,     &amp;quot;Unadvised&amp;quot;,  &amp;quot;Unarmed&amp;quot;,    &amp;quot;Unbecoming&amp;quot;,&lt;br /&gt;
    &amp;quot;Unbiased&amp;quot;,   &amp;quot;Uncovered&amp;quot;,  &amp;quot;Understood&amp;quot;, &amp;quot;Unequal&amp;quot;,    &amp;quot;Unequaled&amp;quot;,  &amp;quot;Uneven&amp;quot;,     &amp;quot;Unhealthy&amp;quot;,  &amp;quot;Unique&amp;quot;,     &amp;quot;Unkempt&amp;quot;,    &amp;quot;Unknown&amp;quot;,    &amp;quot;Unnatural&amp;quot;,&lt;br /&gt;
    &amp;quot;Unruly&amp;quot;,     &amp;quot;Unsightly&amp;quot;,  &amp;quot;Unsuitable&amp;quot;, &amp;quot;Untidy&amp;quot;,     &amp;quot;Unused&amp;quot;,     &amp;quot;Unusual&amp;quot;,    &amp;quot;Unwieldy&amp;quot;,   &amp;quot;Unwritten&amp;quot;,  &amp;quot;Upbeat&amp;quot;,     &amp;quot;Uppity&amp;quot;,     &amp;quot;Upset&amp;quot;,&lt;br /&gt;
    &amp;quot;Uptight&amp;quot;,    &amp;quot;Used&amp;quot;,       &amp;quot;Useful&amp;quot;,     &amp;quot;Useless&amp;quot;,    &amp;quot;Utopian&amp;quot;,    &amp;quot;Utter&amp;quot;,      &amp;quot;Uttermost&amp;quot;,  &amp;quot;Vacuous&amp;quot;,    &amp;quot;Vagabond&amp;quot;,   &amp;quot;Vague&amp;quot;,      &amp;quot;Valuable&amp;quot;,&lt;br /&gt;
    &amp;quot;Various&amp;quot;,    &amp;quot;Vast&amp;quot;,       &amp;quot;Vengeful&amp;quot;,   &amp;quot;Venomous&amp;quot;,   &amp;quot;Verdant&amp;quot;,    &amp;quot;Versed&amp;quot;,     &amp;quot;Victorious&amp;quot;, &amp;quot;Vigorous&amp;quot;,   &amp;quot;Violent&amp;quot;,    &amp;quot;Violet&amp;quot;,     &amp;quot;Vivacious&amp;quot;,&lt;br /&gt;
    &amp;quot;Voiceless&amp;quot;,  &amp;quot;Volatile&amp;quot;,   &amp;quot;Voracious&amp;quot;,  &amp;quot;Vulgar&amp;quot;,     &amp;quot;Wacky&amp;quot;,      &amp;quot;Waggish&amp;quot;,    &amp;quot;Waiting&amp;quot;,    &amp;quot;Wakeful&amp;quot;,    &amp;quot;Wandering&amp;quot;,  &amp;quot;Wanting&amp;quot;,    &amp;quot;Warlike&amp;quot;,&lt;br /&gt;
    &amp;quot;Warm&amp;quot;,       &amp;quot;Wary&amp;quot;,       &amp;quot;Wasteful&amp;quot;,   &amp;quot;Watery&amp;quot;,     &amp;quot;Weak&amp;quot;,       &amp;quot;Wealthy&amp;quot;,    &amp;quot;Weary&amp;quot;,      &amp;quot;Well-made&amp;quot;,  &amp;quot;Well-off&amp;quot;,   &amp;quot;Well-to-do&amp;quot;, &amp;quot;Wet&amp;quot;,&lt;br /&gt;
    &amp;quot;Whimsical&amp;quot;,  &amp;quot;Whispering&amp;quot;, &amp;quot;White&amp;quot;,      &amp;quot;Whole&amp;quot;,      &amp;quot;Wholesale&amp;quot;,  &amp;quot;Wicked&amp;quot;,     &amp;quot;Wide&amp;quot;,       &amp;quot;Wide-eyed&amp;quot;,  &amp;quot;Wiggly&amp;quot;,     &amp;quot;Wild&amp;quot;,       &amp;quot;Willing&amp;quot;,&lt;br /&gt;
    &amp;quot;Windy&amp;quot;,      &amp;quot;Wiry&amp;quot;,       &amp;quot;Wise&amp;quot;,       &amp;quot;Wistful&amp;quot;,    &amp;quot;Witty&amp;quot;,      &amp;quot;Woebegone&amp;quot;,  &amp;quot;Womanly&amp;quot;,    &amp;quot;Wonderful&amp;quot;,  &amp;quot;Wooden&amp;quot;,     &amp;quot;Woozy&amp;quot;,      &amp;quot;Workable&amp;quot;,&lt;br /&gt;
    &amp;quot;Worried&amp;quot;,    &amp;quot;Worthless&amp;quot;,  &amp;quot;Wrathful&amp;quot;,   &amp;quot;Wretched&amp;quot;,   &amp;quot;Wrong&amp;quot;,      &amp;quot;Wry&amp;quot;,&lt;br /&gt;
}, {&lt;br /&gt;
    &amp;quot;Aardvark&amp;quot;,   &amp;quot;Buffalo&amp;quot;,    &amp;quot;Alligator&amp;quot;,  &amp;quot;Ant&amp;quot;,        &amp;quot;Anteater&amp;quot;,   &amp;quot;Antelope&amp;quot;,   &amp;quot;Ape&amp;quot;,        &amp;quot;Armadillo&amp;quot;,  &amp;quot;Donkey&amp;quot;,      &amp;quot;Baboon&amp;quot;,     &amp;quot;Badger&amp;quot;,&lt;br /&gt;
    &amp;quot;Barracuda&amp;quot;,  &amp;quot;Bat&amp;quot;,        &amp;quot;Bear&amp;quot;,       &amp;quot;Beaver&amp;quot;,     &amp;quot;Bee&amp;quot;,        &amp;quot;Bison&amp;quot;,      &amp;quot;Boar&amp;quot;,       &amp;quot;Bush&amp;quot;,       &amp;quot;Butterfly&amp;quot;,   &amp;quot;Camel&amp;quot;,      &amp;quot;Calf&amp;quot;,&lt;br /&gt;
    &amp;quot;Cat&amp;quot;,        &amp;quot;Kitten&amp;quot;,     &amp;quot;Cattle&amp;quot;,     &amp;quot;Chamois&amp;quot;,    &amp;quot;Cheetah&amp;quot;,    &amp;quot;Chicken&amp;quot;,    &amp;quot;Chick&amp;quot;,      &amp;quot;Chimpanzee&amp;quot;, &amp;quot;Infant&amp;quot;,      &amp;quot;Empress&amp;quot;,    &amp;quot;Troop&amp;quot;,&lt;br /&gt;
    &amp;quot;Cobra&amp;quot;,      &amp;quot;Cockroach&amp;quot;,  &amp;quot;Cormorant&amp;quot;,  &amp;quot;Cougar&amp;quot;,     &amp;quot;Coyote&amp;quot;,     &amp;quot;Crab&amp;quot;,       &amp;quot;Crane&amp;quot;,      &amp;quot;Crocodile&amp;quot;,  &amp;quot;Crow&amp;quot;,        &amp;quot;Deer&amp;quot;,       &amp;quot;Dog&amp;quot;,&lt;br /&gt;
    &amp;quot;Dogfish&amp;quot;,    &amp;quot;Dolphin&amp;quot;,    &amp;quot;Dove&amp;quot;,       &amp;quot;Dragonfly&amp;quot;,  &amp;quot;Duck&amp;quot;,       &amp;quot;Dugong&amp;quot;,     &amp;quot;Eagle&amp;quot;,      &amp;quot;Eaglet&amp;quot;,     &amp;quot;Echidna&amp;quot;,     &amp;quot;Eel&amp;quot;,        &amp;quot;Eland&amp;quot;,&lt;br /&gt;
    &amp;quot;Elephant&amp;quot;,   &amp;quot;Elk&amp;quot;,        &amp;quot;Falcon&amp;quot;,     &amp;quot;Ferret&amp;quot;,     &amp;quot;Finch&amp;quot;,      &amp;quot;Fly&amp;quot;,        &amp;quot;Fox&amp;quot;,        &amp;quot;Frog&amp;quot;,       &amp;quot;Gaur&amp;quot;,        &amp;quot;Gazelle&amp;quot;,    &amp;quot;Gerbil&amp;quot;,&lt;br /&gt;
    &amp;quot;Giant&amp;quot;,      &amp;quot;Giraffe&amp;quot;,    &amp;quot;Gnu&amp;quot;,        &amp;quot;Goat&amp;quot;,       &amp;quot;Goose&amp;quot;,      &amp;quot;Gorilla&amp;quot;,    &amp;quot;Guanaco&amp;quot;,    &amp;quot;Guinea&amp;quot;,     &amp;quot;Guineapig&amp;quot;,   &amp;quot;Gull&amp;quot;,       &amp;quot;Hamster&amp;quot;,&lt;br /&gt;
    &amp;quot;Hare&amp;quot;,       &amp;quot;Hawk&amp;quot;,       &amp;quot;Hedgehog&amp;quot;,   &amp;quot;Heron&amp;quot;,      &amp;quot;Hornet&amp;quot;,     &amp;quot;Horse&amp;quot;,      &amp;quot;Human&amp;quot;,      &amp;quot;Hyena&amp;quot;,      &amp;quot;Iguana&amp;quot;,      &amp;quot;Jackal&amp;quot;,     &amp;quot;Jaguar&amp;quot;,&lt;br /&gt;
    &amp;quot;Jellyfish&amp;quot;,  &amp;quot;Kangaroo&amp;quot;,   &amp;quot;Koala&amp;quot;,      &amp;quot;Komodo&amp;quot;,     &amp;quot;Kouprey&amp;quot;,    &amp;quot;Kudu&amp;quot;,       &amp;quot;Lark&amp;quot;,       &amp;quot;Lemur&amp;quot;,      &amp;quot;Leopard&amp;quot;,     &amp;quot;Lion&amp;quot;,       &amp;quot;Llama&amp;quot;,&lt;br /&gt;
    &amp;quot;Loris&amp;quot;,      &amp;quot;Louse&amp;quot;,      &amp;quot;Lobster&amp;quot;,    &amp;quot;Lyrebird&amp;quot;,   &amp;quot;Magpie&amp;quot;,     &amp;quot;Mallard&amp;quot;,    &amp;quot;Manatee&amp;quot;,    &amp;quot;Meerkat&amp;quot;,    &amp;quot;Mink&amp;quot;,        &amp;quot;Mole&amp;quot;,       &amp;quot;Monkey&amp;quot;,&lt;br /&gt;
    &amp;quot;Moose&amp;quot;,      &amp;quot;Mouse&amp;quot;,      &amp;quot;Mosquito&amp;quot;,   &amp;quot;Mule&amp;quot;,       &amp;quot;Okapi&amp;quot;,      &amp;quot;Oryx&amp;quot;,       &amp;quot;Ostrich&amp;quot;,    &amp;quot;Otter&amp;quot;,      &amp;quot;Owl&amp;quot;,         &amp;quot;Ox&amp;quot;,         &amp;quot;Oyster&amp;quot;,&lt;br /&gt;
    &amp;quot;Panther&amp;quot;,    &amp;quot;Partridge&amp;quot;,  &amp;quot;Peafowl&amp;quot;,    &amp;quot;Pelican&amp;quot;,    &amp;quot;Penguin&amp;quot;,    &amp;quot;Pig&amp;quot;,        &amp;quot;Pigeon&amp;quot;,     &amp;quot;Pony&amp;quot;,       &amp;quot;Porcupine&amp;quot;,   &amp;quot;Quelea&amp;quot;,     &amp;quot;Rabbit&amp;quot;,&lt;br /&gt;
    &amp;quot;Bunny&amp;quot;,      &amp;quot;Raccoon&amp;quot;,    &amp;quot;Rail&amp;quot;,       &amp;quot;Ram&amp;quot;,        &amp;quot;Rat&amp;quot;,        &amp;quot;Raven&amp;quot;,      &amp;quot;Reindeer&amp;quot;,   &amp;quot;Rhino&amp;quot;,      &amp;quot;Salamander&amp;quot;,  &amp;quot;Sealion&amp;quot;,    &amp;quot;Seal&amp;quot;,&lt;br /&gt;
    &amp;quot;Seahorse&amp;quot;,   &amp;quot;Seastar&amp;quot;,    &amp;quot;Shark&amp;quot;,      &amp;quot;Sheep&amp;quot;,      &amp;quot;Shrew&amp;quot;,      &amp;quot;Skunk&amp;quot;,      &amp;quot;Snail&amp;quot;,      &amp;quot;Snake&amp;quot;,      &amp;quot;Spider&amp;quot;,      &amp;quot;Squid&amp;quot;,      &amp;quot;Squirrel&amp;quot;,&lt;br /&gt;
    &amp;quot;Stinkbug&amp;quot;,   &amp;quot;Swan&amp;quot;,       &amp;quot;Tapir&amp;quot;,      &amp;quot;Tarsier&amp;quot;,    &amp;quot;Tiger&amp;quot;,      &amp;quot;Toad&amp;quot;,       &amp;quot;Turkey&amp;quot;,     &amp;quot;Turtle&amp;quot;,     &amp;quot;Vicuna&amp;quot;,      &amp;quot;Walrus&amp;quot;,     &amp;quot;Wasp&amp;quot;,&lt;br /&gt;
    &amp;quot;Weasel&amp;quot;,     &amp;quot;Whale&amp;quot;,      &amp;quot;Wolf&amp;quot;,       &amp;quot;Worm&amp;quot;,       &amp;quot;Yak&amp;quot;,        &amp;quot;Zebra&amp;quot;,      &amp;quot;Hat&amp;quot;,        &amp;quot;Cap&amp;quot;,        &amp;quot;Beret&amp;quot;,       &amp;quot;Astrakhan&amp;quot;,  &amp;quot;Beanie&amp;quot;,&lt;br /&gt;
    &amp;quot;Hardhat&amp;quot;,    &amp;quot;Pillbox&amp;quot;,    &amp;quot;Monkeycap&amp;quot;,  &amp;quot;Operahat&amp;quot;,   &amp;quot;Bonnet&amp;quot;,     &amp;quot;Bowler&amp;quot;,     &amp;quot;Coonskin&amp;quot;,   &amp;quot;Fedora&amp;quot;,     &amp;quot;Derby&amp;quot;,       &amp;quot;Montero&amp;quot;,    &amp;quot;Cowboyhat&amp;quot;,&lt;br /&gt;
    &amp;quot;Sombrero&amp;quot;,   &amp;quot;Yarmulke&amp;quot;,   &amp;quot;Skullcap&amp;quot;,   &amp;quot;Tam&amp;quot;,        &amp;quot;Sunbonnet&amp;quot;,  &amp;quot;Toque&amp;quot;,      &amp;quot;Tophat&amp;quot;,     &amp;quot;Babushka&amp;quot;,   &amp;quot;Balaclava&amp;quot;,   &amp;quot;Turban&amp;quot;,     &amp;quot;Diadem&amp;quot;,&lt;br /&gt;
    &amp;quot;Earmuffs&amp;quot;,   &amp;quot;Visor&amp;quot;,      &amp;quot;Scarf&amp;quot;,      &amp;quot;Veil&amp;quot;,       &amp;quot;Warbonnet&amp;quot;,  &amp;quot;Pithhelmet&amp;quot;, &amp;quot;Hood&amp;quot;,       &amp;quot;Miter&amp;quot;,      &amp;quot;Butter&amp;quot;,      &amp;quot;Icecream&amp;quot;,   &amp;quot;Cakebatter&amp;quot;,&lt;br /&gt;
    &amp;quot;Coffee&amp;quot;,     &amp;quot;Tea&amp;quot;,        &amp;quot;Soda&amp;quot;,       &amp;quot;Beer&amp;quot;,       &amp;quot;Wine&amp;quot;,       &amp;quot;Cappuccino&amp;quot;, &amp;quot;Jell-o&amp;quot;,     &amp;quot;Nougats&amp;quot;,    &amp;quot;Lambchops&amp;quot;,   &amp;quot;Steaks&amp;quot;,     &amp;quot;Chowder&amp;quot;,&lt;br /&gt;
    &amp;quot;Fishsoup&amp;quot;,   &amp;quot;Spaghetti&amp;quot;,  &amp;quot;Sushi&amp;quot;,      &amp;quot;Fondue&amp;quot;,     &amp;quot;Crabslegs&amp;quot;,  &amp;quot;Shrimp&amp;quot;,     &amp;quot;Onions&amp;quot;,     &amp;quot;Bratwurst&amp;quot;,  &amp;quot;Kielbasa&amp;quot;,    &amp;quot;Hotdog&amp;quot;,     &amp;quot;Hamburger&amp;quot;,&lt;br /&gt;
    &amp;quot;Herbs&amp;quot;,      &amp;quot;Grains&amp;quot;,     &amp;quot;Legumes&amp;quot;,    &amp;quot;Zampone&amp;quot;,    &amp;quot;Casserole&amp;quot;,  &amp;quot;Beans&amp;quot;,      &amp;quot;Seeds&amp;quot;,      &amp;quot;Stew&amp;quot;,       &amp;quot;Cereal&amp;quot;,      &amp;quot;Polenta&amp;quot;,    &amp;quot;Pudding&amp;quot;,&lt;br /&gt;
    &amp;quot;Pasta&amp;quot;,      &amp;quot;Macaroni&amp;quot;,   &amp;quot;Ravioli&amp;quot;,    &amp;quot;Wafer&amp;quot;,      &amp;quot;Crackers&amp;quot;,   &amp;quot;Cookies&amp;quot;,    &amp;quot;Sandwich&amp;quot;,   &amp;quot;Gyro&amp;quot;,       &amp;quot;Wrap&amp;quot;,        &amp;quot;Omelet&amp;quot;,     &amp;quot;Popcorn&amp;quot;,&lt;br /&gt;
    &amp;quot;Walnuts&amp;quot;,    &amp;quot;Nuts&amp;quot;,       &amp;quot;Almonds&amp;quot;,    &amp;quot;Pizza&amp;quot;,      &amp;quot;Mousse&amp;quot;,     &amp;quot;Brulee&amp;quot;,     &amp;quot;Cakes&amp;quot;,      &amp;quot;Pancake&amp;quot;,    &amp;quot;Waffles&amp;quot;,     &amp;quot;Toast&amp;quot;,      &amp;quot;Candy&amp;quot;,&lt;br /&gt;
    &amp;quot;Pie&amp;quot;,        &amp;quot;Senator&amp;quot;,    &amp;quot;Governor&amp;quot;,   &amp;quot;Councilman&amp;quot;, &amp;quot;Detective&amp;quot;,  &amp;quot;Sleuth&amp;quot;,     &amp;quot;Musician&amp;quot;,   &amp;quot;Maestro&amp;quot;,    &amp;quot;Conductor&amp;quot;,   &amp;quot;Composer&amp;quot;,   &amp;quot;Singer&amp;quot;,&lt;br /&gt;
    &amp;quot;Architect&amp;quot;,  &amp;quot;Physician&amp;quot;,  &amp;quot;Manager&amp;quot;,    &amp;quot;Usher&amp;quot;,      &amp;quot;Painter&amp;quot;,    &amp;quot;Model&amp;quot;,      &amp;quot;Designer&amp;quot;,   &amp;quot;Guest&amp;quot;,      &amp;quot;Attorney&amp;quot;,    &amp;quot;Lawyer&amp;quot;,     &amp;quot;Judge&amp;quot;,&lt;br /&gt;
    &amp;quot;Mayor&amp;quot;,      &amp;quot;Therapist&amp;quot;,  &amp;quot;Teacher&amp;quot;,    &amp;quot;Principal&amp;quot;,  &amp;quot;Professor&amp;quot;,  &amp;quot;Orator&amp;quot;,     &amp;quot;Man&amp;quot;,        &amp;quot;Woman&amp;quot;,      &amp;quot;Teen&amp;quot;,        &amp;quot;Child&amp;quot;,      &amp;quot;Mother&amp;quot;,&lt;br /&gt;
    &amp;quot;Father&amp;quot;,     &amp;quot;Sister&amp;quot;,     &amp;quot;Brother&amp;quot;,    &amp;quot;Uncle&amp;quot;,      &amp;quot;Aunt&amp;quot;,       &amp;quot;Son&amp;quot;,        &amp;quot;Daughter&amp;quot;,   &amp;quot;In-laws&amp;quot;,    &amp;quot;Boy&amp;quot;,         &amp;quot;Girl&amp;quot;,       &amp;quot;Nurse&amp;quot;,&lt;br /&gt;
    &amp;quot;Sibling&amp;quot;,    &amp;quot;Settler&amp;quot;,    &amp;quot;Pioneer&amp;quot;,    &amp;quot;Waiter&amp;quot;,     &amp;quot;Hostess&amp;quot;,    &amp;quot;Host&amp;quot;,       &amp;quot;Cashier&amp;quot;,    &amp;quot;Attendant&amp;quot;,  &amp;quot;Publisher&amp;quot;,   &amp;quot;Witch&amp;quot;,      &amp;quot;Warlock&amp;quot;,&lt;br /&gt;
    &amp;quot;Ghost&amp;quot;,      &amp;quot;Knight&amp;quot;,     &amp;quot;Prince&amp;quot;,     &amp;quot;Princess&amp;quot;,   &amp;quot;Maiden&amp;quot;,     &amp;quot;Godmother&amp;quot;,  &amp;quot;Fairy&amp;quot;,      &amp;quot;Petal&amp;quot;,      &amp;quot;Sepal&amp;quot;,       &amp;quot;Stamen&amp;quot;,     &amp;quot;Pineboughs&amp;quot;,&lt;br /&gt;
    &amp;quot;Bud&amp;quot;,        &amp;quot;Branch&amp;quot;,     &amp;quot;Blossom&amp;quot;,    &amp;quot;Fruit&amp;quot;,      &amp;quot;Bloom&amp;quot;,      &amp;quot;Tree&amp;quot;,       &amp;quot;Maple&amp;quot;,      &amp;quot;Elm&amp;quot;,        &amp;quot;Oak&amp;quot;,         &amp;quot;Palm&amp;quot;,       &amp;quot;Baobab&amp;quot;,&lt;br /&gt;
    &amp;quot;Mangrove&amp;quot;,   &amp;quot;Cyprus&amp;quot;,     &amp;quot;Pine&amp;quot;,       &amp;quot;Dogwood&amp;quot;,    &amp;quot;Alder&amp;quot;,      &amp;quot;Flowers&amp;quot;,    &amp;quot;Rose&amp;quot;,       &amp;quot;Tulip&amp;quot;,      &amp;quot;Cyclamen&amp;quot;,    &amp;quot;Lily&amp;quot;,       &amp;quot;Carnations&amp;quot;,&lt;br /&gt;
    &amp;quot;Wisteria&amp;quot;,   &amp;quot;Flytrap&amp;quot;,    &amp;quot;Hoe&amp;quot;,        &amp;quot;Weeds&amp;quot;,      &amp;quot;Plants&amp;quot;,     &amp;quot;Canes&amp;quot;,      &amp;quot;Palms&amp;quot;,      &amp;quot;Apple&amp;quot;,      &amp;quot;Lemon&amp;quot;,       &amp;quot;Orange&amp;quot;,     &amp;quot;Grapefruit&amp;quot;,&lt;br /&gt;
    &amp;quot;Tangerine&amp;quot;,  &amp;quot;Peach&amp;quot;,      &amp;quot;Tomato&amp;quot;,     &amp;quot;Banana&amp;quot;,     &amp;quot;Vegetables&amp;quot;, &amp;quot;Artichokes&amp;quot;, &amp;quot;Leeks&amp;quot;,      &amp;quot;Lettuce&amp;quot;,    &amp;quot;Eggplants&amp;quot;,   &amp;quot;Zucchini&amp;quot;,   &amp;quot;Squash&amp;quot;,&lt;br /&gt;
    &amp;quot;Pumpkin&amp;quot;,    &amp;quot;Cabbage&amp;quot;,    &amp;quot;Pepper&amp;quot;,     &amp;quot;Onion&amp;quot;,      &amp;quot;Garlic&amp;quot;,     &amp;quot;Poison&amp;quot;,     &amp;quot;Venom&amp;quot;,      &amp;quot;Fire&amp;quot;,       &amp;quot;Ship&amp;quot;,        &amp;quot;Ferryboat&amp;quot;,  &amp;quot;Oceanliner&amp;quot;,&lt;br /&gt;
    &amp;quot;Oars&amp;quot;,       &amp;quot;Sails&amp;quot;,      &amp;quot;Dinghy&amp;quot;,     &amp;quot;Yacht&amp;quot;,      &amp;quot;Canoe&amp;quot;,      &amp;quot;Catamaran&amp;quot;,  &amp;quot;Gondola&amp;quot;,    &amp;quot;Boat&amp;quot;,       &amp;quot;Battleship&amp;quot;,  &amp;quot;Clipper&amp;quot;,    &amp;quot;Dhow&amp;quot;,&lt;br /&gt;
    &amp;quot;Flatboat&amp;quot;,   &amp;quot;Houseboat&amp;quot;,  &amp;quot;Galleon&amp;quot;,    &amp;quot;Frigate&amp;quot;,    &amp;quot;Hydrofoil&amp;quot;,  &amp;quot;Junk&amp;quot;,       &amp;quot;Ketch&amp;quot;,      &amp;quot;Yawl&amp;quot;,       &amp;quot;Submarine&amp;quot;,   &amp;quot;Schooner&amp;quot;,   &amp;quot;Scow&amp;quot;,&lt;br /&gt;
    &amp;quot;Flatbed&amp;quot;,    &amp;quot;Suv&amp;quot;,        &amp;quot;Van&amp;quot;,        &amp;quot;Caboose&amp;quot;,    &amp;quot;Train&amp;quot;,      &amp;quot;Bullet&amp;quot;,     &amp;quot;Metro&amp;quot;,      &amp;quot;Subway&amp;quot;,     &amp;quot;Cart&amp;quot;,        &amp;quot;Taxi&amp;quot;,       &amp;quot;Car&amp;quot;,&lt;br /&gt;
    &amp;quot;Racingcar&amp;quot;,  &amp;quot;Buggy&amp;quot;,      &amp;quot;Dunebuggy&amp;quot;,  &amp;quot;Dragster&amp;quot;,   &amp;quot;Motorcycle&amp;quot;, &amp;quot;Gokart&amp;quot;,     &amp;quot;Limo&amp;quot;,       &amp;quot;Stretch&amp;quot;,    &amp;quot;Wagon&amp;quot;,       &amp;quot;Trolley&amp;quot;,    &amp;quot;Tram&amp;quot;,&lt;br /&gt;
    &amp;quot;Bus&amp;quot;,        &amp;quot;Parachute&amp;quot;,  &amp;quot;Tractor&amp;quot;,    &amp;quot;Trailer&amp;quot;,    &amp;quot;Golfkart&amp;quot;,   &amp;quot;Jeep&amp;quot;,       &amp;quot;Bigrig&amp;quot;,     &amp;quot;Bulldozer&amp;quot;,  &amp;quot;Dumptruck&amp;quot;,   &amp;quot;Towtruck&amp;quot;,   &amp;quot;Engine&amp;quot;,&lt;br /&gt;
    &amp;quot;Fireengine&amp;quot;, &amp;quot;Policecar&amp;quot;,  &amp;quot;Tank&amp;quot;,       &amp;quot;Locomotive&amp;quot;, &amp;quot;Ocean&amp;quot;,      &amp;quot;Oasis&amp;quot;,      &amp;quot;Sea&amp;quot;,        &amp;quot;Lake&amp;quot;,       &amp;quot;Saltlake&amp;quot;,    &amp;quot;Seafoam&amp;quot;,    &amp;quot;Waves&amp;quot;,&lt;br /&gt;
    &amp;quot;Bubbles&amp;quot;,    &amp;quot;Current&amp;quot;,    &amp;quot;Waterbasin&amp;quot;, &amp;quot;Bridge&amp;quot;,     &amp;quot;Harbor&amp;quot;,     &amp;quot;Pond&amp;quot;,       &amp;quot;Wharf&amp;quot;,      &amp;quot;Pier&amp;quot;,       &amp;quot;Dock&amp;quot;,        &amp;quot;Port&amp;quot;,       &amp;quot;Shore&amp;quot;,&lt;br /&gt;
    &amp;quot;Beach&amp;quot;,      &amp;quot;Sandbar&amp;quot;,    &amp;quot;Coast&amp;quot;,      &amp;quot;River&amp;quot;,      &amp;quot;Brook&amp;quot;,      &amp;quot;Rivulet&amp;quot;,    &amp;quot;Puddle&amp;quot;,     &amp;quot;Waterfall&amp;quot;,  &amp;quot;Cascades&amp;quot;,    &amp;quot;Canal&amp;quot;,      &amp;quot;Channel&amp;quot;,&lt;br /&gt;
    &amp;quot;Stream&amp;quot;,     &amp;quot;Creek&amp;quot;,      &amp;quot;Marsh&amp;quot;,      &amp;quot;Bog&amp;quot;,        &amp;quot;Swamp&amp;quot;,      &amp;quot;Bayou&amp;quot;,      &amp;quot;Estuary&amp;quot;,    &amp;quot;Whirlpool&amp;quot;,  &amp;quot;Eddy&amp;quot;,        &amp;quot;Geyser&amp;quot;,     &amp;quot;Well&amp;quot;,&lt;br /&gt;
    &amp;quot;Monsoon&amp;quot;,    &amp;quot;Hurricane&amp;quot;,  &amp;quot;Typhoon&amp;quot;,    &amp;quot;Air&amp;quot;,        &amp;quot;Snow&amp;quot;,       &amp;quot;Rain&amp;quot;,       &amp;quot;Sleet&amp;quot;,      &amp;quot;Storm&amp;quot;,      &amp;quot;Hail&amp;quot;,        &amp;quot;Blizzard&amp;quot;,   &amp;quot;Wind&amp;quot;,&lt;br /&gt;
    &amp;quot;Breeze&amp;quot;,     &amp;quot;Gale&amp;quot;,       &amp;quot;Whirlwind&amp;quot;,  &amp;quot;Maelstrom&amp;quot;,  &amp;quot;Duststorm&amp;quot;,  &amp;quot;Cloudburst&amp;quot;, &amp;quot;Tornado&amp;quot;,    &amp;quot;Twister&amp;quot;,    &amp;quot;Clouds&amp;quot;,      &amp;quot;Fog&amp;quot;,        &amp;quot;Peasoup&amp;quot;,&lt;br /&gt;
    &amp;quot;Floods&amp;quot;,     &amp;quot;Flashflood&amp;quot;, &amp;quot;Acidrain&amp;quot;,   &amp;quot;Tremors&amp;quot;,    &amp;quot;Lightning&amp;quot;,  &amp;quot;Avalanche&amp;quot;,  &amp;quot;Eclipse&amp;quot;,    &amp;quot;Alpenglow&amp;quot;,  &amp;quot;Tsunami&amp;quot;,     &amp;quot;Waterspout&amp;quot;, &amp;quot;Smog&amp;quot;,&lt;br /&gt;
    &amp;quot;Aneroid&amp;quot;,    &amp;quot;Barometer&amp;quot;,  &amp;quot;Radiosonde&amp;quot;, &amp;quot;Station&amp;quot;,    &amp;quot;Map&amp;quot;,        &amp;quot;Chalice&amp;quot;,    &amp;quot;Bijou&amp;quot;,      &amp;quot;Candelabra&amp;quot;, &amp;quot;Menorah&amp;quot;,     &amp;quot;Curio&amp;quot;,      &amp;quot;Figurine&amp;quot;,&lt;br /&gt;
    &amp;quot;Music-box&amp;quot;,  &amp;quot;Objetd'art&amp;quot;, &amp;quot;Trinket&amp;quot;,    &amp;quot;Trims&amp;quot;,      &amp;quot;Windchimes&amp;quot;, &amp;quot;Birdcage&amp;quot;,   &amp;quot;Birdbath&amp;quot;,   &amp;quot;Cans&amp;quot;,       &amp;quot;Urn&amp;quot;,         &amp;quot;Bucket&amp;quot;,     &amp;quot;Arrow&amp;quot;,&lt;br /&gt;
    &amp;quot;Bow&amp;quot;,        &amp;quot;Sword&amp;quot;,      &amp;quot;Dart&amp;quot;,       &amp;quot;Epee&amp;quot;,       &amp;quot;Dagger&amp;quot;,     &amp;quot;Hatchet&amp;quot;,    &amp;quot;Pickax&amp;quot;,     &amp;quot;Dolls&amp;quot;,      &amp;quot;Broom&amp;quot;,       &amp;quot;Mop&amp;quot;,        &amp;quot;Pail&amp;quot;,&lt;br /&gt;
    &amp;quot;Squeegee&amp;quot;,   &amp;quot;Caddy&amp;quot;,      &amp;quot;Telephone&amp;quot;,  &amp;quot;Pipe&amp;quot;,       &amp;quot;Paints&amp;quot;,     &amp;quot;Brushes&amp;quot;,    &amp;quot;Easel&amp;quot;,      &amp;quot;Canvas&amp;quot;,     &amp;quot;Trunk&amp;quot;,       &amp;quot;Hook&amp;quot;,       &amp;quot;Gun&amp;quot;,&lt;br /&gt;
    &amp;quot;Glue&amp;quot;,       &amp;quot;Tissue&amp;quot;,     &amp;quot;Toilet&amp;quot;,     &amp;quot;Kleenex&amp;quot;,    &amp;quot;Papertowel&amp;quot;, &amp;quot;Ropes&amp;quot;,      &amp;quot;Rubber&amp;quot;,     &amp;quot;Coil&amp;quot;,       &amp;quot;Toys&amp;quot;,        &amp;quot;Dogleash&amp;quot;,   &amp;quot;Balloon&amp;quot;,&lt;br /&gt;
    &amp;quot;Vases&amp;quot;,      &amp;quot;Planters&amp;quot;,   &amp;quot;Pen&amp;quot;,        &amp;quot;Pad&amp;quot;,        &amp;quot;Typewriter&amp;quot;, &amp;quot;Computer&amp;quot;,   &amp;quot;Laptop&amp;quot;,     &amp;quot;Netbook&amp;quot;,    &amp;quot;Stylus&amp;quot;,      &amp;quot;Pencil&amp;quot;,     &amp;quot;Desk&amp;quot;,&lt;br /&gt;
    &amp;quot;Backpack&amp;quot;,   &amp;quot;Shoerack&amp;quot;,   &amp;quot;Notebook&amp;quot;,   &amp;quot;Vellum&amp;quot;,     &amp;quot;Chalk&amp;quot;,      &amp;quot;Badge&amp;quot;,      &amp;quot;Saddle&amp;quot;,     &amp;quot;Spurs&amp;quot;,      &amp;quot;Paper&amp;quot;,       &amp;quot;Rollbook&amp;quot;,   &amp;quot;Guestbook&amp;quot;,&lt;br /&gt;
    &amp;quot;Pot&amp;quot;,        &amp;quot;Plate&amp;quot;,      &amp;quot;Dishes&amp;quot;,     &amp;quot;Fork&amp;quot;,       &amp;quot;Spoons&amp;quot;,     &amp;quot;Knives&amp;quot;,     &amp;quot;Knife&amp;quot;,      &amp;quot;Samovar&amp;quot;,    &amp;quot;Sky&amp;quot;,         &amp;quot;Forest&amp;quot;,     &amp;quot;Heaven&amp;quot;,&lt;br /&gt;
    &amp;quot;Hell&amp;quot;,       &amp;quot;Earth&amp;quot;,      &amp;quot;Sun&amp;quot;,        &amp;quot;Star&amp;quot;,       &amp;quot;Planet&amp;quot;,     &amp;quot;Mercury&amp;quot;,    &amp;quot;Venus&amp;quot;,      &amp;quot;Mars&amp;quot;,       &amp;quot;Jupiter&amp;quot;,     &amp;quot;Saturn&amp;quot;,     &amp;quot;Uranus&amp;quot;,&lt;br /&gt;
    &amp;quot;Neptune&amp;quot;,    &amp;quot;Ceres&amp;quot;,      &amp;quot;Pluto&amp;quot;,      &amp;quot;Haumea&amp;quot;,     &amp;quot;Makemake&amp;quot;,   &amp;quot;Eris&amp;quot;,       &amp;quot;Outerspace&amp;quot;, &amp;quot;Town&amp;quot;,       &amp;quot;Village&amp;quot;,     &amp;quot;City&amp;quot;,       &amp;quot;Country&amp;quot;,&lt;br /&gt;
    &amp;quot;Farm&amp;quot;,       &amp;quot;Suburb&amp;quot;,     &amp;quot;Roads&amp;quot;,      &amp;quot;Streets&amp;quot;,    &amp;quot;Blocks&amp;quot;,     &amp;quot;Zoo&amp;quot;,        &amp;quot;Park&amp;quot;,       &amp;quot;Museum&amp;quot;,     &amp;quot;Cemetery&amp;quot;,    &amp;quot;Tunnels&amp;quot;,    &amp;quot;Caves&amp;quot;,&lt;br /&gt;
    &amp;quot;Churches&amp;quot;,   &amp;quot;Temples&amp;quot;,    &amp;quot;Mall&amp;quot;,       &amp;quot;Dresser&amp;quot;,    &amp;quot;Armoire&amp;quot;,    &amp;quot;Chiffonier&amp;quot;, &amp;quot;Credenza&amp;quot;,   &amp;quot;Console&amp;quot;,    &amp;quot;Bookcase&amp;quot;,    &amp;quot;Buffet&amp;quot;,     &amp;quot;Armchair&amp;quot;,&lt;br /&gt;
    &amp;quot;Recliner&amp;quot;,   &amp;quot;Easychair&amp;quot;,  &amp;quot;Bench&amp;quot;,      &amp;quot;Banquette&amp;quot;,  &amp;quot;Chair&amp;quot;,      &amp;quot;Couch&amp;quot;,      &amp;quot;Davenport&amp;quot;,  &amp;quot;Sofa&amp;quot;,       &amp;quot;Ottoman&amp;quot;,     &amp;quot;Deckchair&amp;quot;,  &amp;quot;Loveseat&amp;quot;,&lt;br /&gt;
    &amp;quot;Highseat&amp;quot;,   &amp;quot;Divan&amp;quot;,      &amp;quot;Inglenook&amp;quot;,  &amp;quot;Pew&amp;quot;,        &amp;quot;Throne&amp;quot;,     &amp;quot;Sectional&amp;quot;,  &amp;quot;Stool&amp;quot;,      &amp;quot;Pottychair&amp;quot;, &amp;quot;Workbench&amp;quot;,   &amp;quot;Nighttable&amp;quot;, &amp;quot;Bed&amp;quot;,&lt;br /&gt;
    &amp;quot;Daybed&amp;quot;,     &amp;quot;Bassinet&amp;quot;,   &amp;quot;Crib&amp;quot;,       &amp;quot;Cradle&amp;quot;,     &amp;quot;Cot&amp;quot;,        &amp;quot;Futon&amp;quot;,      &amp;quot;Hammock&amp;quot;,    &amp;quot;Tatamimat&amp;quot;,  &amp;quot;Waterbed&amp;quot;,    &amp;quot;Trundlebed&amp;quot;, &amp;quot;Hassock&amp;quot;,&lt;br /&gt;
    &amp;quot;Hatrack&amp;quot;,    &amp;quot;Stepstool&amp;quot;,  &amp;quot;Footrest&amp;quot;,   &amp;quot;Footstool&amp;quot;,  &amp;quot;Tripod&amp;quot;,     &amp;quot;Mirror&amp;quot;,     &amp;quot;Nightlight&amp;quot;, &amp;quot;Torchiere&amp;quot;,  &amp;quot;Sunlamp&amp;quot;,     &amp;quot;Spotlight&amp;quot;,  &amp;quot;Ceilingfan&amp;quot;,&lt;br /&gt;
    &amp;quot;Cupboard&amp;quot;,   &amp;quot;Cardtable&amp;quot;,  &amp;quot;Hutch&amp;quot;,      &amp;quot;Locker&amp;quot;,     &amp;quot;Wetbar&amp;quot;,     &amp;quot;Vanity&amp;quot;,     &amp;quot;Rack&amp;quot;,       &amp;quot;Hopechest&amp;quot;,  &amp;quot;Sculpture&amp;quot;,   &amp;quot;Painting&amp;quot;,   &amp;quot;Eye&amp;quot;,&lt;br /&gt;
    &amp;quot;Pupil&amp;quot;,      &amp;quot;Iris&amp;quot;,       &amp;quot;Retina&amp;quot;,     &amp;quot;Eyeball&amp;quot;,    &amp;quot;Eyelids&amp;quot;,    &amp;quot;Eyelashes&amp;quot;,  &amp;quot;Eyebrows&amp;quot;,   &amp;quot;Lap&amp;quot;,        &amp;quot;Waist&amp;quot;,       &amp;quot;Belly&amp;quot;,      &amp;quot;Tummy&amp;quot;,&lt;br /&gt;
    &amp;quot;Rearend&amp;quot;,    &amp;quot;Crotch&amp;quot;,     &amp;quot;Abdomen&amp;quot;,    &amp;quot;Beard&amp;quot;,      &amp;quot;Mustache&amp;quot;,   &amp;quot;Sideburns&amp;quot;,  &amp;quot;Fingernail&amp;quot;, &amp;quot;Hand&amp;quot;,       &amp;quot;Forearm&amp;quot;,     &amp;quot;Arm&amp;quot;,        &amp;quot;Knuckles&amp;quot;,&lt;br /&gt;
    &amp;quot;Thumb&amp;quot;,      &amp;quot;Wrist&amp;quot;,      &amp;quot;Elbow&amp;quot;,      &amp;quot;Leg&amp;quot;,        &amp;quot;Toes&amp;quot;,       &amp;quot;Knee&amp;quot;,       &amp;quot;Ankle&amp;quot;,      &amp;quot;Shin&amp;quot;,       &amp;quot;Thigh&amp;quot;,       &amp;quot;Hip&amp;quot;,        &amp;quot;Breast&amp;quot;,&lt;br /&gt;
    &amp;quot;Chest&amp;quot;,      &amp;quot;Torso&amp;quot;,      &amp;quot;Tongue&amp;quot;,     &amp;quot;Lips&amp;quot;,       &amp;quot;Gums&amp;quot;,       &amp;quot;Mouth&amp;quot;,      &amp;quot;Teeth&amp;quot;,      &amp;quot;Bones&amp;quot;,      &amp;quot;Spine&amp;quot;,       &amp;quot;Throat&amp;quot;,     &amp;quot;Lungs&amp;quot;,&lt;br /&gt;
    &amp;quot;Kidneys&amp;quot;,    &amp;quot;Intestines&amp;quot;, &amp;quot;Colon&amp;quot;,      &amp;quot;Spleen&amp;quot;,     &amp;quot;Glands&amp;quot;,     &amp;quot;Blood&amp;quot;,      &amp;quot;Head&amp;quot;,       &amp;quot;Skull&amp;quot;,      &amp;quot;Brain&amp;quot;,       &amp;quot;Muscle&amp;quot;,     &amp;quot;Hair&amp;quot;,&lt;br /&gt;
    &amp;quot;Xylophone&amp;quot;,  &amp;quot;Clavier&amp;quot;,    &amp;quot;Virginal&amp;quot;,   &amp;quot;Lute&amp;quot;,       &amp;quot;Drum&amp;quot;,       &amp;quot;Frenchhorn&amp;quot;, &amp;quot;Piano&amp;quot;,      &amp;quot;Violin&amp;quot;,     &amp;quot;Cello&amp;quot;,       &amp;quot;Guitar&amp;quot;,     &amp;quot;Flute&amp;quot;,&lt;br /&gt;
    &amp;quot;Tuba&amp;quot;,       &amp;quot;Harp&amp;quot;,       &amp;quot;Mariachi&amp;quot;,   &amp;quot;Orchestra&amp;quot;,  &amp;quot;Oboe&amp;quot;,       &amp;quot;Bassoon&amp;quot;,    &amp;quot;Woodwinds&amp;quot;,  &amp;quot;Brass&amp;quot;,      &amp;quot;Viola&amp;quot;,       &amp;quot;Kettledrum&amp;quot;, &amp;quot;Peyotedrum&amp;quot;,&lt;br /&gt;
    &amp;quot;Tambourine&amp;quot;, &amp;quot;Tambour&amp;quot;,    &amp;quot;Saxophone&amp;quot;,  &amp;quot;Marimba&amp;quot;,    &amp;quot;Maracas&amp;quot;,    &amp;quot;Shofar&amp;quot;,     &amp;quot;Cymbals&amp;quot;,    &amp;quot;Kazoo&amp;quot;,      &amp;quot;Dulcimer&amp;quot;,    &amp;quot;Accordion&amp;quot;,  &amp;quot;Lyre&amp;quot;,&lt;br /&gt;
    &amp;quot;Fiddle&amp;quot;,     &amp;quot;Banjo&amp;quot;,      &amp;quot;Balalaika&amp;quot;,  &amp;quot;Sitar&amp;quot;,      &amp;quot;Ukulele&amp;quot;,    &amp;quot;Zither&amp;quot;,     &amp;quot;Bagpipes&amp;quot;,   &amp;quot;Piccolo&amp;quot;,    &amp;quot;Clarinet&amp;quot;,    &amp;quot;Cornet&amp;quot;,     &amp;quot;Panpipe&amp;quot;,&lt;br /&gt;
    &amp;quot;Tuningfork&amp;quot;, &amp;quot;Metronome&amp;quot;,  &amp;quot;Castanets&amp;quot;,  &amp;quot;Woofer&amp;quot;,     &amp;quot;Sniper&amp;quot;,     &amp;quot;Marksman&amp;quot;,   &amp;quot;Cleaner&amp;quot;,    &amp;quot;Pyro&amp;quot;,       &amp;quot;Attacker&amp;quot;,    &amp;quot;Mechanic&amp;quot;,   &amp;quot;Janitor&amp;quot;,&lt;br /&gt;
    &amp;quot;Scrubber&amp;quot;,   &amp;quot;Garbageman&amp;quot;, &amp;quot;Technician&amp;quot;, &amp;quot;Ninja&amp;quot;,      &amp;quot;Medic&amp;quot;,      &amp;quot;Spy&amp;quot;,        &amp;quot;Assassin&amp;quot;,   &amp;quot;Gunman&amp;quot;,     &amp;quot;Triggerman&amp;quot;,  &amp;quot;Butcher&amp;quot;,    &amp;quot;Killer&amp;quot;,&lt;br /&gt;
    &amp;quot;Dodger&amp;quot;,     &amp;quot;Booger&amp;quot;,     &amp;quot;Engineer&amp;quot;,   &amp;quot;Doctor&amp;quot;,     &amp;quot;Surgeon&amp;quot;,    &amp;quot;Fighter&amp;quot;,    &amp;quot;Shooter&amp;quot;,    &amp;quot;Gunner&amp;quot;,     &amp;quot;Soldier&amp;quot;,     &amp;quot;Officer&amp;quot;,    &amp;quot;Veteran&amp;quot;,&lt;br /&gt;
    &amp;quot;Scout&amp;quot;,      &amp;quot;Mercenary&amp;quot;,  &amp;quot;Commando&amp;quot;,   &amp;quot;Cadet&amp;quot;,      &amp;quot;Guard&amp;quot;,      &amp;quot;Warrior&amp;quot;,    &amp;quot;Trooper&amp;quot;,    &amp;quot;Gambler&amp;quot;,    &amp;quot;Specialist&amp;quot;,  &amp;quot;Shaper&amp;quot;,     &amp;quot;Finisher&amp;quot;,&lt;br /&gt;
    &amp;quot;Gladiator&amp;quot;,  &amp;quot;Boxer&amp;quot;,      &amp;quot;Wrestler&amp;quot;,   &amp;quot;Warlord&amp;quot;,    &amp;quot;Rival&amp;quot;,      &amp;quot;Armory&amp;quot;,     &amp;quot;Agent&amp;quot;,      &amp;quot;Rebel&amp;quot;,      &amp;quot;Brawler&amp;quot;,     &amp;quot;Bruiser&amp;quot;,    &amp;quot;Bully&amp;quot;,&lt;br /&gt;
    &amp;quot;Champion&amp;quot;,   &amp;quot;Hero&amp;quot;,       &amp;quot;Battler&amp;quot;,    &amp;quot;Combatant&amp;quot;,  &amp;quot;Fencer&amp;quot;,     &amp;quot;Swordsman&amp;quot;,  &amp;quot;Expert&amp;quot;,     &amp;quot;Gangster&amp;quot;,   &amp;quot;Gangsta&amp;quot;,     &amp;quot;Bandit&amp;quot;,     &amp;quot;Hoodlum&amp;quot;,&lt;br /&gt;
    &amp;quot;Mobster&amp;quot;,    &amp;quot;Robber&amp;quot;,     &amp;quot;Thief&amp;quot;,      &amp;quot;Burglar&amp;quot;,    &amp;quot;Pirate&amp;quot;,     &amp;quot;Thug&amp;quot;,       &amp;quot;Hitman&amp;quot;,     &amp;quot;Hitperson&amp;quot;,  &amp;quot;Dealer&amp;quot;,      &amp;quot;Desperado&amp;quot;,  &amp;quot;Criminal&amp;quot;,&lt;br /&gt;
    &amp;quot;Crook&amp;quot;,      &amp;quot;Hijacker&amp;quot;,   &amp;quot;Carjacker&amp;quot;,  &amp;quot;Villain&amp;quot;,    &amp;quot;Convict&amp;quot;,    &amp;quot;Fugitive&amp;quot;,   &amp;quot;Mug&amp;quot;,        &amp;quot;Outlaw&amp;quot;,     &amp;quot;Ruffian&amp;quot;,     &amp;quot;Cutthroat&amp;quot;,  &amp;quot;Devil&amp;quot;,&lt;br /&gt;
    &amp;quot;Murderer&amp;quot;,   &amp;quot;Psycho&amp;quot;,     &amp;quot;Punk&amp;quot;,       &amp;quot;ASBO&amp;quot;,       &amp;quot;Offender&amp;quot;,   &amp;quot;Drifter&amp;quot;,    &amp;quot;Rioter&amp;quot;,     &amp;quot;Goon&amp;quot;,       &amp;quot;Roughneck&amp;quot;,   &amp;quot;Brute&amp;quot;,      &amp;quot;Hacker&amp;quot;,&lt;br /&gt;
    &amp;quot;Cabbie&amp;quot;,     &amp;quot;Wheeler&amp;quot;,    &amp;quot;Driver&amp;quot;,     &amp;quot;Rider&amp;quot;,      &amp;quot;Cyclist&amp;quot;,    &amp;quot;Cowboy&amp;quot;,     &amp;quot;Operative&amp;quot;,  &amp;quot;Carrier&amp;quot;,    &amp;quot;Transporter&amp;quot;, &amp;quot;Trucker&amp;quot;,    &amp;quot;Wheelman&amp;quot;,&lt;br /&gt;
    &amp;quot;Vampire&amp;quot;,    &amp;quot;Parasite&amp;quot;,   &amp;quot;Tramp&amp;quot;,      &amp;quot;Bum&amp;quot;,        &amp;quot;Hobo&amp;quot;,       &amp;quot;Hitchhiker&amp;quot;, &amp;quot;Deadbeat&amp;quot;,   &amp;quot;Acrobat&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function isPlayerNameRandomized(name)&lt;br /&gt;
    if type(name) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local prefix, num = name:match(&amp;quot;^(.-)(%d+)$&amp;quot;)&lt;br /&gt;
    if not prefix or not num then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if not tonumber(num) or tonumber(num) &amp;lt; 0 or tonumber(num) &amp;gt; 100 then&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for _, first in ipairs(firstName) do&lt;br /&gt;
        if prefix:sub(1, #first) == first then&lt;br /&gt;
            local rest = prefix:sub(#first + 1)&lt;br /&gt;
&lt;br /&gt;
            for _, second in ipairs(secondName) do&lt;br /&gt;
                if rest == second then&lt;br /&gt;
                    return true&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return false&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;
The example shows how to use function.&lt;br /&gt;
&amp;lt;section name=&amp;quot;Server&amp;quot; class=&amp;quot;server&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;
addEventHandler(&amp;quot;onPlayerConnect&amp;quot;, root,&lt;br /&gt;
    function(playerNick)&lt;br /&gt;
        if isPlayerNameRandomized(playerNick) then&lt;br /&gt;
            cancelEvent(true, &amp;quot;Newbie players are not allowed!&amp;quot;)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Author: [https://wiki.multitheftauto.com/wiki/User:O22 omar-o22]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Idea from: [https://github.com/multitheftauto/mtasa-blue/issues/2103 Issue#2103]&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>O22</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/PT-BR/OnPlayerLogin</id>
		<title>PT-BR/OnPlayerLogin</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/PT-BR/OnPlayerLogin"/>
		<updated>2025-10-23T01:31:50Z</updated>

		<summary type="html">&lt;p&gt;Lettify: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
{{PT-BR/Server event}}&lt;br /&gt;
Este evento é acionado quando um jogador se conecta em sua conta dentro do jogo.&lt;br /&gt;
&lt;br /&gt;
==Parâmetros==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
account thePreviousAccount, account theCurrentAccount&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''thePreviousAccount''': A [[account|conta]] que o jogador se conectou anteriormente.&lt;br /&gt;
*'''theCurrentAccount''': A [[account|conta]] que o jogador se conectou agora.&lt;br /&gt;
&lt;br /&gt;
==Source==&lt;br /&gt;
O [[event system#Event source|source]] deste evento é o [[Elemento/Player|elemento jogador]] que se conectou em sua conta.&lt;br /&gt;
&lt;br /&gt;
==Efeito do cancelamento==&lt;br /&gt;
Se este evento é [[cancelEvent|cancelado]], o jogador não se conectará em sua conta.&lt;br /&gt;
&lt;br /&gt;
==Exemplo== &lt;br /&gt;
Este exemplo apenas exibe ao console do jogador que um jogador que estava conectado em uma conta, se conectou em outra:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
addEventHandler(&amp;quot;onPlayerLogin&amp;quot;, root,&lt;br /&gt;
  function()&lt;br /&gt;
    outputChatBox(getPlayerName(source)..&amp;quot; has logged in!&amp;quot;, root)&lt;br /&gt;
  end&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Este exemplo permite apenas que seriais inseridos manualmente consigam acessar as determinadas contas.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
Firewall = &lt;br /&gt;
{&lt;br /&gt;
--  [ 'accountName' ] = 'playerSerial',&lt;br /&gt;
    [ '3ash8' ] = '9C9F3B55D9D7BB7135FF274D3BF444E4',&lt;br /&gt;
    [ 'test5' ] = '1D6F76CF8D7193792D13789849498452',&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
addEventHandler ( 'onPlayerLogin', getRootElement ( ),&lt;br /&gt;
    function ( _, theCurrentAccount )&lt;br /&gt;
    local Serial = Firewall[getAccountName(theCurrentAccount)]&lt;br /&gt;
        if Serial and Serial ~= getPlayerSerial ( source ) then&lt;br /&gt;
            outputChatBox( &amp;quot;Sorry, you're not allowed to access this account.&amp;quot;, source)&lt;br /&gt;
            cancelEvent( true )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{See also/Server event|Player events}}&lt;br /&gt;
&lt;br /&gt;
[[ru:onPlayerLogin]]&lt;br /&gt;
[[pt-br:onPlayerLogin]]&lt;/div&gt;</summary>
		<author><name>Lettify</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/Astrath:createTab</id>
		<title>Astrath:createTab</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/Astrath:createTab"/>
		<updated>2025-10-22T20:23:32Z</updated>

		<summary type="html">&lt;p&gt;Sybellex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DxTab:new =&lt;br /&gt;
&lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{FuncDef|element DxTab:new ( element parent, string text, table color, table hoverColor, table activeColor, table tabColor )}}&lt;br /&gt;
&lt;br /&gt;
'''Description:'''&lt;br /&gt;
Creates a new tab element inside a `DxTabPanel`. Tabs are linked to a panel and their positions are automatically managed according to the panel layout. Only usable with a valid `DxTabPanel` parent.&lt;br /&gt;
&lt;br /&gt;
'''Parameters:'''&lt;br /&gt;
* parent (element) – A `DxTabPanel` element where this tab will be attached (required).&lt;br /&gt;
* text (string) – The text to display on the tab (optional, default: 'tab').&lt;br /&gt;
* color (table / tocolor) – The main color of the tab (optional, defaults to parent's color).&lt;br /&gt;
* hoverColor (table / tocolor) – Color when hovering (optional, defaults to parent's hoverColor).&lt;br /&gt;
* activeColor (table / tocolor) – Color when tab is active (optional, defaults to parent's activeColor).&lt;br /&gt;
* tabColor (table / tocolor) – Base color for inactive tabs (optional, defaults to parent's tabColor).&lt;br /&gt;
&lt;br /&gt;
'''Returns:'''&lt;br /&gt;
: Returns the newly created `DxTab` element.&lt;br /&gt;
&lt;br /&gt;
'''Methods:'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; border:none;&amp;quot;&lt;br /&gt;
! Method !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ath:destroy() || Destroys the tab and removes it from the parent panel.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setVisible(boolean) || Shows or hides the tab and triggers reordering in the panel.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setEnabled(boolean) || Enables or disables the tab.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setHoverable(boolean) || Enables or disables hover effects for this tab.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setColor(r, g, b, a, type) || Sets the tab's color. Type can be 'mainColor', 'hoverColor', 'tabColor', 'activeColor'.&lt;br /&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;
-- Crear un tab panel&lt;br /&gt;
local tabPanel = DxTabPanel:new(100, 100, 400, 300)&lt;br /&gt;
tabPanel:setVisible(true)&lt;br /&gt;
&lt;br /&gt;
-- Agregar tabs&lt;br /&gt;
local tab1 = DxTab:new(tabPanel, &amp;quot;Tab 1&amp;quot;)&lt;br /&gt;
local tab2 = DxTab:new(tabPanel, &amp;quot;Tab 2&amp;quot;, tocolor(200,0,0,255))&lt;br /&gt;
&lt;br /&gt;
-- Establecer tab seleccionado&lt;br /&gt;
tabPanel:setSelected(tab1)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''See also:'''&lt;br /&gt;
* [[DxTabPanel:new]] – The panel container required for tabs&lt;br /&gt;
* [[onClientRender]] – Event used to draw DX elements each frame&lt;br /&gt;
* [[adjustAlpha]] – Function used internally to adjust tab opacity&lt;/div&gt;</summary>
		<author><name>Sybellex</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/Astrath:createTabPanel</id>
		<title>Astrath:createTabPanel</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/Astrath:createTabPanel"/>
		<updated>2025-10-22T20:19:50Z</updated>

		<summary type="html">&lt;p&gt;Sybellex: Created page with &amp;quot;= DxTabPanel:new =  {{Client function}} {{FuncDef|element DxTabPanel:new ( float posX, float posY, float width, float height, element parent, boolean relative, table color, table tabColor, table activeColor, table hoverColor, string font, float fontsize, string style, string tabStyle )}}  '''Description:''' Creates a new tab panel DX element. A tab panel can hold multiple tabs and manage their selection and hover states. Automatically adjusts child tab positions and size...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DxTabPanel:new =&lt;br /&gt;
&lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{FuncDef|element DxTabPanel:new ( float posX, float posY, float width, float height, element parent, boolean relative, table color, table tabColor, table activeColor, table hoverColor, string font, float fontsize, string style, string tabStyle )}}&lt;br /&gt;
&lt;br /&gt;
'''Description:'''&lt;br /&gt;
Creates a new tab panel DX element. A tab panel can hold multiple tabs and manage their selection and hover states. Automatically adjusts child tab positions and sizes.&lt;br /&gt;
&lt;br /&gt;
'''Parameters:'''&lt;br /&gt;
* posX, posY (float) – Position of the tab panel on screen.&lt;br /&gt;
* width, height (float) – Dimensions of the tab panel.&lt;br /&gt;
* parent (element) – Parent DX element to attach this panel to (optional).&lt;br /&gt;
* relative (boolean) – Position relative to parent (optional).&lt;br /&gt;
* color (table / tocolor) – Main background color of the panel (optional, default: dark grey).&lt;br /&gt;
* tabColor (table / tocolor) – Default color for tabs (optional).&lt;br /&gt;
* activeColor (table / tocolor) – Color for the active tab (optional).&lt;br /&gt;
* hoverColor (table / tocolor) – Hover color for tabs (optional).&lt;br /&gt;
* font (string) – Font used for tab text (optional, default: &amp;quot;default-bold&amp;quot;).&lt;br /&gt;
* fontsize (float) – Font size for tab text (optional, default: 1).&lt;br /&gt;
* style (string) – DX style used for the panel (optional).&lt;br /&gt;
* tabStyle (string) – DX style used for tabs (optional).&lt;br /&gt;
&lt;br /&gt;
'''Returns:'''&lt;br /&gt;
: Returns the newly created DxTabPanel element.&lt;br /&gt;
&lt;br /&gt;
'''Methods:'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; border:none;&amp;quot;&lt;br /&gt;
! Method !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ath:destroy() || Destroys the tab panel and all child tabs and elements.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setVisible(boolean) || Shows or hides the tab panel.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setEnabled(boolean) || Enables or disables the tab panel for interaction.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:addTab(text) || Adds a new tab with the given text to the panel.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:getSelected() || Returns the currently selected tab element.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setSelected(tabElement) || Sets a specific tab as selected.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setHoverable(boolean) || Enables or disables hover effect for tabs.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setColor(r, g, b, a, type) || Sets colors for the panel or tabs. Type can be 'mainColor', 'hoverColor', 'tabColor', 'activeColor'.&lt;br /&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;
local tabPanel = DxTabPanel:new(100, 100, 400, 300)&lt;br /&gt;
tabPanel:setVisible(true)&lt;br /&gt;
tabPanel:addTab(&amp;quot;Tab 1&amp;quot;)&lt;br /&gt;
tabPanel:addTab(&amp;quot;Tab 2&amp;quot;)&lt;br /&gt;
tabPanel:draw()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''See also:'''&lt;br /&gt;
* [[DxTab:new]] – Page for individual tab elements&lt;br /&gt;
* [[DxWindow:new]] – For window parent reference&lt;br /&gt;
* [[onClientRender]] – Event to render DX elements&lt;/div&gt;</summary>
		<author><name>Sybellex</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/Astrath:createShape</id>
		<title>Astrath:createShape</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/Astrath:createShape"/>
		<updated>2025-10-22T20:17:10Z</updated>

		<summary type="html">&lt;p&gt;Sybellex: Created page with &amp;quot;= DxShape:new =  {{Client function}} {{FuncDef|element DxShape:new ( float posX, float posY, float width, float height, element parent, boolean relative, table color )}}  '''Description:''' Creates a new DX-based shape element. Shapes can have custom colors, hover effects, and rounded corners. Each shape instance is automatically registered in the DX library.  '''Parameters:''' * posX, posY (float) – Position on screen. * width, height (float) – Size of the shape. *...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DxShape:new =&lt;br /&gt;
&lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{FuncDef|element DxShape:new ( float posX, float posY, float width, float height, element parent, boolean relative, table color )}}&lt;br /&gt;
&lt;br /&gt;
'''Description:'''&lt;br /&gt;
Creates a new DX-based shape element. Shapes can have custom colors, hover effects, and rounded corners. Each shape instance is automatically registered in the DX library.&lt;br /&gt;
&lt;br /&gt;
'''Parameters:'''&lt;br /&gt;
* posX, posY (float) – Position on screen.&lt;br /&gt;
* width, height (float) – Size of the shape.&lt;br /&gt;
* parent (element) – Parent DX element to attach this shape to (optional).&lt;br /&gt;
* relative (boolean) – Position relative to parent (optional).&lt;br /&gt;
* color (table / tocolor) – Main color of the shape (optional, default: grey).&lt;br /&gt;
&lt;br /&gt;
'''Returns:'''&lt;br /&gt;
: Returns the newly created DxShape element.&lt;br /&gt;
&lt;br /&gt;
'''Methods:'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; border:none;&amp;quot;&lt;br /&gt;
! Method !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ath:destroy() || Destroys the shape and all its child elements.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setVisible(boolean) || Shows or hides the shape.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setEnabled(boolean) || Enables or disables the shape for interaction.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setHoverable(boolean) || Enables or disables hover effect.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setColor(r, g, b, a, type) || Sets main or hover color of the shape.&lt;br /&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;
local myShape = DxShape:new(100, 100, 200, 150)&lt;br /&gt;
myShape:setVisible(true)&lt;br /&gt;
myShape:setHoverable(true)&lt;br /&gt;
myShape:setColor(150, 150, 150, 255, &amp;quot;mainColor&amp;quot;)&lt;br /&gt;
myShape:draw()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''See also:'''&lt;br /&gt;
* [[Astrath]] – Main library page&lt;br /&gt;
* [[DxWindow:new]] – Page for window element reference&lt;br /&gt;
* [[DxLabel:new]] – Page for label element reference&lt;br /&gt;
* [[onClientRender]] – Event used to render DX elements&lt;/div&gt;</summary>
		<author><name>Sybellex</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/Astrath:createRadio</id>
		<title>Astrath:createRadio</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/Astrath:createRadio"/>
		<updated>2025-10-22T20:15:27Z</updated>

		<summary type="html">&lt;p&gt;Sybellex: Created page with &amp;quot;= DxRadio:new =  {{Client function}} {{FuncDef|element DxRadio:new ( string text, float posX, float posY, float width, float height, element parent, boolean relative, string key, string font, float fontsize )}}  '''Description:''' Creates a new DX-based radio button element. Radio buttons are single-select controls grouped by a key, allowing only one selection per group. Each radio instance is automatically registered in the DX library.  '''Parameters:''' * text (string)...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DxRadio:new =&lt;br /&gt;
&lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{FuncDef|element DxRadio:new ( string text, float posX, float posY, float width, float height, element parent, boolean relative, string key, string font, float fontsize )}}&lt;br /&gt;
&lt;br /&gt;
'''Description:'''&lt;br /&gt;
Creates a new DX-based radio button element. Radio buttons are single-select controls grouped by a key, allowing only one selection per group. Each radio instance is automatically registered in the DX library.&lt;br /&gt;
&lt;br /&gt;
'''Parameters:'''&lt;br /&gt;
* text (string) – Label text for the radio button (optional, default: &amp;quot;radiobutton&amp;quot;).&lt;br /&gt;
* posX, posY (float) – Position on screen.&lt;br /&gt;
* width, height (float) – Size of the radio button.&lt;br /&gt;
* parent (element) – Parent DX element to attach this radio button to (optional).&lt;br /&gt;
* relative (boolean) – Position relative to parent (optional).&lt;br /&gt;
* key (string) – Group key to identify radio button group (optional, default: &amp;quot;Default&amp;quot;).&lt;br /&gt;
* font (string) – Font used for text (optional, default: &amp;quot;default-bold&amp;quot;).&lt;br /&gt;
* fontsize (float) – Font size multiplier (optional, default: 1).&lt;br /&gt;
&lt;br /&gt;
'''Returns:'''&lt;br /&gt;
: Returns the newly created DxRadio element.&lt;br /&gt;
&lt;br /&gt;
'''Methods:'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; border:none;&amp;quot;&lt;br /&gt;
! Method !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ath:destroy() || Destroys the radio element and all its child elements.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setVisible(boolean) || Shows or hides the radio button.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setEnabled(boolean) || Enables or disables the radio button for interaction.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setSelected() || Selects this radio button and deselects others in the same group.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:getSelected() || Returns whether this radio button is selected.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setHoverable(boolean) || Enables or disables hover effect.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setColor(r, g, b, a, type) || Sets main, hover, or selected color of the radio button.&lt;br /&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;
local myRadio = DxRadio:new(&amp;quot;Option 1&amp;quot;, 100, 100, 150, 30)&lt;br /&gt;
&lt;br /&gt;
myRadio:setVisible(true)&lt;br /&gt;
myRadio:setHoverable(true)&lt;br /&gt;
myRadio:setColor(200, 200, 200, 200, &amp;quot;mainColor&amp;quot;)&lt;br /&gt;
myRadio:setColor(30, 30, 30, 255, &amp;quot;selectColor&amp;quot;)&lt;br /&gt;
myRadio:setSelected()&lt;br /&gt;
myRadio:draw()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''See also:'''&lt;br /&gt;
* [[Astrath]] – Main library page&lt;br /&gt;
* [[DxWindow:new]] – Page for window element reference&lt;br /&gt;
* [[DxLabel:new]] – Page for label element reference&lt;br /&gt;
* [[onClientRender]] – Event used to render DX elements&lt;/div&gt;</summary>
		<author><name>Sybellex</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/Astrath:createMemo</id>
		<title>Astrath:createMemo</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/Astrath:createMemo"/>
		<updated>2025-10-22T20:14:10Z</updated>

		<summary type="html">&lt;p&gt;Sybellex: Created page with &amp;quot;= DxMemo:new =  {{Client function}} {{FuncDef|element DxMemo:new ( string text, float posX, float posY, float width, float height, element parent, boolean relative, string font, float fontsize )}}  '''Description:''' Creates a new DX-based memo element. Memos are multi-line text boxes that support scrolling, cursor positioning, text input, custom fonts, colors, and read-only mode. Each memo instance is automatically registered in the DX library.  '''Parameters:''' * text...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DxMemo:new =&lt;br /&gt;
&lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{FuncDef|element DxMemo:new ( string text, float posX, float posY, float width, float height, element parent, boolean relative, string font, float fontsize )}}&lt;br /&gt;
&lt;br /&gt;
'''Description:'''&lt;br /&gt;
Creates a new DX-based memo element. Memos are multi-line text boxes that support scrolling, cursor positioning, text input, custom fonts, colors, and read-only mode. Each memo instance is automatically registered in the DX library.&lt;br /&gt;
&lt;br /&gt;
'''Parameters:'''&lt;br /&gt;
* text (string) – Initial text content for the memo (optional).&lt;br /&gt;
* posX, posY (float) – Position on screen.&lt;br /&gt;
* width, height (float) – Size of the memo.&lt;br /&gt;
* parent (element) – Parent DX element to attach this memo to (optional).&lt;br /&gt;
* relative (boolean) – Position relative to parent (optional).&lt;br /&gt;
* font (string) – Font used for the text (optional, default: &amp;quot;default-bold&amp;quot;).&lt;br /&gt;
* fontsize (float) – Font size multiplier (optional, default: 1).&lt;br /&gt;
&lt;br /&gt;
'''Returns:'''&lt;br /&gt;
: Returns the newly created DxMemo element.&lt;br /&gt;
&lt;br /&gt;
'''Methods:'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; border:none;&amp;quot;&lt;br /&gt;
! Method !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ath:destroy() || Destroys the memo element and all its child elements.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setVisible(boolean) || Shows or hides the memo.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setEnabled(boolean) || Enables or disables the memo for interaction.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setText(string) || Sets the memo text.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:getText() || Returns the current memo text.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:clear() || Clears all text and resets the cursor.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setReadOnly(boolean) || Enables or disables read-only mode.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:getReadOnly() || Returns whether the memo is read-only.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setHoverable(boolean) || Enables or disables hover effect.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setColor(r, g, b, a, type) || Sets the main or hover background color.&lt;br /&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;
local myMemo = DxMemo:new(&amp;quot;Hello World&amp;quot;, 100, 100, 300, 200)&lt;br /&gt;
&lt;br /&gt;
myMemo:setVisible(true)&lt;br /&gt;
myMemo:setReadOnly(false)&lt;br /&gt;
myMemo:setHoverable(true)&lt;br /&gt;
myMemo:setColor(255, 255, 255, 255, &amp;quot;mainColor&amp;quot;)&lt;br /&gt;
myMemo:setText(&amp;quot;Welcome to MTA DX Memo&amp;quot;)&lt;br /&gt;
myMemo:draw()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''See also:'''&lt;br /&gt;
* [[Astrath]] – Main library page&lt;br /&gt;
* [[DxWindow:new]] – Page for window element reference&lt;br /&gt;
* [[DxLabel:new]] – Page for label element reference&lt;br /&gt;
* [[onClientRender]] – Event used to render DX elements&lt;/div&gt;</summary>
		<author><name>Sybellex</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/Astrath:createLabel</id>
		<title>Astrath:createLabel</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/Astrath:createLabel"/>
		<updated>2025-10-22T20:12:06Z</updated>

		<summary type="html">&lt;p&gt;Sybellex: Created page with &amp;quot;= DxLabel:new =  {{Client function}} {{FuncDef|element DxLabel:new ( string text, float posX, float posY, float width, float height, element parent, boolean relative, string font, float fontsize, string horizontalAlign, string verticalAlign )}}  '''Description:''' Creates a new DX-based label element. Labels display text, support parent-relative positioning, custom fonts, colors, alignment, and optional hover effects. Each label instance is automatically registered in th...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DxLabel:new =&lt;br /&gt;
&lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{FuncDef|element DxLabel:new ( string text, float posX, float posY, float width, float height, element parent, boolean relative, string font, float fontsize, string horizontalAlign, string verticalAlign )}}&lt;br /&gt;
&lt;br /&gt;
'''Description:'''&lt;br /&gt;
Creates a new DX-based label element. Labels display text, support parent-relative positioning, custom fonts, colors, alignment, and optional hover effects. Each label instance is automatically registered in the DX library.&lt;br /&gt;
&lt;br /&gt;
'''Parameters:'''&lt;br /&gt;
* text (string) – Text to display in the label.&lt;br /&gt;
* posX, posY (float) – Position on screen.&lt;br /&gt;
* width, height (float) – Size of the label.&lt;br /&gt;
* parent (element) – Parent DX element to attach this label to (optional).&lt;br /&gt;
* relative (boolean) – Position relative to parent (optional).&lt;br /&gt;
* font (string) – Font used for the text (optional, default: &amp;quot;default-bold&amp;quot;).&lt;br /&gt;
* fontsize (float) – Font size multiplier (optional, default: 1).&lt;br /&gt;
* horizontalAlign (string) – Horizontal alignment (&amp;quot;left&amp;quot;, &amp;quot;center&amp;quot;, &amp;quot;right&amp;quot;, optional, default: &amp;quot;center&amp;quot;).&lt;br /&gt;
* verticalAlign (string) – Vertical alignment (&amp;quot;top&amp;quot;, &amp;quot;center&amp;quot;, &amp;quot;bottom&amp;quot;, optional, default: &amp;quot;center&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
'''Returns:'''&lt;br /&gt;
: Returns the newly created DxLabel element.&lt;br /&gt;
&lt;br /&gt;
'''Methods:'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; border:none;&amp;quot;&lt;br /&gt;
! Method !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ath:destroy() || Destroys the label element and all its child elements.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setVisible(boolean) || Shows or hides the label.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setEnabled(boolean) || Enables or disables the label for interaction.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setText(string) || Sets the label text.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:getText() || Returns the current label text.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setFont(string) || Changes the label font.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setHoverable(boolean) || Enables or disables hover effect.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setColor(r, g, b, a, type) || Sets the main or hover text color.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setHorizontalAlign(string) || Sets horizontal alignment of the text.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setVerticalAlign(string) || Sets vertical alignment of the text.&lt;br /&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;
local myLabel = DxLabel:new(&amp;quot;Hello World&amp;quot;, 100, 100, 200, 50)&lt;br /&gt;
&lt;br /&gt;
myLabel:setVisible(true)&lt;br /&gt;
myLabel:setHoverable(true)&lt;br /&gt;
myLabel:setText(&amp;quot;Welcome&amp;quot;)&lt;br /&gt;
myLabel:setColor(255, 200, 0, 255, &amp;quot;mainColor&amp;quot;)&lt;br /&gt;
myLabel:setHorizontalAlign(&amp;quot;center&amp;quot;)&lt;br /&gt;
myLabel:setVerticalAlign(&amp;quot;center&amp;quot;)&lt;br /&gt;
myLabel:draw()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''See also:'''&lt;br /&gt;
* [[Astrath]] – Main library page&lt;br /&gt;
* [[DxWindow:new]] – Page for window element reference&lt;br /&gt;
* [[DxButton:new]] – Page for button element reference&lt;br /&gt;
* [[onClientRender]] – Event used to render DX elements&lt;/div&gt;</summary>
		<author><name>Sybellex</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/Astrath:createImage</id>
		<title>Astrath:createImage</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/Astrath:createImage"/>
		<updated>2025-10-22T19:59:06Z</updated>

		<summary type="html">&lt;p&gt;Sybellex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DxImage:new =&lt;br /&gt;
&lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{FuncDef|element DxImage:new ( string path, float posX, float posY, float width, float height, element parent, boolean relative )}}&lt;br /&gt;
&lt;br /&gt;
'''Description:'''&lt;br /&gt;
Creates a new DX-based image element. Images can be attached to parent elements, support transparency, custom styles, and optional parent-relative positioning. Each image instance is automatically registered in the DX library.&lt;br /&gt;
&lt;br /&gt;
'''Parameters:'''&lt;br /&gt;
* path (string) – Path to the image file. Must exist.&lt;br /&gt;
* posX, posY (float) – Position on screen.&lt;br /&gt;
* width, height (float) – Size of the image.&lt;br /&gt;
* parent (element) – Parent DX element to attach this image to (optional).&lt;br /&gt;
* relative (boolean) – Position relative to parent (optional).&lt;br /&gt;
&lt;br /&gt;
'''Returns:'''&lt;br /&gt;
: Returns the newly created DxImage element.&lt;br /&gt;
&lt;br /&gt;
'''Methods:'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; border:none;&amp;quot;&lt;br /&gt;
! Method !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ath:destroy() || Destroys the image element and all its child elements.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setVisible(boolean) || Shows or hides the image.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setEnabled(boolean) || Enables or disables the image for interaction.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setAlpha(number) || Sets the image transparency (0–255).&lt;br /&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;
local myImage = DxImage:new(&amp;quot;images/logo.png&amp;quot;, 100, 100, 200, 150)&lt;br /&gt;
&lt;br /&gt;
myImage:setVisible(true)&lt;br /&gt;
myImage:setAlpha(200)&lt;br /&gt;
myImage:setPath(&amp;quot;images/new_logo.png&amp;quot;)&lt;br /&gt;
myImage:draw()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''See also:'''&lt;br /&gt;
* [[Astrath]] – Main library page&lt;br /&gt;
* [[DxWindow:new]] – Page for window element reference&lt;br /&gt;
* [[DxLabel:new]] – Page for label element reference&lt;br /&gt;
* [[onClientRender]] – Event used to render DX elements&lt;/div&gt;</summary>
		<author><name>Sybellex</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/Astrath:createHidden</id>
		<title>Astrath:createHidden</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/Astrath:createHidden"/>
		<updated>2025-10-22T19:56:22Z</updated>

		<summary type="html">&lt;p&gt;Sybellex: Created page with &amp;quot;= DxHidden:new =   {{Client function}} {{FuncDef|element DxHidden:new ( float posX, float posY, float width, float height, element parent, boolean relative )}}  '''Description:''' Creates a hidden DX element. Hidden elements are not drawn and can be used as containers or invisible parents for other DX elements. They can store position and size information and manage child elements.  '''Parameters:''' * posX, posY (float) – Position on screen. * width, height (float)...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DxHidden:new =&lt;br /&gt;
 &lt;br /&gt;
{{Client function}} {{FuncDef|element DxHidden:new ( float posX, float posY, float width, float height, element parent, boolean relative )}}&lt;br /&gt;
&lt;br /&gt;
'''Description:'''&lt;br /&gt;
Creates a hidden DX element. Hidden elements are not drawn and can be used as containers or invisible parents for other DX elements. They can store position and size information and manage child elements.&lt;br /&gt;
&lt;br /&gt;
'''Parameters:'''&lt;br /&gt;
* posX, posY (float) – Position on screen.&lt;br /&gt;
* width, height (float) – Size of the hidden element.&lt;br /&gt;
* parent (element) – Parent DX element to attach this hidden element to (optional).&lt;br /&gt;
* relative (boolean) – Position relative to parent (optional).&lt;br /&gt;
&lt;br /&gt;
'''Returns:'''&lt;br /&gt;
: Returns the newly created DxHidden element.&lt;br /&gt;
&lt;br /&gt;
'''Methods:'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; border:none;&amp;quot;&lt;br /&gt;
! Method !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ath:destroy() || Destroys the hidden element and all its child elements.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setVisible(boolean) || Sets the visibility state of the hidden element (mostly for management, as hidden elements are not drawn).&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setEnabled(boolean) || Enables or disables the element for internal logic or child interaction.&lt;br /&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;
-- Create a hidden element at position 100x100 with size 200x200&lt;br /&gt;
local hidden = DxHidden:new(100, 100, 200, 200)&lt;br /&gt;
&lt;br /&gt;
-- Set it invisible (default, but can be toggled)&lt;br /&gt;
hidden:setVisible(false)&lt;br /&gt;
&lt;br /&gt;
-- Enable it for internal logic&lt;br /&gt;
hidden:setEnabled(true)&lt;br /&gt;
&lt;br /&gt;
-- Use as parent for other DX elements&lt;br /&gt;
local btn = DxButton:new(&amp;quot;Click Me&amp;quot;, 10, 10, 100, 40, hidden)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''See also:'''&lt;br /&gt;
* [[Astrath]] – Main library page&lt;br /&gt;
* [[DxWindow:new]] – Example of visible container element&lt;br /&gt;
* [[DxButton:new]] – Example of child element&lt;/div&gt;</summary>
		<author><name>Sybellex</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/Astrath:createGridList</id>
		<title>Astrath:createGridList</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/Astrath:createGridList"/>
		<updated>2025-10-22T19:52:02Z</updated>

		<summary type="html">&lt;p&gt;Sybellex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DxEdit:new =&lt;br /&gt;
{{Client function}} {{FuncDef|element DxGridlist:new ( float posX, float posY, float width, float height, element parent, boolean relative, table columnSize, string font, float fontSize, table color, table headColor, table hoverColor, table activeColor, table scrollColor, table scrollBGColor )}}&lt;br /&gt;
&lt;br /&gt;
'''Description:'''&lt;br /&gt;
Creates a new DX-based gridlist element. Gridlists display rows and columns of data, support scrolling, hover effects, row selection, and customizable colors and fonts. Each gridlist instance is automatically registered in the DX library.&lt;br /&gt;
&lt;br /&gt;
'''Parameters:'''&lt;br /&gt;
* posX, posY (float) – Position on screen.&lt;br /&gt;
* width, height (float) – Size of the gridlist.&lt;br /&gt;
* parent (element) – Parent DX element to attach this gridlist to (optional).&lt;br /&gt;
* relative (boolean) – Position relative to parent (optional).&lt;br /&gt;
* columnSize (table / number / 'auto') – Width of columns, can be 'auto' to divide evenly.&lt;br /&gt;
* font (string) – Font used for text (optional, default: &amp;quot;default-bold&amp;quot;).&lt;br /&gt;
* fontSize (float) – Font size multiplier (optional, default: 1).&lt;br /&gt;
* color, headColor, hoverColor, activeColor (table / tocolor) – Main, header, hover, and active row colors (optional).&lt;br /&gt;
* scrollColor, scrollBGColor (table / tocolor) – Scrollbar colors (optional).&lt;br /&gt;
&lt;br /&gt;
'''Returns:'''&lt;br /&gt;
: Returns the newly created DxGridlist element.&lt;br /&gt;
&lt;br /&gt;
'''Methods:'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; border:none;&amp;quot;&lt;br /&gt;
! Method !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ath:destroy() || Destroys the gridlist and all its child elements.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setVisible(boolean) || Shows or hides the gridlist.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setEnabled(boolean) || Enables or disables the gridlist for interaction.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:addColumn(title, textAlign, columnSize) || Adds a new column with optional alignment and width.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:addRow(...) || Adds a new row with the given items.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:clear() || Clears all rows from the gridlist.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setColumnTitle(idOrName, newTitle) || Changes the title of a column by ID or name.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setItemText(columnID, rowID, text) || Sets the text of a specific cell.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:getItemText(columnID, rowID) || Returns the text of a specific cell.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:getColumnCount() || Returns the total number of columns.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:getRowCount() || Returns the total number of rows.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:removeColumn(columnID) || Removes a column by its ID.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:removeRow(rowID) || Removes a row by its ID.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:getRowText(columnID, rowID) || Returns the text of a cell at a given row and column.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:getSelectedRowID() || Returns the currently selected row ID.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:getSelectedRowItem() || Returns all items in the currently selected row.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setSelectedRowID(id) || Sets the selected row by ID.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:addChildDxElement(element) || Adds a child element to the gridlist.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setHoverable(boolean) || Enables or disables hover effect.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setColor(r, g, b, a, type) || Sets colors for main, hover, header, active, or scroll elements.&lt;br /&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;
-- Create a gridlist at position 200x150 with size 400x300&lt;br /&gt;
local myGrid = DxGridlist:new(200, 150, 400, 300)&lt;br /&gt;
&lt;br /&gt;
-- Add columns&lt;br /&gt;
myGrid:addColumn(&amp;quot;ID&amp;quot;, &amp;quot;center&amp;quot;, 0.1)&lt;br /&gt;
myGrid:addColumn(&amp;quot;Name&amp;quot;, &amp;quot;left&amp;quot;, 0.45)&lt;br /&gt;
myGrid:addColumn(&amp;quot;Score&amp;quot;, &amp;quot;right&amp;quot;, 0.45)&lt;br /&gt;
&lt;br /&gt;
-- Add rows&lt;br /&gt;
myGrid:addRow(1, &amp;quot;Alice&amp;quot;, 95)&lt;br /&gt;
myGrid:addRow(2, &amp;quot;Bob&amp;quot;, 88)&lt;br /&gt;
myGrid:addRow(3, &amp;quot;Charlie&amp;quot;, 76)&lt;br /&gt;
&lt;br /&gt;
-- Set selected row&lt;br /&gt;
myGrid:setSelectedRowID(2)&lt;br /&gt;
&lt;br /&gt;
-- Change main color&lt;br /&gt;
myGrid:setColor(50, 50, 50, 255, &amp;quot;mainColor&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''See also:'''&lt;br /&gt;
* [[Astrath]] – Main library page&lt;br /&gt;
* [[DxButton:new]] – Page for button element reference&lt;br /&gt;
* [[DxCombobox:new]] – Page for combobox element reference&lt;br /&gt;
* [[onClientRender]] – Event used to render DX elements&lt;/div&gt;</summary>
		<author><name>Sybellex</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/Astrath:createEditBox</id>
		<title>Astrath:createEditBox</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/Astrath:createEditBox"/>
		<updated>2025-10-22T19:48:22Z</updated>

		<summary type="html">&lt;p&gt;Sybellex: Created page with &amp;quot;= DxEdit:new / Astrath:createEditBox =  {{Client function}} {{FuncDef|element DxEdit:new ( string text, float posX, float posY, float width, float height, element parent, boolean relative, string font, float fontsize, string placeholder )}}  '''Description:''' Creates a new DX-based edit box element. Edit boxes allow text input with options for read-only mode, numeric-only input, hover effects, and color customization. Each edit box instance is automatically registered i...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DxEdit:new / Astrath:createEditBox =&lt;br /&gt;
&lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{FuncDef|element DxEdit:new ( string text, float posX, float posY, float width, float height, element parent, boolean relative, string font, float fontsize, string placeholder )}}&lt;br /&gt;
&lt;br /&gt;
'''Description:'''&lt;br /&gt;
Creates a new DX-based edit box element. Edit boxes allow text input with options for read-only mode, numeric-only input, hover effects, and color customization. Each edit box instance is automatically registered in the DX library.&lt;br /&gt;
&lt;br /&gt;
'''Parameters:'''&lt;br /&gt;
* text (string) – Initial text for the edit box (optional).&lt;br /&gt;
* posX, posY (float) – Position on screen.&lt;br /&gt;
* width, height (float) – Size of the edit box.&lt;br /&gt;
* parent (element) – Parent DX element to attach this edit box to (optional).&lt;br /&gt;
* relative (boolean) – Position relative to parent (optional).&lt;br /&gt;
* font (string) – Font used for the text (optional, default: &amp;quot;default-bold&amp;quot;).&lt;br /&gt;
* fontsize (float) – Font size multiplier (optional, default: 1).&lt;br /&gt;
* placeholder (string) – Placeholder text when the edit box is empty (optional).&lt;br /&gt;
&lt;br /&gt;
'''Returns:'''&lt;br /&gt;
: Returns the newly created DxEdit element.&lt;br /&gt;
&lt;br /&gt;
'''Methods:'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; border:none;&amp;quot;&lt;br /&gt;
! Method !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ath:destroy() || Destroys the edit box and all its child elements.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:clear() || Clears all text and resets the cursor.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setVisible(boolean) || Shows or hides the edit box.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setEnabled(boolean) || Enables or disables the edit box for interaction.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setReadOnly(boolean) || Enables or disables read-only mode.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setNumericOnly(boolean) || Enables numeric-only input.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:getReadOnly() || Returns whether the edit box is in read-only mode.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setText(string) || Sets the text of the edit box.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:getText() || Returns the current text of the edit box.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setHoverable(boolean) || Enables or disables hover effect.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setColor(r, g, b, a, type) || Sets the main background or hover color of the edit box.&lt;br /&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;
-- Create an edit box at position 400x200 with size 200x25&lt;br /&gt;
local myEdit = DxEdit:new(&amp;quot;&amp;quot;, 400, 200, 200, 25)&lt;br /&gt;
&lt;br /&gt;
-- Set placeholder text&lt;br /&gt;
myEdit.placeholder = &amp;quot;Enter your name...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
-- Enable numeric only&lt;br /&gt;
myEdit:setNumericOnly(true)&lt;br /&gt;
&lt;br /&gt;
-- Show edit box and enable hover&lt;br /&gt;
myEdit:setVisible(true)&lt;br /&gt;
myEdit:setHoverable(true)&lt;br /&gt;
&lt;br /&gt;
-- Set background color to light grey&lt;br /&gt;
myEdit:setColor(200, 200, 200, 255, &amp;quot;mainColor&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''See also:'''&lt;br /&gt;
* [[Astrath]] – Main library page&lt;br /&gt;
* [[DxButton:new]] – Page for button element reference&lt;br /&gt;
* [[DxCheckbox:new]] – Page for checkbox element reference&lt;br /&gt;
* [[DxCombobox:new]] – Page for combobox element reference&lt;br /&gt;
* [[onClientRender]] – Event used to render DX elements&lt;/div&gt;</summary>
		<author><name>Sybellex</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/Astrath:createComboBox</id>
		<title>Astrath:createComboBox</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/Astrath:createComboBox"/>
		<updated>2025-10-22T19:43:32Z</updated>

		<summary type="html">&lt;p&gt;Sybellex: /* DxCombobox:new / Astrath:createCombobox */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DxCombobox:new =&lt;br /&gt;
&lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{FuncDef|element DxCombobox:new ( string text, float posX, float posY, float width, float height, element parent, boolean relative, string desc, number maxItems, table color, string font, float fontSize, table scrollColor, table scrollBGColor )}}&lt;br /&gt;
&lt;br /&gt;
'''Description:'''&lt;br /&gt;
Creates a new DX-based combobox element. Comboboxes allow selecting from a list of items, support scrolling, hover effects, and color customization. Each combobox instance is automatically registered in the DX library.&lt;br /&gt;
&lt;br /&gt;
'''Parameters:'''&lt;br /&gt;
* text (string) – The default text displayed on the combobox.&lt;br /&gt;
* posX, posY (float) – Position on screen.&lt;br /&gt;
* width, height (float) – Size of the combobox.&lt;br /&gt;
* parent (element) – Parent DX element to attach this combobox to (optional).&lt;br /&gt;
* relative (boolean) – Position relative to parent (optional).&lt;br /&gt;
* desc (string) – Default placeholder text when no item is selected (optional).&lt;br /&gt;
* maxItems (number) – Maximum number of items displayed at once (optional, default: 10).&lt;br /&gt;
* color (table / tocolor) – Base color for bar, button, and body (optional).&lt;br /&gt;
* font (string) – Font used for text (optional, default: &amp;quot;default-bold&amp;quot;).&lt;br /&gt;
* fontSize (float) – Font size multiplier (optional, default: 1).&lt;br /&gt;
* scrollColor, scrollBGColor (table / tocolor) – Scrollbar colors (optional).&lt;br /&gt;
&lt;br /&gt;
'''Returns:'''&lt;br /&gt;
: Returns the newly created DxCombobox element.&lt;br /&gt;
&lt;br /&gt;
'''Methods:'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; border:none;&amp;quot;&lt;br /&gt;
! Method !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ath:destroy() || Destroys the combobox and all its child elements.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setVisible(boolean) || Shows or hides the combobox.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setEnabled(boolean) || Enables or disables the combobox for interaction.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setText(string) || Sets the text displayed on the combobox.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:addItem(string) || Adds a new item to the combobox list.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:removeItem(number) || Removes an item from the list by its index.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:clear() || Removes all items from the combobox.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setItemText(number, string) || Updates the text of an item at a given index.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:getItemText(number) || Returns the text of an item by index.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setSelected(number) || Sets the selected item by index.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:getSelected() || Returns the index of the currently selected item.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:getItemCount() || Returns the total number of items in the combobox.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setHoverable(boolean) || Enables or disables hover effect.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setColor(r, g, b, a, type) || Sets the color of bar, button, body, or hover.&lt;br /&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;
-- Create a combobox at position 400x200 with size 150x25&lt;br /&gt;
local myCombo = DxCombobox:new(&amp;quot;Select Item&amp;quot;, 400, 200, 150, 25)&lt;br /&gt;
&lt;br /&gt;
-- Add items&lt;br /&gt;
myCombo:addItem(&amp;quot;Option 1&amp;quot;)&lt;br /&gt;
myCombo:addItem(&amp;quot;Option 2&amp;quot;)&lt;br /&gt;
myCombo:addItem(&amp;quot;Option 3&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- Show combobox and enable hover&lt;br /&gt;
myCombo:setVisible(true)&lt;br /&gt;
myCombo:setHoverable(true)&lt;br /&gt;
&lt;br /&gt;
-- Select second item&lt;br /&gt;
myCombo:setSelected(2)&lt;br /&gt;
&lt;br /&gt;
-- Change bar color&lt;br /&gt;
myCombo:setColor(255, 255, 255, 255, &amp;quot;barColor&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''See also:'''&lt;br /&gt;
* [[Astrath]] – Main library page&lt;br /&gt;
* [[DxButton:new]] – Page for button element reference&lt;br /&gt;
* [[DxCheckbox:new]] – Page for checkbox element reference&lt;br /&gt;
* [[onClientRender]] – Event used to render DX elements&lt;/div&gt;</summary>
		<author><name>Sybellex</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/Astrath:createCheckBox</id>
		<title>Astrath:createCheckBox</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/Astrath:createCheckBox"/>
		<updated>2025-10-22T19:40:13Z</updated>

		<summary type="html">&lt;p&gt;Sybellex: /* DxCheckbox:new / Astrath:createCheckbox */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DxCheckbox:new =&lt;br /&gt;
&lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{FuncDef|element DxCheckbox:new ( string text, float posX, float posY, float width, float height, element parent, boolean relative, string font, float fontsize )}}&lt;br /&gt;
&lt;br /&gt;
'''Description:'''&lt;br /&gt;
Creates a new DX-based checkbox element. Checkboxes can be attached to parent elements, support hover effects, custom colors, and selection state. Each checkbox instance is automatically registered in the DX library.&lt;br /&gt;
&lt;br /&gt;
'''Parameters:'''&lt;br /&gt;
* text (string) – The label text of the checkbox. Defaults to &amp;quot;radio&amp;quot;.&lt;br /&gt;
* posX, posY (float) – Position on screen.&lt;br /&gt;
* width, height (float) – Size of the checkbox.&lt;br /&gt;
* parent (element) – Parent DX element to attach this checkbox to (optional).&lt;br /&gt;
* relative (boolean) – Position relative to parent (optional).&lt;br /&gt;
* font (string) – Font used for text (optional, default: &amp;quot;default-bold&amp;quot;).&lt;br /&gt;
* fontsize (float) – Font size multiplier (optional, default: 1).&lt;br /&gt;
&lt;br /&gt;
'''Returns:'''&lt;br /&gt;
: Returns the newly created DxCheckbox element.&lt;br /&gt;
&lt;br /&gt;
'''Methods:'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; border:none;&amp;quot;&lt;br /&gt;
! Method !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ath:destroy() || Destroys the checkbox and all its child elements.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setVisible(boolean) || Shows or hides the checkbox.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setEnabled(boolean) || Enables or disables the checkbox for interaction.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:isSelected() || Returns whether the checkbox is currently selected.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setSelected(boolean) || Sets the checkbox selection state.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:getSelected() || Returns the current selection state.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setHoverable(boolean) || Enables or disables hover effect.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setColor(r, g, b, a, type) || Sets the main, hover, or select color of the checkbox.&lt;br /&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;
-- Create a checkbox at position 300x400 with size 20x20&lt;br /&gt;
local myCheckbox = DxCheckbox:new(&amp;quot;Accept Terms&amp;quot;, 300, 400, 20, 20)&lt;br /&gt;
&lt;br /&gt;
-- Show the checkbox and enable hover effect&lt;br /&gt;
myCheckbox:setVisible(true)&lt;br /&gt;
myCheckbox:setHoverable(true)&lt;br /&gt;
&lt;br /&gt;
-- Set selection state&lt;br /&gt;
myCheckbox:setSelected(true)&lt;br /&gt;
&lt;br /&gt;
-- Change colors&lt;br /&gt;
myCheckbox:setColor(255, 255, 255, 255, &amp;quot;mainColor&amp;quot;)&lt;br /&gt;
myCheckbox:setColor(0, 255, 0, 200, &amp;quot;hoverColor&amp;quot;)&lt;br /&gt;
myCheckbox:setColor(0, 200, 0, 255, &amp;quot;selectColor&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''See also:'''&lt;br /&gt;
* [[Astrath]] – Main library page&lt;br /&gt;
* [[DxButton:new]] – Page for button element reference&lt;br /&gt;
* [[onClientRender]] – Event used to render DX elements&lt;/div&gt;</summary>
		<author><name>Sybellex</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/Astrath:createButton</id>
		<title>Astrath:createButton</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/Astrath:createButton"/>
		<updated>2025-10-22T19:33:36Z</updated>

		<summary type="html">&lt;p&gt;Sybellex: /* DxButton:new */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DxButton:new =&lt;br /&gt;
&lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{FuncDef|element DxButton:new ( string text, float posX, float posY, float width, float height, element parent, boolean relative, table color, string font, float fontsize, string description, boolean isIcon, float iconWidth, float iconHeight )}}&lt;br /&gt;
&lt;br /&gt;
'''Description:'''&lt;br /&gt;
Creates a new DX-based button element. Buttons can be attached to parent elements, support hover effects, custom colors, icons, fonts, and descriptions. Each button instance is automatically registered in the DX library.&lt;br /&gt;
&lt;br /&gt;
'''Parameters:'''&lt;br /&gt;
* text (string) – The button label text. Defaults to &amp;quot;Button&amp;quot;.&lt;br /&gt;
* posX, posY (float) – Position on screen.&lt;br /&gt;
* width, height (float) – Size of the button.&lt;br /&gt;
* parent (element) – Parent DX element to attach this button to (optional).&lt;br /&gt;
* relative (boolean) – Position relative to parent (optional).&lt;br /&gt;
* color (table / tocolor) – Main background color (optional).&lt;br /&gt;
* font (string) – Font used for text (optional, default: &amp;quot;default-bold&amp;quot;).&lt;br /&gt;
* fontsize (float) – Font size multiplier (optional, default: 1).&lt;br /&gt;
* description (string) – Optional description text.&lt;br /&gt;
* isIcon (boolean) – If true, the button will display an icon instead of text.&lt;br /&gt;
* iconWidth, iconHeight (float) – Size of the icon relative to the button (optional).&lt;br /&gt;
&lt;br /&gt;
'''Returns:'''&lt;br /&gt;
: Returns the newly created DxButton element.&lt;br /&gt;
&lt;br /&gt;
'''Methods:'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; border:none;&amp;quot;&lt;br /&gt;
! Method !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ath:destroy() || Destroys the button and all its child elements.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setVisible(boolean) || Shows or hides the button.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setEnabled(boolean) || Enables or disables the button for interaction.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setText(string) || Sets the button text.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:getText() || Returns the current button text.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setDescription(string) || Sets the button description.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setHoverable(boolean) || Enables or disables hover effect.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setColor(r, g, b, a, type) || Sets the main or hover color of the button.&lt;br /&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;
-- Create a button at position 200x300 with size 150x50&lt;br /&gt;
local myButton = DxButton:new(&amp;quot;Click Me&amp;quot;, 200, 300, 150, 50)&lt;br /&gt;
&lt;br /&gt;
-- Show the button and enable hover effect&lt;br /&gt;
myButton:setVisible(true)&lt;br /&gt;
myButton:setHoverable(true)&lt;br /&gt;
&lt;br /&gt;
-- Change text and color&lt;br /&gt;
myButton:setText(&amp;quot;Press Me&amp;quot;)&lt;br /&gt;
myButton:setColor(255, 0, 0, 255, &amp;quot;mainColor&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''See also:'''&lt;br /&gt;
* [[Astrath]] – Main library page&lt;br /&gt;
* [[DxWindow:new]] – Page for window element reference&lt;br /&gt;
* [[DxLabel:new]] – Page for label element reference&lt;br /&gt;
* [[onClientRender]] – Event used to render DX elements&lt;/div&gt;</summary>
		<author><name>Sybellex</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/Astrath:createWindow</id>
		<title>Astrath:createWindow</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/Astrath:createWindow"/>
		<updated>2025-10-22T18:49:37Z</updated>

		<summary type="html">&lt;p&gt;Sybellex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DxWindow:new=&lt;br /&gt;
&lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{FuncDef|element DxWindow:new ( string title, float posX, float posY, float width, float height, table color, element parent, boolean relative, boolean header, float headerSize, table headerColor, string font, float fontsize )}}&lt;br /&gt;
&lt;br /&gt;
'''Description:'''&lt;br /&gt;
Creates a new DX-based window element. The window can contain child DX elements, supports customization of colors, fonts, header, and can be attached to a parent element. Each window instance is automatically registered in the DX library for rendering and management.&lt;br /&gt;
&lt;br /&gt;
'''Parameters:'''&lt;br /&gt;
* title (string) – The title text displayed on the window. Defaults to &amp;quot;New window&amp;quot; if not provided.&lt;br /&gt;
* posX (float) – X position on screen.&lt;br /&gt;
* posY (float) – Y position on screen.&lt;br /&gt;
* width (float) – Width of the window.&lt;br /&gt;
* height (float) – Height of the window.&lt;br /&gt;
* color (table / tocolor) – Main background color in RGBA. Optional.&lt;br /&gt;
* parent (element) – Parent DX element to attach this window to. Optional.&lt;br /&gt;
* relative (boolean) – If true, position will be calculated relative to parent. Optional.&lt;br /&gt;
* header (boolean) – If true, the window will display a header. Optional.&lt;br /&gt;
* headerSize (float) – Relative size of the header. Defaults to 5% of height.&lt;br /&gt;
* headerColor (table / tocolor) – Header color in RGBA. Defaults to tocolor(91, 57, 219, 255).&lt;br /&gt;
* font (string) – Font used for title text. Defaults to &amp;quot;default-bold&amp;quot;.&lt;br /&gt;
* fontsize (float) – Font size multiplier. Defaults to 1.&lt;br /&gt;
&lt;br /&gt;
'''Returns:'''&lt;br /&gt;
: Returns the newly created DX window element (DxWindow instance).&lt;br /&gt;
&lt;br /&gt;
== Methods ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; border:none;&amp;quot;&lt;br /&gt;
! Method !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Ath:destroy() || Destroys the window and all its child elements.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setTitle(title) || Sets a new title for the window.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setMovable(boolean) || Enables or disables window movement.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setVisible(boolean) || Shows or hides the window.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setEnabled(boolean) || Enables or disables window for interaction.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setHoverable(boolean) || Enables or disables hover effect.&lt;br /&gt;
|-&lt;br /&gt;
| Ath:setColor(r, g, b, a, type) || Sets the main or hover color of the window.&lt;br /&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;
-- Create a window at position 200x200 with size 300x200&lt;br /&gt;
local myWindow = DxWindow:new(&lt;br /&gt;
    &amp;quot;My Window&amp;quot;, 200, 200, 300, 200, tocolor(50, 50, 50, 255), nil, false, true, 0.05, nil, &amp;quot;default-bold&amp;quot;, 1&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
-- Show window and enable hover&lt;br /&gt;
myWindow:setVisible(true)&lt;br /&gt;
myWindow:setHoverable(true)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''See also:'''&lt;br /&gt;
* [[DxButton:new]] – For creating buttons inside windows&lt;br /&gt;
* [[DxLabel:new]] – For adding text labels&lt;br /&gt;
* [[onClientRender]] – Event used to draw DX elements&lt;br /&gt;
* [[Astrath]] – Main library page&lt;/div&gt;</summary>
		<author><name>Sybellex</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/Astrath</id>
		<title>Astrath</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/Astrath"/>
		<updated>2025-10-15T15:59:02Z</updated>

		<summary type="html">&lt;p&gt;Sybellex: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Astrath =&lt;br /&gt;
&lt;br /&gt;
''Astrath'' is a DirectX framework for MTA:SA developed by '''Magath'''.  &lt;br /&gt;
It provides tools to create custom interfaces, animations, and other DX-based visuals.&lt;br /&gt;
&lt;br /&gt;
== Client Functions ==&lt;br /&gt;
* [[Astrath:createWindow]] – Creates a new DX-based window element&lt;br /&gt;
* [[Astrath:createButton]] – Creates a DX-based button element&lt;br /&gt;
* [[Astrath:createCheckBox]] – Creates a DX-based checkbox element&lt;br /&gt;
* [[Astrath:createComboBox]] – Creates a DX-based combobox element&lt;br /&gt;
* [[Astrath:createEditBox]] – Creates a DX-based editbox element&lt;br /&gt;
* [[Astrath:createGridList]] – Creates a DX-based gridlist element&lt;br /&gt;
* [[Astrath:createHidden]] – Creates a hidden DX element (used as a parent container)&lt;br /&gt;
* [[Astrath:createImage]] – Draws a DX-based image&lt;br /&gt;
* [[Astrath:createLabel]] – Creates a DX-based label element&lt;br /&gt;
* [[Astrath:createMemo]] – Creates a DX-based multi-line text element&lt;br /&gt;
* [[Astrath:createRadio]] – Creates a DX-based radio button element&lt;br /&gt;
* [[Astrath:createShape]] – Creates a drawable rectangle element (can be used as parent)&lt;br /&gt;
* [[Astrath:createTab]] – Creates a DX-based tab element&lt;br /&gt;
* [[Astrath:createTabPanel]] – Creates a container for tabs&lt;br /&gt;
&lt;br /&gt;
== See Also ==&lt;br /&gt;
* [[dxDrawImage]]&lt;br /&gt;
* [[dxDrawText]]&lt;br /&gt;
* [[onClientRender]]&lt;/div&gt;</summary>
		<author><name>Sybellex</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/GetClosestPoint</id>
		<title>GetClosestPoint</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/GetClosestPoint"/>
		<updated>2025-10-13T18:30:05Z</updated>

		<summary type="html">&lt;p&gt;IManGaaX: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Useful Function}} __NOTOC__&lt;br /&gt;
&amp;lt;lowercasetitle&amp;gt;&amp;lt;/lowercasetitle&amp;gt;&lt;br /&gt;
This function finds the closest point from a given element to a list of points in 2D space.&lt;br /&gt;
&lt;br /&gt;
[[Image:GetClosestPoint2.png|thumb|256px|right|[[Image:GetClosestPoint.png|256px|right]]The difference between code No. 1 and code No. 2. The example in the image and below uses code No. 1.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Note|The example in the image and below uses code No. 1.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;float, float, float getClosestPoint( element theElement, table thePoints )&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''theElement''': the element whose position is used as the reference.&lt;br /&gt;
* '''thePoints''': a table containing coordinates in the form {x, y, z}.&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
* Returns three ''float''s indicating the position of the element, ''x'', ''y'' and ''z'' respectively of the closest point.&lt;br /&gt;
&lt;br /&gt;
==Code (1)==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Shared&amp;quot; class=&amp;quot;both&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 getClosestPoint(element, points)&lt;br /&gt;
    local ex, ey, ez = getElementPosition(element)&lt;br /&gt;
    local closestDist = math.huge&lt;br /&gt;
    local closestPoint = nil&lt;br /&gt;
&lt;br /&gt;
    for _, p in ipairs(points) do&lt;br /&gt;
        local dx, dy = p[1] - ex, p[2] - ey&lt;br /&gt;
        local dist = dx*dx + dy*dy&lt;br /&gt;
&lt;br /&gt;
        if dist &amp;lt; closestDist then&lt;br /&gt;
            closestDist = dist&lt;br /&gt;
            closestPoint = p&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return unpack(closestPoint)&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;
==Code (2)==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Shared&amp;quot; class=&amp;quot;both&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 getClosestPoint(element, points)&lt;br /&gt;
    local ex, ey, ez = getElementPosition(element)&lt;br /&gt;
    local closestDist = math.huge&lt;br /&gt;
    local closestPoint = nil&lt;br /&gt;
&lt;br /&gt;
    for i = 1, #points - 1 do&lt;br /&gt;
        local x1, y1, z1 = unpack(points[i])&lt;br /&gt;
        local x2, y2, z2 = unpack(points[i + 1])&lt;br /&gt;
&lt;br /&gt;
        local t = ((ex - x1) * (x2 - x1) + (ey - y1) * (y2 - y1)) / ((x2 - x1)^2 + (y2 - y1)^2)&lt;br /&gt;
        t = math.max(0, math.min(1, t))&lt;br /&gt;
&lt;br /&gt;
        local px, py = x1 + t * (x2 - x1), y1 + t * (y2 - y1)&lt;br /&gt;
        local dist = (ex - px)^2 + (ey - py)^2&lt;br /&gt;
        if dist &amp;lt; closestDist then&lt;br /&gt;
            closestDist = dist&lt;br /&gt;
            closestPoint = {px, py, z1 + t * (z2 - z1)}&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return unpack(closestPoint)&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;
'''Author:''' [[User:IManGaaX|Youssef Maged (iManGaaX)]]&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;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local lanePoints = {&lt;br /&gt;
    {2469.95850, -1675.36279, 14},&lt;br /&gt;
    {2489.37866, -1653.80859, 14},&lt;br /&gt;
    {2508.62891, -1662.11462, 14},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local xyz = {getClosestPoint(localPlayer, lanePoints)} --// Code (1), See the images above&lt;br /&gt;
outputChatBox(&amp;quot;Closest Lane Point: &amp;quot;..table.concat(xyz, &amp;quot;, &amp;quot;))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IManGaaX</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/BR-PT/setElementPosition</id>
		<title>BR-PT/setElementPosition</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/BR-PT/setElementPosition"/>
		<updated>2025-09-05T23:59:06Z</updated>

		<summary type="html">&lt;p&gt;Lettify: Lettify moved page BR-PT/setElementPosition to PT-BR/setElementPosition: Wrongly titled during creation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{BR/Funcao compartilhada}}&lt;br /&gt;
Esta função define a posição de um elemento para as coordenadas especificadas.&lt;br /&gt;
{{BR/Warning|Não use essa função para ''spawnar'' um [[Elemento/Player|jogador]]. Isso vai causar problemas com outras funções, como [[warpPedIntoVehicle]]. Em vez disso, use [[spawnPlayer]].}}&lt;br /&gt;
&lt;br /&gt;
==Sintaxe== &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
bool setElementPosition ( element theElement, float x, float y, float z [, bool warp = true ] )  &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
{{BR/OOP||[[PT-BR/Elemento|elemento]]:setPosition|position|getElementPosition}}&lt;br /&gt;
&lt;br /&gt;
===Argumentos Necessários=== &lt;br /&gt;
*'''theElement:''' Um [[PT-BR/Elemento|elemento]] válido para ser movido.&lt;br /&gt;
*'''x:''' A coordenada '''X''' de destino.&lt;br /&gt;
*'''y:''' A coordenada '''Y''' de destino.&lt;br /&gt;
*'''z:''' A coordenada '''Z''' de destino.&lt;br /&gt;
&lt;br /&gt;
===Argumentos Opcionais===&lt;br /&gt;
*'''warp:''' teletransporta o jogador, resetando qualquer animação que esteja rodando. Definindo esse argumento com ''false'', a animação permanecerá.&lt;br /&gt;
&lt;br /&gt;
===Retorno===&lt;br /&gt;
Retorna ''true'' se foi executado com sucesso, caso contrário retorna ''false''.&lt;br /&gt;
&lt;br /&gt;
==Exemplo==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Server&amp;quot; class=&amp;quot;server&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
Este exemplo permite que os administradores teletransportem 5 jogadores aleatórios para si mesmos&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function randomPlayersToLocation(p)&lt;br /&gt;
    if not isPlayerStaff(p) then return end&lt;br /&gt;
&lt;br /&gt;
	local playersOnline = getElementsByType(&amp;quot;player&amp;quot;)&lt;br /&gt;
	local amount = #playersOnline&lt;br /&gt;
&lt;br /&gt;
	if amount == 0 then return end&lt;br /&gt;
&lt;br /&gt;
	for index = 1,(amount &amp;gt; 5 and 5 or amount) do&lt;br /&gt;
		local player = playersOnline[index]&lt;br /&gt;
		setElementPosition(player, getElementPosition(p))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
addCommandHandler(&amp;quot;randomtp&amp;quot;, randomPlayersToLocation)&lt;br /&gt;
addCommandHandler(&amp;quot;playershere&amp;quot;, randomPlayersToLocation)&lt;br /&gt;
&lt;br /&gt;
-- Utilitário&lt;br /&gt;
local staffACLs = {&lt;br /&gt;
    aclGetGroup(&amp;quot;Admin&amp;quot;),&lt;br /&gt;
    aclGetGroup(&amp;quot;Moderator&amp;quot;)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function isPlayerStaff(p)&lt;br /&gt;
	if isElement(p) and getElementType(p) == &amp;quot;player&amp;quot; and not isGuestAccount(getPlayerAccount(p)) then&lt;br /&gt;
		local object = getAccountName(getPlayerAccount(p))&lt;br /&gt;
&lt;br /&gt;
		for _, group in ipairs(staffACLs) do&lt;br /&gt;
			if isObjectInACLGroup(&amp;quot;user.&amp;quot; .. object, group) then&lt;br /&gt;
				return true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&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;
Se você quiser colocar um veículo ou jogador fora da água ou simular o comportamento de redefinição de posição caso CJ fique muito abaixo do solo, será necessário recuperar uma coordenada recomendada no solo para colocar o elemento. Dê uma olhada [https://forum.mtasa.com/topic/132891-important-helprespawn-vehicle/?do=findComment&amp;amp;comment=1003198 nesse posto do Fórum do MTA] para os passos na direção certa.&lt;br /&gt;
&lt;br /&gt;
==Problemas==&lt;br /&gt;
{{Issues|&lt;br /&gt;
{{Issue|539|Alterar a posição do jogador quando ele/ela tiver um jetpack removerá o jetpack e o bug quando a skin for alterada}}&lt;br /&gt;
{{Issue|529|Jogador cai da bicicleta quando ela é teletransportada por setElementPosition}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Veja também==&lt;br /&gt;
{{Element functions}}&lt;br /&gt;
&lt;br /&gt;
[[hu:setElementPosition]]&lt;br /&gt;
[[ru:setElementPosition]]&lt;/div&gt;</summary>
		<author><name>Lettify</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/GetColorName</id>
		<title>GetColorName</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/GetColorName"/>
		<updated>2025-09-05T11:13:36Z</updated>

		<summary type="html">&lt;p&gt;IManGaaX: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Useful Function}} __NOTOC__&lt;br /&gt;
&amp;lt;lowercasetitle&amp;gt;&amp;lt;/lowercasetitle&amp;gt;&lt;br /&gt;
This function retrieves the nearest color name for a given RGB value using an online API.&lt;br /&gt;
&lt;br /&gt;
{{Note|This function requires an active internet connection and fetches the color name from an external API asynchronously. The result is returned via a callback function.}}&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;getColorName( int r, int g, int b, function callback(name) )&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''r''': Red component (0-255) of the color.&lt;br /&gt;
* '''g''': Green component (0-255) of the color.&lt;br /&gt;
* '''b''': Blue component (0-255) of the color.&lt;br /&gt;
* '''callback''': A function that will receive the color name as a string.&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
* Does not return a value directly.  &lt;br /&gt;
* Calls the 'callback' function with the color name when the API responds.  &lt;br /&gt;
* Possible callback values:&lt;br /&gt;
  * 'Error' if the request failed.&lt;br /&gt;
  * 'Unknown' if the API did not return a valid name.&lt;br /&gt;
  * Color name string, e.g., 'Dark Orange'.&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Server&amp;quot; class=&amp;quot;server&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 getColorName(r, g, b, callback)&lt;br /&gt;
    local url = string.format(&amp;quot;https://www.thecolorapi.com/id?rgb=rgb(%d,%d,%d)&amp;quot;, r, g, b)&lt;br /&gt;
    fetchRemote(url, function(data, errno)&lt;br /&gt;
        if errno == 0 then&lt;br /&gt;
            local result = fromJSON(data)&lt;br /&gt;
            if result and result.name and result.name.value then&lt;br /&gt;
                callback(tostring(result.name.value))&lt;br /&gt;
            else&lt;br /&gt;
                callback(&amp;quot;Unknown&amp;quot;)&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            callback(&amp;quot;Error&amp;quot;)&lt;br /&gt;
        end&lt;br /&gt;
    end, &amp;quot;&amp;quot;, true)&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;
'''Author:''' [[User:IManGaaX|Youssef Maged (iManGaaX)]]&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Server&amp;quot; class=&amp;quot;server&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;
getColorName(255, 127, 0, function(name)&lt;br /&gt;
    outputChatBox(&amp;quot;Color Name: &amp;quot;..name)&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local imangaax = getPlayerFromName(&amp;quot;iManGaaX&amp;quot;)&lt;br /&gt;
local r, g, b = getVehicleColor(getPedOccupiedVehicle(imangaax))&lt;br /&gt;
getColorName(r, g, b, function(name)&lt;br /&gt;
    outputChatBox(&amp;quot;Your Vehicle Color Name: &amp;quot;..name, imangaax)&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- If a player owns a vehicle and you want to retrieve detailed information about the vehicle, such as its color name&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IManGaaX</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/Table.flatten</id>
		<title>Table.flatten</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/Table.flatten"/>
		<updated>2025-09-05T10:12:32Z</updated>

		<summary type="html">&lt;p&gt;IManGaaX: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Useful Function}} __NOTOC__&lt;br /&gt;
&amp;lt;lowercasetitle&amp;gt;&amp;lt;/lowercasetitle&amp;gt;&lt;br /&gt;
This function converts a nested table into a flattened table with concatenated keys.&lt;br /&gt;
&lt;br /&gt;
{{Note|This function recursively traverses all nested subtables and creates a new table where keys represent the original hierarchy using dot notation.}}&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;table table.flatten( table t, [ string prefix = &amp;quot;&amp;quot; ] )&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''t''': the nested table to flatten.&lt;br /&gt;
&lt;br /&gt;
===Optional Arguments===&lt;br /&gt;
{{OptionalArg}}&lt;br /&gt;
* '''prefix''': a string to prepend to all keys (used internally for recursion).&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
* A new table where all nested keys are flattened using dot notation.&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Shared&amp;quot; class=&amp;quot;both&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 table.flatten(t, prefix)&lt;br /&gt;
    local flat = {}&lt;br /&gt;
    prefix = prefix or &amp;quot;&amp;quot;&lt;br /&gt;
    for k,v in pairs(t) do&lt;br /&gt;
        local key = prefix .. k&lt;br /&gt;
        if type(v) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            local sub = table.flatten(v, key..&amp;quot;.&amp;quot;)&lt;br /&gt;
            for sk, sv in pairs(sub) do&lt;br /&gt;
                flat[sk] = sv&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            flat[key] = v&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return flat&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;
'''Author:''' [[User:IManGaaX|Youssef Maged (iManGaaX)]]&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Shared&amp;quot; class=&amp;quot;both&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;
local nestedData = {&lt;br /&gt;
    player = {&lt;br /&gt;
        stats = {&lt;br /&gt;
            hp = 100,&lt;br /&gt;
            mp = 50&lt;br /&gt;
        },&lt;br /&gt;
        level = 5&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local flatData = table.flatten(nestedData)&lt;br /&gt;
for k, v in pairs(flatData) do&lt;br /&gt;
    outputChatBox(k .. &amp;quot; = &amp;quot; .. tostring(v))&lt;br /&gt;
end&lt;br /&gt;
-- Output:&lt;br /&gt;
-- player.stats.hp = 100&lt;br /&gt;
-- player.stats.mp = 50&lt;br /&gt;
-- player.level = 5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IManGaaX</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/GetServerAveragePing</id>
		<title>GetServerAveragePing</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/GetServerAveragePing"/>
		<updated>2025-09-03T00:31:08Z</updated>

		<summary type="html">&lt;p&gt;O22: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Useful Function}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
This function gets average players ping.&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;int getAveragePing( )&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns the average players ping as integer.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Returns '''0''' if no players are online.&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Shared&amp;quot; class=&amp;quot;both&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 getAveragePing()&lt;br /&gt;
    local players = getElementsByType(&amp;quot;player&amp;quot;)&lt;br /&gt;
    if #players == 0 then&lt;br /&gt;
        return 0&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local totalPing = 0&lt;br /&gt;
    for _, player in ipairs(players) do&lt;br /&gt;
        totalPing = totalPing + getPlayerPing(player)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return math.floor(totalPing / #players)&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;
The example shows how to use function.&lt;br /&gt;
&amp;lt;section name=&amp;quot;Shared&amp;quot; class=&amp;quot;both&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;
addCommandHandler(&amp;quot;avgping&amp;quot;, function()&lt;br /&gt;
    local avg = getAveragePing()&lt;br /&gt;
    if avg &amp;gt; 0 then&lt;br /&gt;
        print(&amp;quot;Average Ping: &amp;quot; .. avg .. &amp;quot; ms&amp;quot;)&lt;br /&gt;
    else&lt;br /&gt;
        print(&amp;quot;No players online.&amp;quot;)&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;
&amp;lt;br&amp;gt;&lt;br /&gt;
Author: [https://wiki.multitheftauto.com/wiki/User:O22 omar-o22]&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>O22</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/DgsGIFGetSize</id>
		<title>DgsGIFGetSize</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/DgsGIFGetSize"/>
		<updated>2025-08-23T22:59:08Z</updated>

		<summary type="html">&lt;p&gt;Lettify: Created page with &amp;quot;__NOTOC__  {{Client function}}  Returns the dimensions (width and height) of a GIF element created using dgsCreateGIF. The values correspond to the original size extracted from the GIF file during loading.  ==Syntax==  &amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt; int int dgsGIFGetSize( element gif ) &amp;lt;/syntaxhighlight&amp;gt;   ===Required Arguments=== *'''gif: ''' The '''dgs-dxgif''' type element you want to get the size of.  ===Returns=== Returns two integers corresponding to ''width'' an...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
{{Client function}}&lt;br /&gt;
&lt;br /&gt;
Returns the dimensions (width and height) of a GIF element created using [[dgsCreateGIF]]. The values correspond to the original size extracted from the GIF file during loading.&lt;br /&gt;
&lt;br /&gt;
==Syntax== &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
int int dgsGIFGetSize( element gif )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
*'''gif: ''' The '''dgs-dxgif''' type element you want to get the size of.&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns two integers corresponding to ''width'' and ''height''&lt;br /&gt;
&lt;br /&gt;
==Example== &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- This script should be executed on the client-side&lt;br /&gt;
&lt;br /&gt;
-- Import the DGS functions to use them from another resource&lt;br /&gt;
local DGS = exports.dgs&lt;br /&gt;
&lt;br /&gt;
-- 1. Load the GIF from a file within your resource&lt;br /&gt;
local myAnimatedGif = DGS.dgsCreateGIF(&amp;quot;files/loading.gif&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- 2. Check if the GIF was loaded successfully before proceeding&lt;br /&gt;
if myAnimatedGif then&lt;br /&gt;
    -- 3. Use dgsGIFGetSize to get the width and height of the loaded GIF&lt;br /&gt;
    local width, height = DGS.dgsGIFGetSize(myAnimatedGif)&lt;br /&gt;
&lt;br /&gt;
    -- 4. Display the dimensions in the chat to confirm the result&lt;br /&gt;
    outputChatBox(string.format(&amp;quot;The loaded GIF has the dimensions: %d width by %d height.&amp;quot;, width, height))&lt;br /&gt;
&lt;br /&gt;
    -- 5. Practical example: Create a DGS image in the center of the screen&lt;br /&gt;
    --    using the 'width' and 'height' we just obtained so the size is perfect.&lt;br /&gt;
    local screenW, screenH = guiGetScreenSize()&lt;br /&gt;
    local posX = screenW / 2 - width / 2&lt;br /&gt;
    local posY = screenH / 2 - height / 2&lt;br /&gt;
&lt;br /&gt;
    local gifImage = DGS.dgsCreateImage(posX, posY, width, height, myAnimatedGif, false)&lt;br /&gt;
&lt;br /&gt;
    -- Start the GIF's animation&lt;br /&gt;
    DGS.dgsGIFPlay(myAnimatedGif)&lt;br /&gt;
else&lt;br /&gt;
    -- Inform the user if the GIF was not found or if an error occurred during loading&lt;br /&gt;
    outputChatBox(&amp;quot;Error: Could not load the GIF file.&amp;quot;, 255, 0, 0)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{DGS_Plugin/Gif}}&lt;/div&gt;</summary>
		<author><name>Lettify</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/DgsCreateGIF</id>
		<title>DgsCreateGIF</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/DgsCreateGIF"/>
		<updated>2025-08-23T10:27:29Z</updated>

		<summary type="html">&lt;p&gt;Thisdp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
{{Client function}}&lt;br /&gt;
&lt;br /&gt;
This function creates a GIF interface plugin.&lt;br /&gt;
&lt;br /&gt;
==Syntax== &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
element dgsCreateGIF( string pathOrRaw )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
*'''pathOrRaw: ''' A string representing the path to your GIF file, or the raw GIF data&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns a dgs-dxgif element (DGS Plugin Type)[ dgs-dxgif (Element Type) ] if succeed, ''false'' otherwise&lt;br /&gt;
&lt;br /&gt;
==Example== &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
DGS = exports.dgs --get exported functions from dgs&lt;br /&gt;
&lt;br /&gt;
local gif = DGS:dgsCreateGIF(&amp;quot;test.gif&amp;quot;)&lt;br /&gt;
DGS:dgsGIFPlay(gif,1)  --Play GIF with Speed 1x&lt;br /&gt;
image = DGS:dgsCreateImage(500,500,200,200,gif,false)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{DGS_Plugin/Gif}}&lt;/div&gt;</summary>
		<author><name>Thisdp</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/OnPedWeaponReload</id>
		<title>OnPedWeaponReload</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/OnPedWeaponReload"/>
		<updated>2025-08-17T21:15:59Z</updated>

		<summary type="html">&lt;p&gt;-ffs-PLASMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
{{Server event}}&lt;br /&gt;
{{Added feature/item|1.6.1|1.6.0|22909|Event has been added.}}&lt;br /&gt;
&lt;br /&gt;
This event is triggered when a ped reloads his weapons.&lt;br /&gt;
&lt;br /&gt;
==Parameters== &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
int weapon, int clip, int ammo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''weapon''': an [[int]] representing the [[weapon]] that has been reloaded.&lt;br /&gt;
*'''clip''': an [[int]] representing the [[weapon]] clip size.&lt;br /&gt;
*'''ammo''': an [[int]] representing the [[weapon]] ammo.&lt;br /&gt;
&lt;br /&gt;
==Source==&lt;br /&gt;
The [[event system#Event source|source]] of this event is the [[ped]] that reloaded his weapon.&lt;br /&gt;
&lt;br /&gt;
==Example== &lt;br /&gt;
This example outputs a line to the chat box whenever a ped reloads weapons.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function weaponReload(iWeaponID, iClip, iAmmo)&lt;br /&gt;
    outputChatBox(&amp;quot;A ped reloaded &amp;quot;..getWeaponNameFromID(iWeaponID)..&amp;quot;, clip: &amp;quot;..iClip..&amp;quot;, ammo: &amp;quot;..iAmmo..&amp;quot;!&amp;quot;);&lt;br /&gt;
end&lt;br /&gt;
addEventHandler(&amp;quot;onPedWeaponReload&amp;quot;, root, weaponReload);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{See also/Server event|Ped events}}&lt;/div&gt;</summary>
		<author><name>-ffs-PLASMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/AR/getDiscordRichPresenceUserID</id>
		<title>AR/getDiscordRichPresenceUserID</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/AR/getDiscordRichPresenceUserID"/>
		<updated>2025-08-06T01:39:16Z</updated>

		<summary type="html">&lt;p&gt;O22: Created page with &amp;quot;__NOTOC__  {{Client function}} {{Important Note|ستُعيد الدالة معرف المستخدم بشكل صحيح إذا كان المستخدم قد منح الموافقة مسبقًا ومتصل بتطبيق Rich Presence.}} {{New feature/item|3.0161|1.6.0|22342| تُعيد الدالة معرف مستخدم Discord الخاص بالعميل. }}   ==التركيب==  &amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt; string getDiscordRichPresenceUserID() &amp;lt;/syntaxhighlight&amp;gt;   ===الق...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{Important Note|ستُعيد الدالة معرف المستخدم بشكل صحيح إذا كان المستخدم قد منح الموافقة مسبقًا ومتصل بتطبيق Rich Presence.}}&lt;br /&gt;
{{New feature/item|3.0161|1.6.0|22342|&lt;br /&gt;
تُعيد الدالة معرف مستخدم Discord الخاص بالعميل.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==التركيب== &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
string getDiscordRichPresenceUserID()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===القيم المرجعة===&lt;br /&gt;
ستعيد سلسلة فارغة (&amp;quot;&amp;quot;) إذا لم يمنح المستخدم الموافقة أو قام بتعطيل خيار تزامن Rich Presence. وإلا، ستعيد المعرف كسلسلة نصية.&lt;br /&gt;
&lt;br /&gt;
==مثال==&lt;br /&gt;
يعرض هذا المثال معرف المستخدم الخاص به في الدردشة إذا كان قد منح الإذن بمشاركة البيانات. وإلا، سيظهر له رسالة مناسبة.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
addCommandHandler(&amp;quot;getmyuserid&amp;quot;,&lt;br /&gt;
    function ()&lt;br /&gt;
        if isDiscordRichPresenceConnected() then&lt;br /&gt;
            local id = getDiscordRichPresenceUserID() &lt;br /&gt;
            if id == &amp;quot;&amp;quot; then &lt;br /&gt;
                outputChatBox(&amp;quot;لم تسمح بمشاركة بيانات Discord! قم بمنح الإذن في الإعدادات!&amp;quot;)&lt;br /&gt;
            else &lt;br /&gt;
                outputChatBox(&amp;quot;معرف Discord الخاص بك: &amp;quot;..id)&lt;br /&gt;
            end &lt;br /&gt;
        end &lt;br /&gt;
    end&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==انظر ايضاً==&lt;br /&gt;
{{AR/Client_Discord_functions}}&lt;br /&gt;
&lt;br /&gt;
[[en:IsDiscordRichPresenceConnected]]&lt;br /&gt;
[[de:isDiscordRichPresenceConnected]]&lt;br /&gt;
[[hu:isDiscordRichPresenceConnected]]&lt;br /&gt;
[[pl:isDiscordRichPresenceConnected]]&lt;br /&gt;
[[ro:isDiscordRichPresenceConnected]]&lt;br /&gt;
[[ru:IsDiscordRichPresenceConnected]]&lt;br /&gt;
[[PT-BR:IsDiscordRichPresenceConnected]]&lt;/div&gt;</summary>
		<author><name>O22</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/AR/setDiscordRichPresenceEndTime</id>
		<title>AR/setDiscordRichPresenceEndTime</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/AR/setDiscordRichPresenceEndTime"/>
		<updated>2025-08-06T01:33:46Z</updated>

		<summary type="html">&lt;p&gt;O22: Created page with &amp;quot;__NOTOC__  {{Client function}} {{Important Note|لاستخدام هذه الدالة، يجب عليك إعداد تطبيقك الخاص باستخدام setDiscordApplicationID}} {{New feature/item|3.0161|1.6.0|22276| تقوم هذه الدالة بتعيين الوقت المتبقي في Discord Rich Presence. }}  ==التركيب==  &amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt; bool setDiscordRichPresenceEndTime(int seconds) &amp;lt;/syntaxhighlight&amp;gt;  {{OOP||...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{Important Note|لاستخدام هذه الدالة، يجب عليك إعداد تطبيقك الخاص باستخدام [[AR/setDiscordApplicationID|setDiscordApplicationID]]}}&lt;br /&gt;
{{New feature/item|3.0161|1.6.0|22276|&lt;br /&gt;
تقوم هذه الدالة بتعيين الوقت المتبقي في Discord Rich Presence.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==التركيب== &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
bool setDiscordRichPresenceEndTime(int seconds)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
{{OOP||[[DiscordRPC]]:setEndTime}}&lt;br /&gt;
&lt;br /&gt;
===المعطيات المطلوبة===&lt;br /&gt;
*'''seconds''': عدد صحيح يُمثّل عدد الثواني المتبقية. إذا كانت القيمة 0 أو أقل من وقت البدء ([[AR/setDiscordRichPresenceStartTime|setDiscordRichPresenceStartTime]]) فلن يتم عرض المؤقت.&lt;br /&gt;
&lt;br /&gt;
===القيم المرجعة===&lt;br /&gt;
تعيد الدالة ''true'' إذا نجحت العملية، و ''false'' خلاف ذلك.&lt;br /&gt;
&lt;br /&gt;
==مثال==&lt;br /&gt;
يعرض هذا المثال كيفية تغيير مؤقت الوقت المتبقي في تطبيق Discord Rich Presence.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local app_id = &amp;quot;معرّف_تطبيقك_الخاص&amp;quot;&lt;br /&gt;
if setDiscordApplicationID(app_id) then &lt;br /&gt;
    setDiscordRichPresenceState(&amp;quot;داخل اللعبة&amp;quot;)&lt;br /&gt;
    setDiscordRichPresenceStartTime(1)&lt;br /&gt;
    setDiscordRichPresenceEndTime(60) -- دقيقة واحدة متبقية&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==انظر ايضاً==&lt;br /&gt;
{{AR/Client_Discord_functions}}&lt;br /&gt;
&lt;br /&gt;
[[en:SetDiscordRichPresenceDetails]]&lt;br /&gt;
[[de:setDiscordRichPresenceDetails]]&lt;br /&gt;
[[hu:setDiscordRichPresenceDetails]]&lt;br /&gt;
[[pl:setDiscordRichPresenceDetails]]&lt;br /&gt;
[[ro:setDiscordRichPresenceDetails]]&lt;br /&gt;
[[ru:SetDiscordRichPresenceDetails]]&lt;br /&gt;
[[PT-BR:SetDiscordRichPresenceDetails]]&lt;/div&gt;</summary>
		<author><name>O22</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/AR/setDiscordRichPresenceStartTime</id>
		<title>AR/setDiscordRichPresenceStartTime</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/AR/setDiscordRichPresenceStartTime"/>
		<updated>2025-08-06T01:30:38Z</updated>

		<summary type="html">&lt;p&gt;O22: Created page with &amp;quot;__NOTOC__  {{Client function}} {{Important Note|لاستخدام هذه الدالة، يجب عليك إعداد تطبيقك الخاص باستخدام setDiscordApplicationID}} {{New feature/item|3.0161|1.6.0|22276| تقوم هذه الدالة بتعيين الوقت المنقضي في Discord Rich Presence. }}  ==التركيب==  &amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt; bool setDiscordRichPresenceStartTime(int seconds) &amp;lt;/syntaxhighlight&amp;gt;  {{OOP...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{Important Note|لاستخدام هذه الدالة، يجب عليك إعداد تطبيقك الخاص باستخدام [[AR/setDiscordApplicationID|setDiscordApplicationID]]}}&lt;br /&gt;
{{New feature/item|3.0161|1.6.0|22276|&lt;br /&gt;
تقوم هذه الدالة بتعيين الوقت المنقضي في Discord Rich Presence.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==التركيب== &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
bool setDiscordRichPresenceStartTime(int seconds)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
{{OOP||[[DiscordRPC]]:setStartTime}}&lt;br /&gt;
&lt;br /&gt;
===المعطيات المطلوبة===&lt;br /&gt;
*'''seconds''': عدد صحيح يُمثّل عدد الثواني المنقضية. إذا كانت القيمة 0، فلن يتم عرض المؤقت.&lt;br /&gt;
&lt;br /&gt;
===القيم المرجعة===&lt;br /&gt;
تعيد الدالة ''true'' إذا نجحت العملية، و ''false'' خلاف ذلك.&lt;br /&gt;
&lt;br /&gt;
==مثال==&lt;br /&gt;
يعرض هذا المثال كيفية تغيير مؤقت الوقت المنقضي في تطبيق Discord Rich Presence.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local app_id = &amp;quot;معرّف_تطبيقك_الخاص&amp;quot;&lt;br /&gt;
if setDiscordApplicationID(app_id) then &lt;br /&gt;
    setDiscordRichPresenceState(&amp;quot;داخل اللعبة&amp;quot;)&lt;br /&gt;
    setDiscordRichPresenceStartTime(1)&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==انظر ايضاً==&lt;br /&gt;
{{AR/Client_Discord_functions}}&lt;br /&gt;
&lt;br /&gt;
[[en:SetDiscordRichPresenceDetails]]&lt;br /&gt;
[[de:setDiscordRichPresenceDetails]]&lt;br /&gt;
[[hu:setDiscordRichPresenceDetails]]&lt;br /&gt;
[[pl:setDiscordRichPresenceDetails]]&lt;br /&gt;
[[ro:setDiscordRichPresenceDetails]]&lt;br /&gt;
[[ru:SetDiscordRichPresenceDetails]]&lt;br /&gt;
[[PT-BR:SetDiscordRichPresenceDetails]]&lt;/div&gt;</summary>
		<author><name>O22</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/AR/setDiscordRichPresencePartySize</id>
		<title>AR/setDiscordRichPresencePartySize</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/AR/setDiscordRichPresencePartySize"/>
		<updated>2025-08-06T01:27:04Z</updated>

		<summary type="html">&lt;p&gt;O22: Created page with &amp;quot;__NOTOC__  {{Client function}} {{Important Note|لاستخدام هذه الدالة، يجب عليك إعداد تطبيقك الخاص باستخدام setDiscordApplicationID}} {{Note|لكي يتم عرض حجم المجموعة، يجب تعيين الحالة باستخدام setDiscordRichPresenceState}} {{New feature/item|3.0161|1.6.0|22276| تقوم هذه الدالة بتعيين حجم المج...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{Important Note|لاستخدام هذه الدالة، يجب عليك إعداد تطبيقك الخاص باستخدام [[AR/setDiscordApplicationID|setDiscordApplicationID]]}}&lt;br /&gt;
{{Note|لكي يتم عرض حجم المجموعة، يجب تعيين الحالة باستخدام [[AR/setDiscordRichPresenceState|setDiscordRichPresenceState]]}}&lt;br /&gt;
{{New feature/item|3.0161|1.6.0|22276|&lt;br /&gt;
تقوم هذه الدالة بتعيين حجم المجموعة في Discord Rich Presence.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==التركيب== &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
bool setDiscordRichPresencePartySize(int size, int max)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
{{OOP||[[DiscordRPC]]:setPartySize}}&lt;br /&gt;
&lt;br /&gt;
===المعطيات المطلوبة===&lt;br /&gt;
*'''size''': عدد صحيح يمثل حجم المجموعة الحالي.&lt;br /&gt;
*'''max''': عدد صحيح يمثل الحد الأقصى لحجم المجموعة.&lt;br /&gt;
&lt;br /&gt;
'''إذا كانت القيمتان 0، فلن يتم عرض حجم المجموعة.'''&lt;br /&gt;
&lt;br /&gt;
===القيم المرجعة===&lt;br /&gt;
تعيد الدالة ''true'' إذا نجحت العملية، و ''false'' خلاف ذلك.&lt;br /&gt;
&lt;br /&gt;
==مثال==&lt;br /&gt;
يعرض هذا المثال كيفية تغيير حجم المجموعة (Party Size) في تطبيق Discord Rich Presence.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local app_id = &amp;quot;معرّف_تطبيقك_الخاص&amp;quot;&lt;br /&gt;
if setDiscordApplicationID(app_id) then &lt;br /&gt;
    setDiscordRichPresenceState(&amp;quot;داخل اللعبة&amp;quot;)&lt;br /&gt;
    setDiscordRichPresencePartySize(1, 32)&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==انظر ايضاً==&lt;br /&gt;
{{AR/Client_Discord_functions}}&lt;br /&gt;
&lt;br /&gt;
[[en:SetDiscordRichPresenceDetails]]&lt;br /&gt;
[[de:setDiscordRichPresenceDetails]]&lt;br /&gt;
[[hu:setDiscordRichPresenceDetails]]&lt;br /&gt;
[[pl:setDiscordRichPresenceDetails]]&lt;br /&gt;
[[ro:setDiscordRichPresenceDetails]]&lt;br /&gt;
[[ru:SetDiscordRichPresenceDetails]]&lt;br /&gt;
[[PT-BR:SetDiscordRichPresenceDetails]]&lt;/div&gt;</summary>
		<author><name>O22</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/AR/setDiscordRichPresenceState</id>
		<title>AR/setDiscordRichPresenceState</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/AR/setDiscordRichPresenceState"/>
		<updated>2025-08-06T00:14:56Z</updated>

		<summary type="html">&lt;p&gt;O22: Created page with &amp;quot;__NOTOC__  {{Client function}} {{Important Note|لاستخدام هذه الدالة، يجب عليك إعداد تطبيقك الخاص باستخدام setDiscordApplicationID}} {{New feature/item|3.0161|1.6.0|22270| تقوم هذه الدالة بتعيين الحالة لتطبيق Discord Rich Presence. }}  ==التركيب==  &amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt; bool setDiscordRichPresenceState(string state) &amp;lt;/syntaxhighlight&amp;gt;  {{OOP||Disc...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{Important Note|لاستخدام هذه الدالة، يجب عليك إعداد تطبيقك الخاص باستخدام [[AR/setDiscordApplicationID|setDiscordApplicationID]]}}&lt;br /&gt;
{{New feature/item|3.0161|1.6.0|22270|&lt;br /&gt;
تقوم هذه الدالة بتعيين الحالة لتطبيق Discord Rich Presence.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==التركيب== &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
bool setDiscordRichPresenceState(string state)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
{{OOP||[[DiscordRPC]]:setState}}&lt;br /&gt;
&lt;br /&gt;
===المعطيات المطلوبة===&lt;br /&gt;
*'''state''': سلسلة نصية تحتوي على نص الحالة.&lt;br /&gt;
&lt;br /&gt;
===القيم المرجعة===&lt;br /&gt;
تعيد الدالة ''true'' إذا نجحت العملية، و ''false'' خلاف ذلك.&lt;br /&gt;
&lt;br /&gt;
==مثال==&lt;br /&gt;
يعرض هذا المثال كيفية تعيين الحالة في تطبيق Discord Rich Presence.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local app_id = &amp;quot;معرّف_تطبيقك_الخاص&amp;quot;&lt;br /&gt;
if setDiscordApplicationID(app_id) then &lt;br /&gt;
    setDiscordRichPresenceState(&amp;quot;في انتظار في الردهة&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==انظر ايضاً==&lt;br /&gt;
{{AR/Client_Discord_functions}}&lt;br /&gt;
&lt;br /&gt;
[[en:SetDiscordRichPresenceState]]&lt;br /&gt;
[[de:setDiscordRichPresenceState]]&lt;br /&gt;
[[hu:setDiscordRichPresenceState]]&lt;br /&gt;
[[pl:setDiscordRichPresenceState]]&lt;br /&gt;
[[ro:setDiscordRichPresenceState]]&lt;br /&gt;
[[ru:SetDiscordRichPresenceState]]&lt;br /&gt;
[[PT-BR:SetDiscordRichPresenceState]]&lt;/div&gt;</summary>
		<author><name>O22</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/AR/setDiscordRichPresenceSmallAsset</id>
		<title>AR/setDiscordRichPresenceSmallAsset</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/AR/setDiscordRichPresenceSmallAsset"/>
		<updated>2025-08-06T00:11:02Z</updated>

		<summary type="html">&lt;p&gt;O22: /* Syntax */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{Important Note|لاستخدام هذه الدالة، يجب عليك إعداد تطبيقك الخاص باستخدام [[AR/setDiscordApplicationID|setDiscordApplicationID]]}}&lt;br /&gt;
{{New feature/item|3.0161|1.6.0|22270|&lt;br /&gt;
باستخدام هذه الدالة، يمكنك تعيين صورة الأصل الصغيرة (small asset) للتطبيق.&lt;br /&gt;
الحد الأقصى لحجم الصور هو ''1024 x1024''، والحد الأدنى هو ''512 x512''.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==التركيب== &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
bool setDiscordRichPresenceSmallAsset(string assetImage, string text)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
{{OOP||[[DiscordRPC]]:setSmallAsset}}&lt;br /&gt;
&lt;br /&gt;
===المعطيات المطلوبة===&lt;br /&gt;
*'''assetImage''': سلسلة نصية تحتوي على مفتاح الصورة التي قمت برفعها في قائمة الأصول الخاصة بتطبيقك.&lt;br /&gt;
*'''text''': سلسلة نصية تُعرض عندما يقوم أحدهم بتحويم الماوس فوق الصورة الكبيرة في Discord.&lt;br /&gt;
&lt;br /&gt;
===القيم المرجعة===&lt;br /&gt;
تعيد الدالة ''true'' إذا نجحت العملية، و ''false'' خلاف ذلك.&lt;br /&gt;
&lt;br /&gt;
==مثال==&lt;br /&gt;
المثال يقوم بتعيين الصورة الكبيرة إلى my_small_logo.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
addCommandHandler(&amp;quot;setsmalllogo&amp;quot;,&lt;br /&gt;
    function ()&lt;br /&gt;
        if isDiscordRichPresenceConnected() then &lt;br /&gt;
            setDiscordRichPresenceSmallAsset(&amp;quot;my_small_logo&amp;quot;, &amp;quot;!هذا هو شعاري الصغير&amp;quot;)&lt;br /&gt;
        end &lt;br /&gt;
    end&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==انظر ايضاً==&lt;br /&gt;
{{AR/Client_Discord_functions}}&lt;br /&gt;
&lt;br /&gt;
[[en:SetDiscordRichPresenceAsset]]&lt;br /&gt;
[[de:setDiscordRichPresenceAsset]]&lt;br /&gt;
[[hu:setDiscordRichPresenceAsset]]&lt;br /&gt;
[[pl:setDiscordRichPresenceAsset]]&lt;br /&gt;
[[ro:setDiscordRichPresenceAsset]]&lt;br /&gt;
[[ru:SetDiscordRichPresenceAsset]]&lt;br /&gt;
[[PT-BR:SetDiscordRichPresenceAsset]]&lt;/div&gt;</summary>
		<author><name>O22</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/AR/setDiscordRichPresenceDetails</id>
		<title>AR/setDiscordRichPresenceDetails</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/AR/setDiscordRichPresenceDetails"/>
		<updated>2025-08-06T00:01:52Z</updated>

		<summary type="html">&lt;p&gt;O22: Created page with &amp;quot;__NOTOC__  {{Client function}} {{Important Note|لاستخدام هذه الدالة، يجب عليك إعداد تطبيقك الخاص باستخدام setDiscordApplicationID}} {{New feature/item|3.0161|1.6.0|22270| تقوم هذه الدالة بتعيين نص التفاصيل في Discord Rich Presence. }}  ==التركيب==  &amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt; bool setDiscordRichPresenceDetails(string details) &amp;lt;/syntaxhighlight&amp;gt;  {{OOP||[...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{Important Note|لاستخدام هذه الدالة، يجب عليك إعداد تطبيقك الخاص باستخدام [[AR/setDiscordApplicationID|setDiscordApplicationID]]}}&lt;br /&gt;
{{New feature/item|3.0161|1.6.0|22270|&lt;br /&gt;
تقوم هذه الدالة بتعيين نص التفاصيل في Discord Rich Presence.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==التركيب== &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
bool setDiscordRichPresenceDetails(string details)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
{{OOP||[[DiscordRPC]]:setDetails}}&lt;br /&gt;
&lt;br /&gt;
===القيم المطلوبة===&lt;br /&gt;
*'''details''': سلسلة نصية تحتوي على نص التفاصيل.&lt;br /&gt;
&lt;br /&gt;
===القيم المرجعة===&lt;br /&gt;
تعيد الدالة ''true'' إذا نجحت العملية، و ''false'' خلاف ذلك.&lt;br /&gt;
&lt;br /&gt;
==مثال==&lt;br /&gt;
يعرض هذا المثال كيفية تغيير الحالة والتفاصيل في تطبيق Discord Rich Presence.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local app_id = &amp;quot;معرّف_تطبيقك_الخاص&amp;quot;&lt;br /&gt;
if setDiscordApplicationID(app_id) then &lt;br /&gt;
    local name = getPlayerName(localPlayer)&lt;br /&gt;
    setDiscordRichPresenceState(&amp;quot;داخل اللعبة&amp;quot;)&lt;br /&gt;
    setDiscordRichPresenceDetails(&amp;quot;حالياً باسم &amp;quot;..name)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==انظر ايضاً==&lt;br /&gt;
{{AR/Client_Discord_functions}}&lt;br /&gt;
&lt;br /&gt;
[[en:SetDiscordRichPresenceDetails]]&lt;br /&gt;
[[de:setDiscordRichPresenceDetails]]&lt;br /&gt;
[[hu:setDiscordRichPresenceDetails]]&lt;br /&gt;
[[pl:setDiscordRichPresenceDetails]]&lt;br /&gt;
[[ro:setDiscordRichPresenceDetails]]&lt;br /&gt;
[[ru:SetDiscordRichPresenceDetails]]&lt;br /&gt;
[[PT-BR:SetDiscordRichPresenceDetails]]&lt;/div&gt;</summary>
		<author><name>O22</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/AR/setDiscordRichPresenceButton</id>
		<title>AR/setDiscordRichPresenceButton</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/AR/setDiscordRichPresenceButton"/>
		<updated>2025-08-05T23:55:28Z</updated>

		<summary type="html">&lt;p&gt;O22: Created page with &amp;quot;__NOTOC__  {{Client function}} {{Important Note|لاستخدام هذه الدالة، يجب عليك إعداد تطبيقك الخاص باستخدام setDiscordApplicationID}} {{New feature/item|3.0161|1.6.0|22270| تقوم هذه الدالة بتعيين زر مخصص يمكن من خلاله الوصول إلى موقع ويب على Discord. }}  ==التركيب==  &amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt; bool setDiscordRichPresenceButton(int...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{Important Note|لاستخدام هذه الدالة، يجب عليك إعداد تطبيقك الخاص باستخدام [[AR/setDiscordApplicationID|setDiscordApplicationID]]}}&lt;br /&gt;
{{New feature/item|3.0161|1.6.0|22270|&lt;br /&gt;
تقوم هذه الدالة بتعيين زر مخصص يمكن من خلاله الوصول إلى موقع ويب على Discord.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==التركيب== &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
bool setDiscordRichPresenceButton(int index, string text, string url)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
{{OOP||[[DiscordRPC]]:setButton}}&lt;br /&gt;
&lt;br /&gt;
===المعطيات المطلوبة===&lt;br /&gt;
*'''index''': رقم صحيح (int) يُمثّل ترتيب الزر (القيم الممكنة: 1 أو 2)&lt;br /&gt;
*'''text''': سلسلة نصية تحتوي على عنوان الزر&lt;br /&gt;
*'''url''': سلسلة نصية تحتوي على رابط الزر (يعمل فقط مع '''https://''' أو '''mtasa://''')&lt;br /&gt;
&lt;br /&gt;
===القيم المرجعة===&lt;br /&gt;
تعيد الدالة ''true'' إذا نجحت العملية، و ''false'' خلاف ذلك.&lt;br /&gt;
&lt;br /&gt;
==مثال==&lt;br /&gt;
يعرض هذا المثال كيفية إنشاء زرين مخصصين في تطبيق Discord Rich Presence الخاص بنا.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local app_id = &amp;quot;معرف_تطبيقك_الخاص&amp;quot;&lt;br /&gt;
if setDiscordApplicationID(app_id) then &lt;br /&gt;
    setDiscordRichPresenceButton(1, &amp;quot;الاتصال بالسيرفر&amp;quot;, &amp;quot;mtasa://youraddressip&amp;quot;)&lt;br /&gt;
    setDiscordRichPresenceButton(2, &amp;quot;الصفحة الرئيسية لـ MTA&amp;quot;, &amp;quot;https://mtasa.com&amp;quot;)&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==انظر ايضاً==&lt;br /&gt;
{{AR/Client_Discord_functions}}&lt;br /&gt;
&lt;br /&gt;
[[en:SetDiscordRichPresenceButton]]&lt;br /&gt;
[[de:setDiscordRichPresenceButton]]&lt;br /&gt;
[[hu:setDiscordRichPresenceButton]]&lt;br /&gt;
[[pl:setDiscordRichPresenceButton]]&lt;br /&gt;
[[ro:setDiscordRichPresenceButton]]&lt;br /&gt;
[[ru:SetDiscordRichPresenceButton]]&lt;br /&gt;
[[PT-BR:SetDiscordRichPresenceButton]]&lt;/div&gt;</summary>
		<author><name>O22</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/AR/setDiscordRichPresenceAsset</id>
		<title>AR/setDiscordRichPresenceAsset</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/AR/setDiscordRichPresenceAsset"/>
		<updated>2025-08-05T23:50:08Z</updated>

		<summary type="html">&lt;p&gt;O22: Created page with &amp;quot;__NOTOC__  {{Client function}} {{Important Note|لاستخدام هذه الدالة، يجب عليك إعداد تطبيقك الخاص باستخدام setDiscordApplicationID}} {{New feature/item|3.0161|1.6.0|22270| باستخدام هذه الدالة يمكنك تعيين صورة الأصل الكبيرة (large image asset) للتطبيق.   الحد الأقصى لحجم الصور هو ''1024 x1024''، والحد الأدنى هو...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{Important Note|لاستخدام هذه الدالة، يجب عليك إعداد تطبيقك الخاص باستخدام [[AR/setDiscordApplicationID|setDiscordApplicationID]]}}&lt;br /&gt;
{{New feature/item|3.0161|1.6.0|22270|&lt;br /&gt;
باستخدام هذه الدالة يمكنك تعيين صورة الأصل الكبيرة (large image asset) للتطبيق.  &lt;br /&gt;
الحد الأقصى لحجم الصور هو ''1024 x1024''، والحد الأدنى هو ''512 x512''.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==التركيب== &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
bool setDiscordRichPresenceAsset(string assetImage, string text)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
{{OOP||[[DiscordRPC]]:setAsset}}&lt;br /&gt;
&lt;br /&gt;
===المعطيات المطلوبة===&lt;br /&gt;
*'''assetImage''': سلسلة نصية تحتوي على مفتاح الصورة التي قمت برفعها في قائمة الأصول الخاصة بتطبيقك.&lt;br /&gt;
*'''text''': سلسلة نصية تُعرض عندما يقوم أحدهم بتحويم الماوس فوق الصورة الكبيرة في Discord.&lt;br /&gt;
&lt;br /&gt;
===القيم المرجعة===&lt;br /&gt;
تعيد الدالة ''true'' إذا نجحت العملية، و ''false'' خلاف ذلك.&lt;br /&gt;
&lt;br /&gt;
==مثال==&lt;br /&gt;
المثال يقوم بتعيين الصورة الكبيرة إلى my_logo.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
addCommandHandler(&amp;quot;setlogo&amp;quot;,&lt;br /&gt;
    function ()&lt;br /&gt;
        if isDiscordRichPresenceConnected() then &lt;br /&gt;
            setDiscordRichPresenceAsset(&amp;quot;my_logo&amp;quot;, &amp;quot;هذا هو شعاري!&amp;quot;)&lt;br /&gt;
        end &lt;br /&gt;
    end&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==انظر ايضاً==&lt;br /&gt;
{{AR/Client_Discord_functions}}&lt;br /&gt;
&lt;br /&gt;
[[en:SetDiscordRichPresenceAsset]]&lt;br /&gt;
[[de:setDiscordRichPresenceAsset]]&lt;br /&gt;
[[hu:setDiscordRichPresenceAsset]]&lt;br /&gt;
[[pl:setDiscordRichPresenceAsset]]&lt;br /&gt;
[[ro:setDiscordRichPresenceAsset]]&lt;br /&gt;
[[ru:SetDiscordRichPresenceAsset]]&lt;br /&gt;
[[PT-BR:SetDiscordRichPresenceAsset]]&lt;/div&gt;</summary>
		<author><name>O22</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/AR/setDiscordApplicationID</id>
		<title>AR/setDiscordApplicationID</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/AR/setDiscordApplicationID"/>
		<updated>2025-08-05T23:44:25Z</updated>

		<summary type="html">&lt;p&gt;O22: Created page with &amp;quot;__NOTOC__  {{Client function}} {{Important Note|لإعادة ضبط معرف التطبيق، يرجى استخدام resetDiscordRichPresenceData}} {{Important Note|لكي تعمل الدالة بشكل صحيح، يجب أن يكون لدى المستخدم إعداد الخصوصية/الحالة مفعل في Discord.}} {{New feature/item|3.0161|1.6.0|22270| تتيح هذه الدالة تعيين تطبيقك الخاص للاست...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{Important Note|لإعادة ضبط معرف التطبيق، يرجى استخدام [[AR/resetDiscordRichPresenceData|resetDiscordRichPresenceData]]}}&lt;br /&gt;
{{Important Note|لكي تعمل الدالة بشكل صحيح، يجب أن يكون لدى المستخدم إعداد الخصوصية/الحالة مفعل في Discord.}}&lt;br /&gt;
{{New feature/item|3.0161|1.6.0|22270|&lt;br /&gt;
تتيح هذه الدالة تعيين تطبيقك الخاص للاستخدام في Rich Presence.  &lt;br /&gt;
يمكنك إنشاء تطبيقك الخاص '''[https://discord.com/developers/applications هنا]'''  &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==التركيب== &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
bool setDiscordApplicationID(string applicationID)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
{{OOP||[[DiscordRPC]]:setApplication}}&lt;br /&gt;
&lt;br /&gt;
===المعطيات المطلوبة===&lt;br /&gt;
*'''applicationID''': سلسلة نصية تمثل معرف تطبيق Discord الخاص بك.&lt;br /&gt;
===القيم المرجعة===&lt;br /&gt;
تعيد الدالة ''true'' إذا نجحت العملية، و ''false'' إذا قام العميل بتعطيل خاصية Rich Presence.&lt;br /&gt;
&lt;br /&gt;
==مثال==&lt;br /&gt;
هذا المثال يعرض ما إذا تم إعداد التطبيق بنجاح ويعيّن صورة مخصصة (custom asset).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local app_id = &amp;quot;معرف_التطبيق_الخاص_بك&amp;quot;&lt;br /&gt;
if setDiscordApplicationID(app_id) then &lt;br /&gt;
    setDiscordRichPresenceAsset(&amp;quot;asset_name_from_application&amp;quot;)&lt;br /&gt;
    outputChatBox(&amp;quot;رائع، نحن الآن نستخدم تطبيقنا الخاص!&amp;quot;)&lt;br /&gt;
end &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==انظر ايضاً==&lt;br /&gt;
{{AR/Client_Discord_functions}}&lt;br /&gt;
&lt;br /&gt;
[[en:setDiscordApplicationID]]&lt;br /&gt;
[[de:setDiscordApplicationID]]&lt;br /&gt;
[[hu:setDiscordApplicationID]]&lt;br /&gt;
[[pl:setDiscordApplicationID]]&lt;br /&gt;
[[ro:setDiscordApplicationID]]&lt;br /&gt;
[[ru:SetDiscordApplicationID]]&lt;br /&gt;
[[PT-BR:SetDiscordApplicationID]]&lt;/div&gt;</summary>
		<author><name>O22</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/AR/resetDiscordRichPresenceData</id>
		<title>AR/resetDiscordRichPresenceData</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/AR/resetDiscordRichPresenceData"/>
		<updated>2025-08-05T23:05:16Z</updated>

		<summary type="html">&lt;p&gt;O22: /* Syntax */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{New feature/item|3.0161|1.6.0|22270|&lt;br /&gt;
تعيد هذه الوظيفة إعدادات Discord Rich Presence إلى الوضع الافتراضي.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==التركيب== &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
bool resetDiscordRichPresenceData()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===القيم المرجعة===&lt;br /&gt;
ترجع الدالة ''true'' إذا نجحت العملية، و ''false'' إذا فشلت.&lt;br /&gt;
&lt;br /&gt;
==مثال==&lt;br /&gt;
يعرض هذا المثال كيفية إعادة ضبط Discord Rich Presence بعد استخدام تطبيق مخصص.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
setDiscordApplicationID(&amp;quot;you_application_key&amp;quot;)&lt;br /&gt;
setDiscordRichPresenceAsset(&amp;quot;asset_logo&amp;quot;, &amp;quot;Name of Asset&amp;quot;)&lt;br /&gt;
if resetDiscordRichPresenceData()  then -- نقوم بإعادة الضبط إلى الوضع الافتراضي باستخدام تطبيق MTA.&lt;br /&gt;
    outputChatBox(&amp;quot;تمت إعادة Discord Rich Presence إلى الوضع الافتراضي.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==انظر ايضاً==&lt;br /&gt;
{{AR/Client_Discord_functions}}&lt;br /&gt;
&lt;br /&gt;
[[en:ResetDiscordRichPresenceData]]&lt;br /&gt;
[[de:resetDiscordRichPresenceData]]&lt;br /&gt;
[[hu:resetDiscordRichPresenceData]]&lt;br /&gt;
[[pl:resetDiscordRichPresenceData]]&lt;br /&gt;
[[ro:resetDiscordRichPresenceData]]&lt;br /&gt;
[[ru:ResetDiscordRichPresenceData]]&lt;br /&gt;
[[PT-BR:ResetDiscordRichPresenceData]]&lt;/div&gt;</summary>
		<author><name>O22</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/AR/isDiscordRichPresenceConnected</id>
		<title>AR/isDiscordRichPresenceConnected</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/AR/isDiscordRichPresenceConnected"/>
		<updated>2025-08-05T23:02:08Z</updated>

		<summary type="html">&lt;p&gt;O22: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{New feature/item|3.0161|1.6.0|22270|&lt;br /&gt;
تتحقق الوظيفة مما إذا كان العميل لديه Discord Rich Presence مفعل.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==التركيب== &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
bool isDiscordRichPresenceConnected()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
{{OOP||[[DiscordRPC]]:isConnected}}&lt;br /&gt;
&lt;br /&gt;
===القيم المرجعة===&lt;br /&gt;
ترجع الدالة ''true'' إذا كانت خاصية Discord Rich Presence مفعّلة على العميل، و ''false'' إذا كانت غير مفعّلة.&lt;br /&gt;
&lt;br /&gt;
==مثال==&lt;br /&gt;
يعرض هذا المثال إذا ما كان العميل قد فعّل خاصية Discord Rich Presence.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
addCommandHandler(&amp;quot;checkdiscord&amp;quot;,&lt;br /&gt;
    function ()&lt;br /&gt;
        if isDiscordRichPresenceConnected() then &lt;br /&gt;
            outputChatBox(&amp;quot;أنت تستخدم Discord Rich Presence، هذا رائع!&amp;quot;)&lt;br /&gt;
        end &lt;br /&gt;
    end&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==انظر ايضاً==&lt;br /&gt;
{{AR/Client_Discord_functions}}&lt;br /&gt;
&lt;br /&gt;
[[en:IsDiscordRichPresenceConnected]]&lt;br /&gt;
[[de:isDiscordRichPresenceConnected]]&lt;br /&gt;
[[hu:isDiscordRichPresenceConnected]]&lt;br /&gt;
[[pl:isDiscordRichPresenceConnected]]&lt;br /&gt;
[[ro:isDiscordRichPresenceConnected]]&lt;br /&gt;
[[ru:IsDiscordRichPresenceConnected]]&lt;br /&gt;
[[PT-BR:IsDiscordRichPresenceConnected]]&lt;/div&gt;</summary>
		<author><name>O22</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/ToggleAllVehicleControls</id>
		<title>ToggleAllVehicleControls</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/ToggleAllVehicleControls"/>
		<updated>2025-08-05T10:55:36Z</updated>

		<summary type="html">&lt;p&gt;Abolfazl: Created page with &amp;quot;Toggles all vehicle controls for a player based on the provided boolean method (true to enable, false to disable). ==Syntax== &amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;toggleAllVehicleControls(player, method)&amp;lt;/syntaxhighlight&amp;gt;  ===Required Arguments=== *'''player:''' The player whose vehicle controls will be toggled. *'''method:''' A boolean indicating whether to enable (true) or disable (false) the controls.  ===Returns=== Returns false if the method is not a b...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Toggles all vehicle controls for a player based on the provided boolean method (true to enable, false to disable).&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;toggleAllVehicleControls(player, method)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
*'''player:''' The [[Player|player]] whose vehicle controls will be toggled.&lt;br /&gt;
*'''method:''' A [[Boolean|boolean]] indicating whether to enable (true) or disable (false) the controls.&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns false if the method is not a boolean value, otherwise it returns true.&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Server and Client Side Script&amp;quot; class=&amp;quot;both&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;
local vehicleControls = {&lt;br /&gt;
    &amp;quot;vehicle_fire&amp;quot;, &amp;quot;vehicle_secondary_fire&amp;quot;, &amp;quot;vehicle_left&amp;quot;, &amp;quot;vehicle_right&amp;quot;,&lt;br /&gt;
    &amp;quot;steer_forward&amp;quot;, &amp;quot;steer_back&amp;quot;, &amp;quot;accelerate&amp;quot;, &amp;quot;brake_reverse&amp;quot;, &amp;quot;radio_next&amp;quot;, &amp;quot;radio_previous&amp;quot;, &amp;quot;radio_user_track_skip&amp;quot;, &amp;quot;horn&amp;quot;, &amp;quot;sub_mission&amp;quot;,&lt;br /&gt;
    &amp;quot;handbrake&amp;quot;, &amp;quot;vehicle_look_left&amp;quot;, &amp;quot;vehicle_look_right&amp;quot;, &amp;quot;vehicle_look_behind&amp;quot;, &amp;quot;vehicle_mouse_look&amp;quot;, &amp;quot;special_control_left&amp;quot;, &amp;quot;special_control_right&amp;quot;,&lt;br /&gt;
    &amp;quot;special_control_down&amp;quot;, &amp;quot;special_control_up&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function toggleAllVehicleControls(player, method)&lt;br /&gt;
    if type(method) ~= &amp;quot;boolean&amp;quot; then return false end&lt;br /&gt;
    for index, control in ipairs(vehicleControls) do&lt;br /&gt;
        toggleControl(player, control, method)&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 1==&lt;br /&gt;
This example toggles player's vehicle controls off when it entered an Andromeda.&lt;br /&gt;
&amp;lt;section name=&amp;quot;Server&amp;quot; class=&amp;quot;server&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;
addEventHandler(&amp;quot;onPlayerVehicleEnter&amp;quot;, root, function(vehicle)&lt;br /&gt;
    if getElementModel(vehicle) == 592 then&lt;br /&gt;
        toggleAllVehicleControls(source, false)&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;
&lt;br /&gt;
'''Author:''' [[User:Abolfazl|Abolfazl]]&lt;/div&gt;</summary>
		<author><name>Abolfazl</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/Changes_in_1.7</id>
		<title>Changes in 1.7</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/Changes_in_1.7"/>
		<updated>2025-08-04T07:32:45Z</updated>

		<summary type="html">&lt;p&gt;O22: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pageclass class=&amp;quot;#4286f4&amp;quot; subcaption=&amp;quot;Next release&amp;quot;&amp;gt;&amp;lt;/pageclass&amp;gt;&lt;br /&gt;
{{Changelogs}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
'''This changelog is partial and needs updating. It is updated progressively to keep the page always up to date.'''&lt;br /&gt;
&lt;br /&gt;
* GitHub commit log: https://github.com/multitheftauto/mtasa-blue/compare/1.6.0...master&lt;br /&gt;
* GitHub milestone: https://github.com/multitheftauto/mtasa-blue/milestone/10&lt;br /&gt;
* Resources GitHub commit log: https://github.com/multitheftauto/mtasa-resources/compare/1.6.0...master&lt;br /&gt;
* Release announcement on forums: TBA&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Important notice to Windows 7 and 8.x users ==&lt;br /&gt;
If you are using Windows 7 or 8.x, please upgrade your system to Windows 10 or 11 as soon as possible. Windows 7 and 8.x are no longer supported by Microsoft (since January 2020 and January 2023 respectively) and most software (including Google Chrome and Steam) which means you are running an insecure system. Multi Theft Auto will also eventually drop Windows 7 and 8.x support sometime in the future, so it would be a good idea to start looking at upgrade options right now. Thank you!&lt;br /&gt;
&lt;br /&gt;
'''CEF in MTA is no longer updated for Windows 7 or 8.x. This is because CEF no longer supports those versions of Windows. This is bad for security, so please upgrade to Windows 10+ and MTA to 1.6+'''&lt;br /&gt;
&lt;br /&gt;
== 4 Deprecations ==&lt;br /&gt;
These changes will take effect in this version and scripts may need to be manually upgraded when updating:&lt;br /&gt;
* Changed [[base64Encode]] and [[base64Decode]] to throw a warning on use, please upgrade to [[encodeString]] and [[decodeString]] instead ([https://github.com/multitheftauto/mtasa-blue/commit/30a83b0af164fb6920a2a60e089d08a6f5622f7d 30a83b0] by '''Nico834''')&lt;br /&gt;
* Changed [[setHelicopterRotorSpeed]] and [[getHelicopterRotorSpeed]] to throw a warning on use, please upgrade to [[setVehicleRotorSpeed]] and [[getVehicleRotorSpeed]] instead ([https://github.com/multitheftauto/mtasa-blue/commit/82000c34830b51ace2d14e39f3b487feb1aac1da 82000c3] by '''FileEX''')&lt;br /&gt;
* Changes [[setPedOnFire]] and [[isPedOnFire]] to throw a warning on use, please upgrade to [[setElementOnFire]] and [[isElementOnFire]] instead ([https://github.com/multitheftauto/mtasa-blue/commit/7ad96e2e78fe41f8924d3f105b1683f7363c6fcb 7ad96e2] by '''FileEX''')&lt;br /&gt;
* Changes [[removeAllGameBuildings]] and [[restoreAllGameBuildings]] to throw a warning on use, please upgrade to [[removeGameWorld]] and [[restoreGameWorld]] instead ([https://github.com/multitheftauto/mtasa-blue/commit/d7adae68791ce237704acc06bf794b5fbda96f95#diff-93c130ddb85da32121129a437ac5b28ba16fa17f6e3506e4cddfb7bc3d8eb9fbR180 d7adae6] by '''TheNormalnij''')&lt;br /&gt;
&lt;br /&gt;
== Notable Changes ==&lt;br /&gt;
* Support for Discord Rich Presence ([https://github.com/multitheftauto/mtasa-blue/commit/fdaa3aca3e233c7aba69d0fd5f85e78288a4401a fdaa3ac], [https://github.com/multitheftauto/mtasa-blue/commit/ef26810df4542283fee8edcc165bc9be22f2ca98 ef26810], [https://github.com/multitheftauto/mtasa-blue/commit/acfbd40df1ff1432ea1d6663c005d43fce22899c acfbd40] by '''znjvder''', '''tederis''', '''patrikjuvonen''' and '''Deihim007''')&lt;br /&gt;
* Added support for [[Building]]'s ([https://github.com/multitheftauto/mtasa-blue/commit/81242edb9295efbf4bf8b198b12d577a0877aec2 81242ed], [https://github.com/multitheftauto/mtasa-blue/commit/eb6b18a5d49a7f0f34bdbf42b15f933e42876cf8 eb6b18a] by '''TheNormalnij''')&lt;br /&gt;
* Added the ability to generate a nickname ([https://github.com/multitheftauto/mtasa-blue/commit/12c50eee66898771244074a3a44818dab36a7ac3 12c50ee] by '''Nico834''')&lt;br /&gt;
* Added ''meta.xml'' loading files pattern ([https://github.com/multitheftauto/mtasa-blue/commit/90e2737d0a5eb12f34d2fd3c1f270bedf34cda35 90e2737] by '''W3lac3''')&lt;br /&gt;
* Added world properties (time cycle and weather related features) with new functions: [[setWorldProperty]], [[getWorldProperty]], [[resetWorldProperty]] ([https://github.com/multitheftauto/mtasa-blue/commit/a75f1e9a03e74f7c9d4ae9e5aef8433af84d5ea2 a75f1e9] by '''Samr46''')&lt;br /&gt;
* Added file-system related functions (list files and folders in directories) ([https://github.com/multitheftauto/mtasa-blue/commit/74781c6295b5b6dc81cd95d4cfab7900d88d7524 74781c6] by '''Tracer''')&lt;br /&gt;
* Added the ability to change the color and size of the target arrow in the checkpoint marker ([https://github.com/multitheftauto/mtasa-blue/commit/071378ec4326408a9520c79c96befca995d097f6 071378e] by '''FileEX''')&lt;br /&gt;
* Added the ability to change the alpha of checkpoint and arrow marker ([https://github.com/multitheftauto/mtasa-blue/commit/7988852cf3af9e78f662d76544dc00db408b5c87 7988852] by '''FileEX''')&lt;br /&gt;
* Fixed weapon issues when using the jetpack ([https://github.com/multitheftauto/mtasa-blue/commit/180fbc0b5fdba95450e7a519f78f7588849349bf 180fbc0], [https://github.com/multitheftauto/mtasa-blue/commit/a68c2c4232c28c6ba5595a814b89be976c4fa9c3 a68c2c4] by '''FileEX''')&lt;br /&gt;
* Fixed vehicle windows not being visible from the inside when the lights are on ([https://github.com/multitheftauto/mtasa-blue/commit/934c1d6cfef19902cc391c896bbe2f80ba5a4f70 934c1d6] by '''FileEX''')&lt;br /&gt;
* Fixed old [[setElementModel]] memory leak ([https://github.com/multitheftauto/mtasa-blue/commit/4e7afa2586c6992a75ac5312378c1096d87148ae 4e7afa2] by '''tederis''')&lt;br /&gt;
* Enabled WebGL (GPU Acceleration) in CEF ([https://github.com/multitheftauto/mtasa-blue/commit/026301168d2cd8239650a4f0aa33ff0be6d752dc 0263011] by '''TFP-dev''')&lt;br /&gt;
* Refactored '''Quick Connect button''' ([https://github.com/multitheftauto/mtasa-blue/commit/5b59e2236b30ec696ac1c05f8bb4e509ec06c0f7 5b59e22] by '''Fernando-A-Rocha''')&lt;br /&gt;
* Added setting to save camera photos in documents folder ([https://github.com/multitheftauto/mtasa-blue/commit/3419b9b7a20e3d1893d673a2a07ee1a0efda1bd5 3419b9b] by '''ffsPLASMA''')&lt;br /&gt;
* Added HUD customization ([https://github.com/multitheftauto/mtasa-blue/commit/5ea0e0fb23b21750207b23191db92562cf9b822c 5ea0e0f] by '''FileEX''')&lt;br /&gt;
* Added sync peds/players animations for new players ([https://github.com/multitheftauto/mtasa-blue/commit/b32eafc70816ece8ad995d98d380d8f6e9950475 b32eafc] by '''FileEX''')&lt;br /&gt;
* From now on, animation progress is preserved even after a restream; the animation will not start from the beginning. ([https://github.com/multitheftauto/mtasa-blue/commit/ad0d6bfdd7bf56b78f7c8c1b9a60597ef9b6dca3 ad0d6bf] by '''FileEX''')&lt;br /&gt;
* Added ability to replace CJ clothing models ([https://github.com/multitheftauto/mtasa-blue/commit/6b823653ecf68e181de91392d5d8931488f90f20 6b82365] by '''W3lac3''')&lt;br /&gt;
* New MTA splash window ([https://github.com/multitheftauto/mtasa-blue/commit/215173eeb1e015c0381ce94f95429c36ab1b4430 215173e] by '''botder''')&lt;br /&gt;
* Fixed multiple damage instances in certain areas during explosions ([https://github.com/multitheftauto/mtasa-blue/commit/3bce4080ec66a993096f9e7fb039cc7d5d0d8175 3bce408] by '''FileEX''')&lt;br /&gt;
* From now on, before disconnecting from the server using the main menu, you will be asked to confirm if you really want to do it ([https://github.com/multitheftauto/mtasa-blue/commit/6aa763fb79701c57402fccca9ae6c0f396fb8f3c 6aa763f] by '''tonievalue''')&lt;br /&gt;
&lt;br /&gt;
== Statistics ==&lt;br /&gt;
&amp;lt;section show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
These are some statistics since the [[Changes in 1.6.0|previous release]].&lt;br /&gt;
* This is the '''28&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt;''' 1.x.x release&lt;br /&gt;
* '''{{date difference|2023|06|16}}''' days&lt;br /&gt;
* '''39''' new functions&lt;br /&gt;
* '''12''' new events&lt;br /&gt;
* '''4''' deprecations&lt;br /&gt;
* '''50+''' bug fixes and changes&lt;br /&gt;
* '''734''' commits ([https://github.com/multitheftauto/mtasa-blue/compare/1.6.0...master mtasa-blue])  ([https://github.com/multitheftauto/mtasa-resources/compare/1.6.0...master mtasa-resources])&lt;br /&gt;
* '''78''' new open GitHub issues ([https://github.com/multitheftauto/mtasa-blue/issues?q=is%3Aopen+is%3Aissue+created%3A2023-06-16..2024-10-01 see list])&lt;br /&gt;
* '''29''' resolved GitHub issues ([https://github.com/multitheftauto/mtasa-blue/issues?q=is%3Aclosed+is%3Aissue+milestone%3A%221.6.1%22 see list])&lt;br /&gt;
* '''28''' closed GitHub issues ([https://github.com/multitheftauto/mtasa-blue/issues?q=is%3Aclosed+is%3Aissue+closed%3A2023-06-16..2024-10-01+no%3Amilestone+-label%3Ainvalid see list])&lt;br /&gt;
* '''30''' new open GitHub pull requests ([https://github.com/multitheftauto/mtasa-blue/pulls?q=is%3Aopen+is%3Apr+created%3A2023-06-16..2024-10-01 see list])&lt;br /&gt;
* '''81''' merged GitHub pull requests ([https://github.com/multitheftauto/mtasa-blue/pulls?q=is%3Apr+is%3Amerged+milestone%3A%221.6.1%22 see list])&lt;br /&gt;
* '''26''' closed GitHub pull requests ([https://github.com/multitheftauto/mtasa-blue/pulls?q=is%3Apr+is%3Aunmerged+closed%3A2023-06-16..2024-10-01 see list])&lt;br /&gt;
* '''2+''' contributors of which '''0+''' are new ([https://github.com/multitheftauto/mtasa-blue/graphs/contributors?from=2023-06-16&amp;amp;to=2024-10-01&amp;amp;type=c see list])&lt;br /&gt;
* '''100+''' total contributors ([https://github.com/multitheftauto/mtasa-blue/graphs/contributors see list])&lt;br /&gt;
* '''3''' vendor updates&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sub&amp;gt;'''Note:''' Last update to these statistics was made {{date difference human friendly|2024|04|04}}.&amp;lt;/sub&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 86 New Features ==&lt;br /&gt;
=== Shared ===&lt;br /&gt;
* Added new ''special world properties'' to [[setWorldSpecialPropertyEnabled]] function&lt;br /&gt;
:* Added '''fireballdestruct''' special world property ([https://github.com/multitheftauto/mtasa-blue/commit/938b306add48245e578ba6036f1a77521e277194 938b306] by '''samr46''')&lt;br /&gt;
:* Added '''roadsignstext''' special world property ([https://github.com/multitheftauto/mtasa-blue/commit/4a746eca1b5a546a19344a76573a5108ff9d79e6 4a746ec] by '''FileEX''')&lt;br /&gt;
:* Added '''extendedwatercannons''' special world property ([https://github.com/multitheftauto/mtasa-blue/commit/13a53959f52c978b416c00b428938f82818b2312 13a5395] by '''FileEX''')&lt;br /&gt;
:* Added '''tunnelweatherblend''' special world property ([https://github.com/multitheftauto/mtasa-blue/commit/9a0790ec7fab1efb7817eead371744fcd47da5c5 9a0790e] by ''''gta191977649''')&lt;br /&gt;
:* Added '''ignorefirestate''' special world proeprty ([https://github.com/multitheftauto/mtasa-blue/commit/46f3580fbd8ea5cf48c14cf8fee0bd6eb6691854 46f3580] by '''FileEX''')&lt;br /&gt;
:* Added '''flyingcomponents''' special world property ([https://github.com/multitheftauto/mtasa-blue/commit/5ee641436821ae8a59484ac721a4ec929d5cc152 5ee6414] by '''FileEX''')&lt;br /&gt;
:* Added '''vehicleburnexplosions''' special world property ([https://github.com/multitheftauto/mtasa-blue/commit/88d303c0bbcc0ed4fee958df2d16ace562ce0108 88d303c] by '''samr46''')&lt;br /&gt;
:* Added '''vehicle_engine_autostart''' special world property ([https://github.com/multitheftauto/mtasa-blue/commit/8b3f3440f8bc485f90d466a3fe6f3e5819de9c2f 8b3f344] by '''samr46''')&lt;br /&gt;
&lt;br /&gt;
* Added new ''glitches'' to [[setGlitchEnabled]] function&lt;br /&gt;
:* Added '''vehicle_rapid_stop''' glitch ([https://github.com/multitheftauto/mtasa-blue/commit/3f5801e65d8a51d112b686485d4a2491151c3311 3f5801e], [https://github.com/multitheftauto/mtasa-blue/commit/ef792d6af62443f97014621334c7188dddb4ef29 ef792d6] by '''samr46''' and '''Merlin''')&lt;br /&gt;
&lt;br /&gt;
* New '''file''' functions&lt;br /&gt;
:* Added [[fileGetContents]] ([https://github.com/multitheftauto/mtasa-blue/commit/22930d854ce67d84a4a3b65a61b98a9ffd3f9e38 22930d8] by '''botder''')&lt;br /&gt;
:* Added [[fileGetHash]] ([https://github.com/multitheftauto/mtasa-blue/commit/94f944f508b99b5d7e84fbb0be07a483e10517a9 94f944f] by '''botder''')&lt;br /&gt;
&lt;br /&gt;
* New and updated [[object]] functions&lt;br /&gt;
:* '''[Updated]''' Added [[isObjectMoving]] to server-side ([https://github.com/multitheftauto/mtasa-blue/commit/7c939adb892c08836462a78cd9b987884cdb49ee 7c939ad] by '''FileEX''')&lt;br /&gt;
:* '''[Updated]''' Added [[breakObject]] to server-side ([https://github.com/multitheftauto/mtasa-blue/commit/aa1a7853f46fc796a94f38b7df2a5293fb941ba2 aa1a785] by '''FileEX''')&lt;br /&gt;
:* '''[Updated]''' Added [[respawnObject]] and [[toggleObjectRespawn]] to server-side ([https://github.com/multitheftauto/mtasa-blue/commit/9d65bb673c4df16def27e97a4af74d3b0c7eedc9 9d65bb6] by '''FileEX''')&lt;br /&gt;
:* '''[New]''' Added [[isObjectRespawnable]] ([https://github.com/multitheftauto/mtasa-blue/commit/9d65bb673c4df16def27e97a4af74d3b0c7eedc9 9d65bb6] by '''FileEX''')&lt;br /&gt;
&lt;br /&gt;
* New '''file-path''' functions&lt;br /&gt;
:* Added [[pathListDir]], [[pathIsFile]] and [[pathIsDirectory]] ([https://github.com/multitheftauto/mtasa-blue/commit/74781c6295b5b6dc81cd95d4cfab7900d88d7524 74781c6] by '''Tracer''')&lt;br /&gt;
&lt;br /&gt;
* New [[marker]] functions&lt;br /&gt;
:* Added [[setMarkerTargetArrowProperties]] and [[getMarkerTargetArrowProperties]] ([https://github.com/multitheftauto/mtasa-blue/commit/071378ec4326408a9520c79c96befca995d097f6 071378e] by '''FileEX''')&lt;br /&gt;
&lt;br /&gt;
* New [[timer]] functions&lt;br /&gt;
:* Added [[setTimerPaused]] and [[isTimerPaused]] ([https://github.com/multitheftauto/mtasa-blue/commit/69aa420f21fde3ac56e3d3bbc62ef0f060295c0a 69aa420] by '''jvstns''')&lt;br /&gt;
&lt;br /&gt;
* New and updated '''world''' functions&lt;br /&gt;
:* '''[New]''' Added [[resetWorldProperties]] ([https://github.com/multitheftauto/mtasa-blue/commit/6df889e78328b80f8e4bdc02f8761472cf87c54c 6df889e] by '''FileEX''')&lt;br /&gt;
:* '''[Updated]''' Added [[isWorldSpecialPropertyEnabled]] and [[setWorldSpecialPropertyEnabled]] also to server-side ([https://github.com/multitheftauto/mtasa-blue/commit/938b306add48245e578ba6036f1a77521e277194 938b306] by '''samr46''')&lt;br /&gt;
&lt;br /&gt;
* New and updated [[vehicle]] functions&lt;br /&gt;
:* '''[New]''' Added [[spawnVehicleFlyingComponent]] ([https://github.com/multitheftauto/mtasa-blue/commit/9f54cfcd7a584f413db731052ebed921acfc71ea 9f54cfc] by '''FileEX''')&lt;br /&gt;
:* '''[Upated]''' Added [[setVehicleNitroActivated]] to server-side ([https://github.com/multitheftauto/mtasa-blue/commit/e9e5819c394987de2b9a5d581c4df9fd47057d9d#diff-49b4b89bf4463f38e70a325131b4da66457d783b1401dde0ffbad723624f8612R130 e9e5819] by '''Proxy-99''')&lt;br /&gt;
:* '''[Updated]''' Added [[addVehicleSirens]] and [[removeVehicleSirens]] to client-side ([https://github.com/multitheftauto/mtasa-blue/commit/682cdca3c37248a9e725b461ba322db413653f25 682cdca] by '''Proxy-99''')&lt;br /&gt;
&lt;br /&gt;
* Updated [[player]] functions&lt;br /&gt;
:* Added [[getPlayerScriptDebugLevel]] to client-side ([https://github.com/multitheftauto/mtasa-blue/commit/8403da54ecfd20d6b9740fb79d90ac936d316112 8403da5] by '''Nico834''')&lt;br /&gt;
&lt;br /&gt;
* Updated [[ped]] functions&lt;br /&gt;
:* Added [[isPedReloadingWeapon]] to server-side ([https://github.com/multitheftauto/mtasa-blue/commit/e71f4828b46bb69b9622a11d0f700a79f986ee9b e71f482] by '''Nico834''')&lt;br /&gt;
&lt;br /&gt;
* New [[element]] functions&lt;br /&gt;
:* Added [[setElementOnFire]] and [[isElementOnFire]] ([https://github.com/multitheftauto/mtasa-blue/commit/7ad96e2e78fe41f8924d3f105b1683f7363c6fcb 7ad96e2] by '''FileEX''')&lt;br /&gt;
&lt;br /&gt;
=== Client ===&lt;br /&gt;
====Functions====&lt;br /&gt;
* New '''engine''' functions &lt;br /&gt;
:* Added '''streaming''' functions ([https://github.com/multitheftauto/mtasa-blue/commit/7ffc31243c1dbca8ed5e7b0f8c05da239aa918bd 7ffc312], [https://github.com/multitheftauto/mtasa-blue/commit/6c86ebbf0801c45d5e0bcbb9d9f2e8fd55525b15 6c86ebb], [https://github.com/multitheftauto/mtasa-blue/commit/3c44dc5dcde0a5f98ff470ce9bc64443d47de807 3c44dc5] by '''Pirulax''')&lt;br /&gt;
::* [[engineStreamingSetMemorySize]]&lt;br /&gt;
::* [[engineStreamingGetMemorySize]]&lt;br /&gt;
::* [[engineStreamingRestoreMemorySize]]&lt;br /&gt;
::* [[engineStreamingSetBufferSize]]&lt;br /&gt;
::* [[engineStreamingGetBufferSize]]&lt;br /&gt;
::* [[engineStreamingRestoreBufferSize]]&lt;br /&gt;
::* [[engineStreamingSetModelCacheLimits]]&lt;br /&gt;
:* Added '''model-streaming''' functions ([https://github.com/multitheftauto/mtasa-blue/commit/008eaa7e36ae74bbab7c5bc9861d8f0f890eb945 008eaa7] by '''TheNormalnij''')&lt;br /&gt;
::* [[engineStreamingRequestModel]]&lt;br /&gt;
::* [[engineStreamingReleaseModel]]&lt;br /&gt;
::* [[engineStreamingGetModelLoadState]]&lt;br /&gt;
:* Added new '''TXD''' functions ([https://github.com/multitheftauto/mtasa-blue/commit/3e9a3735a8022a0acabaa3041c8a3f8d91e547b7 3e9a373] by '''TheNormalnij''')&lt;br /&gt;
::* [[engineSetModelTXDID]]&lt;br /&gt;
::* [[engineResetModelTXDID]]&lt;br /&gt;
:* Added '''pools''' functions ([https://github.com/multitheftauto/mtasa-blue/commit/bdf12215d1f6e73d87f5cb0881049aa224b46b65 bdf1221] by '''TheNormalnij''')&lt;br /&gt;
::* [[engineGetPoolCapacity]]&lt;br /&gt;
::* [[engineSetPoolCapacity]]&lt;br /&gt;
::* [[engineGetPoolDefaultCapacity]]&lt;br /&gt;
::* [[engineGetPoolUsedCapacity]]&lt;br /&gt;
:* Added [[enginePreloadWorldArea]] ([https://github.com/multitheftauto/mtasa-blue/commit/5b72fb9d3c9e6813cdf56e53d1a1e72958abd3cf 5b72fb9] by '''MegadreamsBE''')&lt;br /&gt;
&lt;br /&gt;
* New functions for '''Discord RPC''' ([https://github.com/multitheftauto/mtasa-blue/commit/fdaa3aca3e233c7aba69d0fd5f85e78288a4401a fdaa3ac], [https://github.com/multitheftauto/mtasa-blue/commit/ef26810df4542283fee8edcc165bc9be22f2ca98 ef26810], [https://github.com/multitheftauto/mtasa-blue/commit/acfbd40df1ff1432ea1d6663c005d43fce22899c acfbd40] by '''znjvder''', '''tederis''', '''patrikjuvonen''' and '''Deihim007''')&lt;br /&gt;
:* [[setDiscordApplicationID]]&lt;br /&gt;
:* [[setDiscordRichPresenceDetails]]&lt;br /&gt;
:* [[setDiscordRichPresenceState]]&lt;br /&gt;
:* [[setDiscordRichPresenceAsset]]&lt;br /&gt;
:* [[setDiscordRichPresenceSmallAsset]]&lt;br /&gt;
:* [[setDiscordRichPresenceButton]]&lt;br /&gt;
:* [[resetDiscordRichPresenceData]]&lt;br /&gt;
:* [[isDiscordRichPresenceConnected]]&lt;br /&gt;
:* [[setDiscordRichPresencePartySize]]&lt;br /&gt;
:* [[setDiscordRichPresenceStartTime]]&lt;br /&gt;
:* [[setDiscordRichPresenceEndTime]]&lt;br /&gt;
:* [[getDiscordRichPresenceUserID]]&lt;br /&gt;
&lt;br /&gt;
* New [[building]] functions ([https://github.com/multitheftauto/mtasa-blue/commit/81242edb9295efbf4bf8b198b12d577a0877aec2 81242ed], [https://github.com/multitheftauto/mtasa-blue/commit/eb6b18a5d49a7f0f34bdbf42b15f933e42876cf8 eb6b18a] by '''TheNormalnij''')&lt;br /&gt;
:* [[createBuilding]]&lt;br /&gt;
:* '''[Deprecated]''' [[removeAllGameBuildings]] &lt;br /&gt;
:* '''[Deprecated]''' [[restoreAllGameBuildings]] &lt;br /&gt;
&lt;br /&gt;
* New '''world''' functions&lt;br /&gt;
:* Added [[processLineAgainstMesh]] ([https://github.com/multitheftauto/mtasa-blue/commit/acb80a3945d0d5e0230b8a41394a3fe3e70b8d0b acb80a3] by '''Pirulax''')&lt;br /&gt;
:* Added '''volumetric shadows''' functions ([https://github.com/multitheftauto/mtasa-blue/commit/6c93a49c4c2381f4ce84df195d98d36372a47d37 6c93a49] by '''Proxy-99''')&lt;br /&gt;
:::* [[setVolumetricShadowsEnabled]]&lt;br /&gt;
:::* [[isVolumetricShadowsEnabled]]&lt;br /&gt;
:::* [[resetVolumetricShadows]]&lt;br /&gt;
:* Added [[testSphereAgainstWorld]] ([https://github.com/multitheftauto/mtasa-blue/commit/aa90aa5f31e59df455af33b49e3eee5e4f107bfd aa90aa5] by '''FileEX''')&lt;br /&gt;
:* Added [[removeGameWorld]] and [[restoreGameWorld]] ([https://github.com/multitheftauto/mtasa-blue/commit/d7adae68791ce237704acc06bf794b5fbda96f95 d7adae6] by '''TheNormalnij''')&lt;br /&gt;
&lt;br /&gt;
* New '''drawing''' functions&lt;br /&gt;
:* Added [[dxDrawModel3D]] ([https://github.com/multitheftauto/mtasa-blue/commit/f886a359dd4a680c080da7f132db0527116b5d7a f886a35], [https://github.com/multitheftauto/mtasa-blue/commit/04ef14bbf2182b356155f28d4ed972b0f293632f 04ef14b] by '''CrosRoad95''' and '''tederis''')&lt;br /&gt;
&lt;br /&gt;
* New '''effects/fx''' functions&lt;br /&gt;
:* Added [[fxCreateParticle]] ([https://github.com/multitheftauto/mtasa-blue/commit/8f2730d2e260c3319cb51101c6aedb45e22bbd89 8f2730d] by '''FileEX''')&lt;br /&gt;
&lt;br /&gt;
* New [[ped]] functions&lt;br /&gt;
:* Added [[resetPedVoice]] ([https://github.com/multitheftauto/mtasa-blue/commit/18986a4542db5eb72f6d0dfffb80cb8bb6eb1442 18986a4] by '''Tracer''')&lt;br /&gt;
:* Added new animation features ([https://github.com/multitheftauto/mtasa-blue/commit/aa0591c6f7b529a27b4ed8667e1dc70e68bd9386 aa0591c] by '''Tracer''')&lt;br /&gt;
::* [[getPedAnimationProgress]]&lt;br /&gt;
::* [[getPedAnimationSpeed]]&lt;br /&gt;
::* [[getPedAnimationLength]]&lt;br /&gt;
:* Added [[killPedTask]] ([https://github.com/multitheftauto/mtasa-blue/commit/e4a502bc7619dc3913c70d169f6105ecfb0633ff e4a502b] by '''Proxy-99''')&lt;br /&gt;
:* Added ped shadow features ([https://github.com/multitheftauto/mtasa-blue/commit/26d18288730fd3a7a854152da60c9acd18ab6c6f 26d1828] by '''Proxy-99''')&lt;br /&gt;
::* [[setDynamicPedShadowsEnabled]]&lt;br /&gt;
::* [[isDynamicPedShadowsEnabled]]&lt;br /&gt;
::* [[resetDynamicPedShadows]]&lt;br /&gt;
:* Added [[playPedVoiceLine]] ([https://github.com/multitheftauto/mtasa-blue/commit/7067ac1a73bb0b8c5a1f37794504a00e9703332e 7067ac1] by '''FileEX''')&lt;br /&gt;
&lt;br /&gt;
* New [[player]] functions&lt;br /&gt;
:* Added [[isPlayerCrosshairVisible]] ([https://github.com/multitheftauto/mtasa-blue/commit/03e851a2f5ff2d917ba3c7a1c7577fdb5b8d2a6f 03e851a], [https://github.com/multitheftauto/mtasa-blue/commit/5f21c32fb0725140d6d03476e08de330d429b55a 5f21c32] by '''FileEX''')&lt;br /&gt;
:* New '''HUD''' functions ([https://github.com/multitheftauto/mtasa-blue/commit/5ea0e0fb23b21750207b23191db92562cf9b822c 5ea0e0f] by '''FileEX''')&lt;br /&gt;
::* [[setPlayerHudComponentProperty]]&lt;br /&gt;
::* [[getPlayerHudComponentProperty]]&lt;br /&gt;
::* [[resetPlayerHudComponentProperty]]&lt;br /&gt;
&lt;br /&gt;
* New [[vehicle]] functions&lt;br /&gt;
:* Added [[setVehicleWheelsRotation]] ([https://github.com/multitheftauto/mtasa-blue/commit/aeb113d269fffee7d9ac435ce87b51e905e9efa6 aeb113d] by '''gta191977649''')&lt;br /&gt;
:* Added [[getVehicleEntryPoints]] ([https://github.com/multitheftauto/mtasa-blue/commit/bf588c163cd5bc134771e3842a6585212f06307f bf588c1] by '''MegadreamsBE''')&lt;br /&gt;
:* Added [[setVehicleSmokeTrailEnabled]] and [[isVehicleSmokeTrailEnabled]] for planes ([https://github.com/multitheftauto/mtasa-blue/commit/a5dfc5223358127299511b618ab29da08ff23030 a5dfc52] by '''Proxy-99''')&lt;br /&gt;
:* Added [[setVehicleRotorState]] and [[getVehicleRotorState]] for planes and helicopters ([https://github.com/multitheftauto/mtasa-blue/commit/c7644f2773c37c4e3d40b00807f2e962daca83b6#diff-9a175949acc865a4deea435d73c2082716ab68c6811ef1a657783f3d420dc00fR165 c7644f2] by '''FileEX''')&lt;br /&gt;
:* Added '''vehicle audio''' functions: ([https://github.com/multitheftauto/mtasa-blue/commit/53ee579670ef4ecec28f44627ff99321bba48cbd 53ee579] by '''TheNormalnij''')&lt;br /&gt;
::* [[setVehicleModelAudioSetting]]&lt;br /&gt;
::* [[getVehicleModelAudioSettings]]&lt;br /&gt;
::* [[resetVehicleModelAudioSettings]]&lt;br /&gt;
::* [[setVehicleAudioSetting]]&lt;br /&gt;
::* [[getVehicleAudioSettings]]&lt;br /&gt;
::* [[resetVehicleAudioSettings]]&lt;br /&gt;
&lt;br /&gt;
* New '''camera''' functions ([https://github.com/multitheftauto/mtasa-blue/commit/40ec398bb15e775d1552286eb86fe7aa0dffefa4 40ec398], [https://github.com/multitheftauto/mtasa-blue/commit/d9c2793de2a9f0782ec59cf0ef9907abf935d421 d9c2793] by '''Tracer''')&lt;br /&gt;
:* [[shakeCamera]]&lt;br /&gt;
:* [[resetShakeCamera]]&lt;br /&gt;
&lt;br /&gt;
* New '''game-time''' functions ([https://github.com/multitheftauto/mtasa-blue/commit/b8b7ce555e2f0f0dd74425ac7c91786374513bee b8b7ce5] by '''Proxy-99''')&lt;br /&gt;
:* [[setTimeFrozen]]&lt;br /&gt;
:* [[isTimeFrozen]]&lt;br /&gt;
:* [[resetTimeFrozen]]&lt;br /&gt;
&lt;br /&gt;
* New [[element]] functions&lt;br /&gt;
:* Added [[setElementBoneQuaternion]] and [[getElementBoneQuaternion]] ([https://github.com/multitheftauto/mtasa-blue/commit/10098b0984bf5d5955ea1764e28f616c8a60714f 10098b0] by '''gownosatana''')&lt;br /&gt;
:* Added [[setElementLighting]] ([https://github.com/multitheftauto/mtasa-blue/commit/90fd98a6381991cfa926a9a65b9b934d0343e2b1 90fd98a] by '''FileEX''')&lt;br /&gt;
&lt;br /&gt;
* New [[browser]] functions&lt;br /&gt;
:* Added [[isBrowserGPUEnabled]] ([https://github.com/multitheftauto/mtasa-blue/commit/bfdfdb5f44726df85626e6e3e06c2a319c0c8962 bfdfdb5] by '''Lpsd''')&lt;br /&gt;
&lt;br /&gt;
* New '''weapons''' functions&lt;br /&gt;
:* Added [[setWeaponRenderEnabled]] &amp;amp; [[isWeaponRenderEnabled]] ([https://github.com/multitheftauto/mtasa-blue/commit/efed59b7dc7b076219f1c8a868ef8aa028582127 efed59b] by '''FileEX''')&lt;br /&gt;
&lt;br /&gt;
====Events====&lt;br /&gt;
* Added [[onClientCoreCommand]] ([https://github.com/multitheftauto/mtasa-blue/commit/b2cf02943924c4972d2a695cdbfd7c9873fc3cbb b2cf029] by '''Pieter-Dewachter''')&lt;br /&gt;
&lt;br /&gt;
* Added [[onClientBrowserConsoleMessage]] ([https://github.com/multitheftauto/mtasa-blue/pull/3676 #3676], [https://github.com/multitheftauto/mtasa-blue/commit/d296a653c5ce2ecfd4f7150d74391b703b773baf d296a65] by '''gownosatana''' and '''Tracer''')&lt;br /&gt;
&lt;br /&gt;
=== Server ===&lt;br /&gt;
====Functions====&lt;br /&gt;
* New [[ACL]] functions&lt;br /&gt;
:* Added [[aclObjectGetGroups]] ([https://github.com/multitheftauto/mtasa-blue/commit/cf46bd8487bdb2d0cafdab1f43936357f670fe10 cf46bd8] by '''Tracer''')&lt;br /&gt;
&lt;br /&gt;
* New '''acl-account''' functions&lt;br /&gt;
:* Added [[getAccountType]] ([https://github.com/multitheftauto/mtasa-blue/commit/545f54b6ae0bfc721abba12402ad3787ed9ae811 545f54b] by '''Tracer''')&lt;br /&gt;
:* Added [[setAccountSerial]] ([https://github.com/multitheftauto/mtasa-blue/commit/a0c2e410f225ebd245a7c5b8031812cf94360097 a0c2e41] by '''camargo2019''')&lt;br /&gt;
&lt;br /&gt;
* New [[vehicle]] functions&lt;br /&gt;
:* Added new vehicle respawn functions ([https://github.com/multitheftauto/mtasa-blue/commit/1ff7137fd4477626d7ef4abfb1c696872cdf0eab 1ff7137], [https://github.com/multitheftauto/mtasa-blue/commit/d93287de761e568400b3b555a277e4ead6546ca3 d93287d] by '''Tracer''')&lt;br /&gt;
::* [[isVehicleRespawnable]]&lt;br /&gt;
::* [[getVehicleRespawnDelay]]&lt;br /&gt;
::* [[getVehicleIdleRespawnDelay]]&lt;br /&gt;
&lt;br /&gt;
* Added [[createBuilding]] to server-side also ([https://github.com/multitheftauto/mtasa-blue/commit/6e221298f4998c576ebf5a783cd0761b89117a7a 6e22129] by '''TheNormalnij''')&lt;br /&gt;
&lt;br /&gt;
* Security improvements for element-data system ([https://github.com/multitheftauto/mtasa-blue/commit/750d09adb9fd35f4c1b7786966b7ca292e35c200 750d09a] by '''TheNormalnij''')&lt;br /&gt;
:* Added [[onPlayerChangesProtectedData]] event&lt;br /&gt;
:* Added '''elementdata_whitelisted''' tag to the '''mtaserver.conf'''&lt;br /&gt;
:* Added '''clientChangesPolicy''' argument to the [[setElementData]].&lt;br /&gt;
&lt;br /&gt;
* Added new [[Server_mtaserver.conf|mta_server.conf]] tags:&lt;br /&gt;
&amp;lt;!--:* Added object specific contact radius and limit contact check. This can be set in the [[server_mtaserver.conf#object_contact_sync_radius|mtaserver.conf]]([https://github.com/multitheftauto/mtasa-blue/commit/6085796cafd1008ed4a74eae614d651c6c734741 6085796] by '''MegadreamsBE''')--&amp;gt;&lt;br /&gt;
:* Added [[Server_mtaserver.conf#vehicle_contact_sync_radius#vehicle_contact_sync_radius|vehicle_contact_sync_radius]] tag ([https://github.com/multitheftauto/mtasa-blue/commit/e3338c2fbbdb500c4ce28dc0677ceadef1f1ca4c e3338c2] by '''MegadreamsBE''')&lt;br /&gt;
:* Added [[Server_mtaserver.conf#vehicle_contact_sync_radius#check_duplicate_serials|check_duplicate_serials]] tag ([https://github.com/multitheftauto/mtasa-blue/commit/e094942b75117a49cae8c35d6508f37d0cf511fe e094942] by '''Nico834''')&lt;br /&gt;
:* Added [[Server_mtaserver.conf#vehicle_contact_sync_radius#elementdata_whitelisted|elementdata_whitelisted]] tag [https://github.com/multitheftauto/mtasa-blue/commit/750d09adb9fd35f4c1b7786966b7ca292e35c200 750d09a] by '''TheNormalnij''')&lt;br /&gt;
&lt;br /&gt;
====Events====&lt;br /&gt;
* Added [[onExplosion]] event ([https://github.com/multitheftauto/mtasa-blue/commit/9edffc4997579583407e8c2910264b344cf626a3 9edffc4] by '''botder''')&lt;br /&gt;
* Added [[onPlayerProjectileCreation]] and [[onPlayerDetonateSatchels]] events ([https://github.com/multitheftauto/mtasa-blue/commit/bc404021f66228fb00f1f136a606425da6075daa bc40402] by '''Zangomangu''')&lt;br /&gt;
* Added [[onPlayerTriggerEventThreshold]] event ([https://github.com/multitheftauto/mtasa-blue/commit/eae47fe2f432d9053c425fd515ea27f963c254ec eae47fe] by '''Lpsd''')&lt;br /&gt;
* Added [[onResourceStateChange]] ([https://github.com/multitheftauto/mtasa-blue/commit/cfe9cd9d0006580e7e70dc9e93672e3d1d3b9836 cfe9cd9] by '''Tracer''')&lt;br /&gt;
* Added [[onPlayerTeamChange]] ([https://github.com/multitheftauto/mtasa-blue/commit/c4e18c618db299ea05f5395c798f2a7d6515f5ea c4e18c6] by '''esmail9900''')&lt;br /&gt;
* Added [[onAccountCreate]] and [[onAccountRemove]] ([https://github.com/multitheftauto/mtasa-blue/commit/545f54b6ae0bfc721abba12402ad3787ed9ae811 545f54b] by '''Tracer''')&lt;br /&gt;
* Added [[onPlayerTriggerInvalidEvent]] ([https://github.com/multitheftauto/mtasa-blue/commit/5b4122d35f725e4d258b408253c93e7cbd2ec783 5b4122d] by '''Lpsd''')&lt;br /&gt;
* Added [[onPlayerChangesWorldSpecialProperty]] event ([https://github.com/multitheftauto/mtasa-blue/commit/bbf511d4c5a94fc42d4ead201446fcef8ae430ec bbf511d] by '''Nico834''')&lt;br /&gt;
* Added [[onPlayerChangesProtectedData]] event ([https://github.com/multitheftauto/mtasa-blue/commit/750d09adb9fd35f4c1b7786966b7ca292e35c200 750d09a] by '''TheNormalnij''')&lt;br /&gt;
* Added [[onShutdown]] ([https://github.com/multitheftauto/mtasa-blue/commit/aa20c7d279ac92f1f98c54e79fda7fe00de64e50 aa20c7d] by '''FileEX''')&lt;br /&gt;
* Added [[onPedWeaponReload]] and [[onPlayerWeaponReload]] ([https://github.com/multitheftauto/mtasa-blue/commit/e71f4828b46bb69b9622a11d0f700a79f986ee9b e71f482] by '''Nico834''')&lt;br /&gt;
* Added [[onPlayerTeleport]] ([https://github.com/multitheftauto/mtasa-blue/commit/4000ea4edb37d2d2caeb60a5977f7a38c8a22f06 a38e6ac] by '''imfelipedev''')&lt;br /&gt;
* Added [[onAccountNameChange]] ([https://github.com/multitheftauto/mtasa-blue/commit/078d46b13164c940f3a713039e1a1be6d52c6c76 078d46b] by '''Davis22d''')&lt;br /&gt;
&lt;br /&gt;
== 77 Changes and Bug Fixes ==&lt;br /&gt;
=== Shared ===&lt;br /&gt;
* Fixed random toggle of world special properties ([https://github.com/multitheftauto/mtasa-blue/commit/bf95b1d16e31f36899350e2acac4bb8adfad5cdd bf95b1d] by '''samr46''')&lt;br /&gt;
* Many debugscript fixes&lt;br /&gt;
:* Fixed [[onClientDebugMessage]]/[[onDebugMessage]] recognizing level 4 as 0 ([https://github.com/multitheftauto/mtasa-blue/commit/783971efbdfcae622dbc03fd7647c337c2a3a306 783971e] by '''Tracer''')&lt;br /&gt;
:* Fixed outputDebugString level 4 colors ([https://github.com/multitheftauto/mtasa-blue/commit/5d4d7df3b8ff703cf954f3af394c811c489dcb18 5d4d7df] by '''MegadreamsBE''')&lt;br /&gt;
:* Fixed [[outputDebugString]] level 4 not being logged ([https://github.com/multitheftauto/mtasa-blue/commit/1951a5e62d35b2cf4ec292d294f8c818b8463418 1951a5e] by '''MegadreamsBE''')&lt;br /&gt;
:* Fixed outputDebugString with level 4 not showing ([https://github.com/multitheftauto/mtasa-blue/commit/b459973f8ad00aff79042a338a70700a21b426dc b459973] by '''srslyyyy''')&lt;br /&gt;
&lt;br /&gt;
* Ped sync improvements ([https://github.com/multitheftauto/mtasa-blue/commit/f5b599c9f45777f924f7980cadb2d3cc6431d8b8 f5b599c] by '''tederis''')&lt;br /&gt;
* Fixed &amp;quot;Using setElementHealth on a dead ped makes it invincible&amp;quot; ([https://github.com/multitheftauto/mtasa-blue/commit/836888379dc3e434752ad20c10a8d7d33ffc65a2 8368883] by '''FileEX''')&lt;br /&gt;
* Fixed setting player model resets their current weapon slot ([https://github.com/multitheftauto/mtasa-blue/commit/f7ce562b645cb05a18658df62d093b753b881bb9 f7ce562] by '''FileEX''')&lt;br /&gt;
* Fixed a bug where ''&amp;quot;arrow&amp;quot;'' and ''&amp;quot;checkpoint&amp;quot;'' markers ignored the alpha color ([https://github.com/multitheftauto/mtasa-blue/commit/7988852cf3af9e78f662d76544dc00db408b5c87 7988852] by '''FileEX''')&lt;br /&gt;
* Fixed the goggle effect resetting after changing skin ([https://github.com/multitheftauto/mtasa-blue/commit/1dd291409f791891b54ccf6b1d1cebe08cff13c0 1dd2914] by '''Proxy-99''')&lt;br /&gt;
* Fixed satchels detaching after changing skin ([https://github.com/multitheftauto/mtasa-blue/commit/d93dbf2ca598bf3508364bc7c6337d82c3d9ccb2 d93dbf2] by '''FileEX''')&lt;br /&gt;
* Added '''resourceName''' global variable and added current resource as default argument for [[getResourceName]] ([https://github.com/multitheftauto/mtasa-blue/commit/49fb6c68a27ad85e5abcd563f4c4f8c568305fdb 49fb6c6] by '''Nico834''')&lt;br /&gt;
* Added new parameters '''animGroup''' &amp;amp; '''animID''' for wasted events [[onPlayerWasted]], [[onPedWasted]], [[onClientPlayerWasted]] ([https://github.com/multitheftauto/mtasa-blue/commit/ecd6ed98ca129e7f45bda14384a503bee09495a7 ecd6ed9] by '''Nico834''' and '''G-Moris''')&lt;br /&gt;
* Added optional '''ignoreAlphaLimits''' argument for [[createMarker]] to maintain backward compatibility after adding the ability to change alpha for arrow and checkpoint markers ([https://github.com/multitheftauto/mtasa-blue/commit/121048cb9a14c28dcefca9bf2d4e955ef920a087 121048c] by '''FileEX''')&lt;br /&gt;
* Added optional '''property''' argument for [[getVehicleHandling]] ([https://github.com/multitheftauto/mtasa-blue/commit/a08e38d6507fdc1c051c2b84727c83dd9c418649 a08e38d] by '''XJMLN''')&lt;br /&gt;
* Fixed health value issues ([https://github.com/multitheftauto/mtasa-blue/commit/612f9a6715059baa43182e891258d9c3ceb19591 612f9a6] by '''Tracer''')&lt;br /&gt;
* Fixed [[getTimerDetails]] negative remaining duration ([https://github.com/multitheftauto/mtasa-blue/commit/1c6cab5a94c8c6ff5cf9b1fc0c9bc04808c922f8 1c6cab5] by '''jvstns''')&lt;br /&gt;
* Fixed changing [[setElementCollisionsEnabled]] doesn't update contact element ([https://github.com/multitheftauto/mtasa-blue/commit/71c683f547aac34e876601d24c881227fe3ca05f 71c683f] by '''FileEX''')&lt;br /&gt;
* Removed ability to skip [[addDebugHook]] ([https://github.com/multitheftauto/mtasa-blue/commit/2fecd74fdd453efdcbdddfd8f3fa3c092640cf9f 2fecd74] by '''PlatinMTA''')&lt;br /&gt;
* Fixed hydraulics stopping working after using [[setVehicleHandling]] ([https://github.com/multitheftauto/mtasa-blue/commit/f96836397a075585d4d112eb7d0240f1abf361d4 f968363] by '''FileEX''')&lt;br /&gt;
* Fixed helicopter rotor unaffected by vehicle alpha ([https://github.com/multitheftauto/mtasa-blue/commit/55d39225254c0b9961c1423b0d5695beff20072b 55d3922] by '''FileEX''')&lt;br /&gt;
* Add '''spawnFlyingComponent &amp;amp; breakGlass''' arguments for [[setVehiclePanelState]] ([https://github.com/multitheftauto/mtasa-blue/commit/5b69d700c848e36b2f427bbc6ba5b2c905592783 5b69d70] by '''FileEX''')&lt;br /&gt;
* Fixed armor synchronization ([https://github.com/multitheftauto/mtasa-blue/commit/583e675da976fbf90f45804ad834d8fe33c779a1 583e675] by '''Nico834''')&lt;br /&gt;
* Fixed jetpack disappearing after changing position and coming back after changing skin ([https://github.com/multitheftauto/mtasa-blue/commit/de26a9e98519350f0486290ce886595068c02470 de26a9e] by '''FileEX''')&lt;br /&gt;
* Added support for '''ZLIB''' compression to [[encodeString]] &amp;amp; [[decodeString]]. ([https://github.com/multitheftauto/mtasa-blue/commit/6230161f8d0c83b60aec3f4afa5be88dd213b88b 6230161] by '''samr46''')&lt;br /&gt;
* Fixed a bug where hex color codes were included in the chat message length. ([https://github.com/multitheftauto/mtasa-blue/commit/9a0b1d59233f7001e991262b4df9d1c17850dc08 9a0b1d5] by '''shadylua''')&lt;br /&gt;
&lt;br /&gt;
=== Client ===&lt;br /&gt;
* Update d3dcompiler_47.dll from CEF ([https://github.com/multitheftauto/mtasa-blue/commit/75a1a298113721343090a06d60394f63f64df9ca 75a1a29] and [https://github.com/multitheftauto/mtasa-blue/commit/6d8fd8cc2fe7377318583f70abf58dcdb7d09cb0 6d8fd8c] by '''patrikjuvonen''')&lt;br /&gt;
* Updated translations from Crowdin ([https://github.com/multitheftauto/mtasa-blue/commit/29baf29a0143706eb08ef76c4743a452a7f83600 29baf29] by '''patrikjuvonen''')&lt;br /&gt;
:* Added Azerbaijani to client languages&lt;br /&gt;
* Resolved cursor being invisible with main menu open in certain scenarios ([https://github.com/multitheftauto/mtasa-blue/commit/bb1f675e6fee0ca3967f05afb5d2592dec9459b2 bb1f675] by '''Lpsd''')&lt;br /&gt;
* Partially fixed screen flickering on high memory usage ([https://github.com/multitheftauto/mtasa-blue/commit/1a886460a9fab1041cfba38078ae544b0fa51240 1a88646] by '''Zangomangu''')&lt;br /&gt;
* Added ''texture hit info'' parameter to [[processLineOfSight]] ([https://github.com/multitheftauto/mtasa-blue/commit/86f3344d1371a9783c2c7b755b895160a03ff6cd 86f3344] by '''Pirulax''')&lt;br /&gt;
* Fixed CStreamingSA::GetUnusedStreamHandle ([https://github.com/multitheftauto/mtasa-blue/commit/38624a4c2d18f4b60064d49069d3bcd81fbb4385 38624a4] by '''tederis''')&lt;br /&gt;
* IMG count extension ([https://github.com/multitheftauto/mtasa-blue/commit/1a60f6094b6660d29cabae780e6fbea5f5f1abf2 1a60f60] by '''tederis''')&lt;br /&gt;
* Fixed a desync state after aborted carjacking ([https://github.com/multitheftauto/mtasa-blue/commit/3f510fcdc7722cdfcb2e09ea43990b56aa43162b 3f510fc] by '''Zangomangu''')&lt;br /&gt;
* Allowed allocating clump models ([https://github.com/multitheftauto/mtasa-blue/commit/428561f1ebab49b8370ef0f022510cd67e98ab59 428561f] by '''TheNormalnij''')&lt;br /&gt;
* Fixed crash in CEF init ([https://github.com/multitheftauto/mtasa-blue/commit/c782826c955dfbdbaa67852a245e1c601d6b9f2c c782826] by '''TheNormalnij''')&lt;br /&gt;
* Fixed &amp;quot;Changing vehicle model from doorless or &amp;quot;doorful&amp;quot; causes doors to fall off&amp;quot; ([https://github.com/multitheftauto/mtasa-blue/commit/d6659dae263e2883d9e479ca271f0e9c8e622f95 d6659da] by '''FileEX''')&lt;br /&gt;
* Fixed &amp;quot;Wheel visibility when using setVehicleWheelStates&amp;quot;  ([https://github.com/multitheftauto/mtasa-blue/commit/51c9257a427957642932a216bd76cb7de59fea1b 51c9257] by '''FileEX''')&lt;br /&gt;
* Added new world special property ''burnflippedcars'' ([https://github.com/multitheftauto/mtasa-blue/commit/938b306add48245e578ba6036f1a77521e277194 938b306] by '''samr46''')&lt;br /&gt;
* Streaming buffer restore and fixes ([https://github.com/multitheftauto/mtasa-blue/commit/6c86ebbf0801c45d5e0bcbb9d9f2e8fd55525b15 6c86ebb] by '''Pirulax''')&lt;br /&gt;
* Fixed Unicode file path passed in CClientIMG ([https://github.com/multitheftauto/mtasa-blue/commit/c57f07bfad8b02953dbe7b2b6e9b9de08ba88226 c57f07b] by '''TheNormalnij''')&lt;br /&gt;
* Added new world special property ''fireballdestruct'' ([https://github.com/multitheftauto/mtasa-blue/commit/219ad73d600140724eefcf5ca4040ac417cdee12 219ad73] by '''samr46''')&lt;br /&gt;
* Fixed &amp;quot;Hide question box when hiding main menu&amp;quot; ([https://github.com/multitheftauto/mtasa-blue/commit/4beff0447f093c66594a5f32ad5e52c7d7188ce9 4beff04] by '''XJMLN''')&lt;br /&gt;
* Fixed engineFreeModel regression ([https://github.com/multitheftauto/mtasa-blue/commit/b52500e92fb2591c092a6e66121471f098a2e044 b52500e] by '''TheNormalnij''')&lt;br /&gt;
* Fixed assert when model info is missing ([https://github.com/multitheftauto/mtasa-blue/commit/d431e5e16120b63beafbfe69110da601d12a76bb d431e5e] by '''TheNormalnij''')&lt;br /&gt;
* Fixed engineFreeModel crashes ([https://github.com/multitheftauto/mtasa-blue/commit/c289c22fb9a13730b7fd793752d84adbf2b928ee c289c22] by '''TheNormalnij''')&lt;br /&gt;
* Filtered URLs in requestBrowserDomains with incorrect symbols ([https://github.com/multitheftauto/mtasa-blue/commit/74bbb068acc6757ff0e04d0c63b999236e51ce63 74bbb06] by '''TheNormalnij''')&lt;br /&gt;
* Fixed issues with ped shaders ([https://github.com/multitheftauto/mtasa-blue/commit/3bc1e6d98ab13a9e7db95cc616b4645dc761889b 3bc1e6d] by '''Merlin''')&lt;br /&gt;
* Fixed 3D primitives disappearing ([https://github.com/multitheftauto/mtasa-blue/commit/04a1e2ba9157e4a1a91297f91554b72a87bf0ed4 04a1e2b] by '''tederis''')&lt;br /&gt;
* Fixed [[svgSetSize]] issues ([https://github.com/multitheftauto/mtasa-blue/commit/721c2b6d0f0c4ab016be079f1d4e28dec0123a6d 721c2b6] by '''Nico834''')&lt;br /&gt;
* Fixed the marker flickering issue during water cannon effects ([https://github.com/multitheftauto/mtasa-blue/commit/e83f700ee24904c0411b4dad3e695b3c3e30d9e4 e83f700] by '''Merlin''')&lt;br /&gt;
* Fixed buildings removal ([https://github.com/multitheftauto/mtasa-blue/commit/1b40db7cb5b63966ee97d0cbe79190360e1d32a0 1b40db7] by '''tederis''')&lt;br /&gt;
* Fixed crashes caused by [[createBuilding]] with [[engineRequestModel]] ([https://github.com/multitheftauto/mtasa-blue/commit/6245a68f3d97fc222d78fbc66b67f422a13710bf 6245a68] by '''TheNormalnij''')&lt;br /&gt;
* Fixed wrong getModelMatrix result for buildings ([https://github.com/multitheftauto/mtasa-blue/commit/f691946bc2d3dac75bd27d31886cd6b66d55811d f691946] by '''TheNormalnij''')&lt;br /&gt;
* Fixed crashes for ''timed-object'' in [[engineRequestModel]] ([https://github.com/multitheftauto/mtasa-blue/commit/229389a4bd1c4c02010ba27ce26a428b41b68560 229389a] by '''TheNormalnij''')&lt;br /&gt;
* Fixed incorrect colors for 3D draws ([https://github.com/multitheftauto/mtasa-blue/commit/1f2c6e75fb71b01f0053f151e766a232ed33692b 1f2c6e7] by '''Nico834''')&lt;br /&gt;
* Add missing definition GuiGridList::getColumnWidth ([https://github.com/multitheftauto/mtasa-blue/commit/b34b1d5362291bcf00c7a0a0b694f60e1dccb363 b34b1d5] by '''Lpsd''')&lt;br /&gt;
* Fixed [[resetPedVoice]] not working at all ([https://github.com/multitheftauto/mtasa-blue/commit/3d8bd504f009fc2aa66e1dc9d35427a889ccd6aa 3d8bd50] by '''Tracer''')&lt;br /&gt;
* Added LOD support for buildings ([https://github.com/multitheftauto/mtasa-blue/commit/77ab3e64a3c6dacdcee02a223b67aec6c5b97ec2 77ab3e6] by '''TheNormalnij''')&lt;br /&gt;
* Added render stages for 3D primitives (new ''stage'' parameter) ([https://github.com/multitheftauto/mtasa-blue/commit/841447684c2d1992656555f81d73da52b2ce5c4f 8414476] by '''tederis''')&lt;br /&gt;
* Added disable option for [[engineSetModelPhysicalPropertiesGroup]] ([https://github.com/multitheftauto/mtasa-blue/commit/b6216cad058582b0feb34e98e94531d4acbf7c5b b6216ca] by '''TheNormalnij''')&lt;br /&gt;
* Fixed return correct value for stuntDistance parameter ([https://github.com/multitheftauto/mtasa-blue/commit/1f464d61c8c5f1400faa5472ccb67d2436d52903 1f464d6] by '''XJMLN''')&lt;br /&gt;
* Fixed [[engineRestoreModelPhysicalPropertiesGroup]] restores incorrect group ([https://github.com/multitheftauto/mtasa-blue/commit/291dfb4bc9bd72307a4ba4b42ffcbfc03ded4e38 291dfb4] by '''TheNormalnij''')&lt;br /&gt;
* Fixed OGG sound files can't be played as RAW data ([https://github.com/multitheftauto/mtasa-blue/commit/2764b7983c4e1bde20b894ebcfef5f230b149030 2764b79] by '''FileEX''')&lt;br /&gt;
* Implement [[getElementBoundingBox]] for buildings ([https://github.com/multitheftauto/mtasa-blue/commit/7b228daea3e0dc22d808abcf0eb568d99efcf63d 7b228da] by '''TheNormalnij''')&lt;br /&gt;
* Fixed streaming size check after [[engineAddImage]] ([https://github.com/multitheftauto/mtasa-blue/commit/5cdc04d6d61f40e89a5da3d27ae9575f4a419a08 5cdc04d] by '''TheNormalnij''')&lt;br /&gt;
* Fixed [[removeWorldModel]] crash ([https://github.com/multitheftauto/mtasa-blue/commit/ae98b04753b54208961759b295bef44f0ffafe43 ae98b04] by '''TheNormalnij''')&lt;br /&gt;
* Fixed crash when using [[extinguishFire]] in [[onClientVehicleDamage]] event ([https://github.com/multitheftauto/mtasa-blue/commit/d6ae4e9e24b0b7de704a3cbeec25dfd661b4a3fc d6ae4e9] by '''FileEX''')&lt;br /&gt;
* Fixed weapon models being invisible when using the jetpack with [[setJetpackWeaponEnabled]] ([https://github.com/multitheftauto/mtasa-blue/commit/a68c2c4232c28c6ba5595a814b89be976c4fa9c3 a68c2c4] by '''FileEX''')&lt;br /&gt;
* Fixed animations validation to avoid crashes ([https://github.com/multitheftauto/mtasa-blue/commit/27a24b551d86c6fbf9ee308603f24b011e941399 27a24b5] by '''G-Moris''')&lt;br /&gt;
* Fixed a bug where the &amp;quot;attacker&amp;quot; parameter is always nil in the [[onClientObjectBreak]] event if the object is glass ([https://github.com/multitheftauto/mtasa-blue/commit/dca5e2065af4a0195526541f9a8285db0401616e dca5e20] by '''FileEX''')&lt;br /&gt;
* Fixed a bug where the [[onClientObjectBreak]] event was not triggered if the glass was broken by an explosion ([https://github.com/multitheftauto/mtasa-blue/commit/dca5e2065af4a0195526541f9a8285db0401616e dca5e20] by '''FileEX''')&lt;br /&gt;
* Fixed a bug that prevented players from switching weapons with an active jetpack ([https://github.com/multitheftauto/mtasa-blue/commit/180fbc0b5fdba95450e7a519f78f7588849349bf 180fbc0] by '''FileEX''')&lt;br /&gt;
* Fixed a bug where hitElement in the [[onClientVehicleCollision]] event was always nil for projectiles ([https://github.com/multitheftauto/mtasa-blue/commit/43cc7b3e34eb4680120eb8ebf40d31d845850df2 43cc7b3] by '''FileEX''')&lt;br /&gt;
* Fixed a bug where hydra flares did not work with [[createProjectile]] ([https://github.com/multitheftauto/mtasa-blue/commit/2bdac16d1d868f396786fbfdcfa2595004e1fff5 2bdac16] by '''FileEX''')&lt;br /&gt;
* Fixed inconsistent extra component names ([https://github.com/multitheftauto/mtasa-blue/commit/d4f884935626c638dca0f7f45c71cfb22c4e2d72 d4f8849] by '''FileEX''')&lt;br /&gt;
* Fixed a bug where after changing the key in the bind settings, only the key for the &amp;quot;down&amp;quot; status changed, while the &amp;quot;up&amp;quot; key remained unchanged.([https://github.com/multitheftauto/mtasa-blue/commit/3ebefc37951e24cbfb25035d99045d67571b5324 3ebefc3] by '''FileEX''')&lt;br /&gt;
* Maked frame graph scale accordingly to resolution ([https://github.com/multitheftauto/mtasa-blue/commit/e431474c676a253004a26d86fc9e1a6100d329d4 e431474] by '''ffsPLASMA''')&lt;br /&gt;
* Fixed old [[setElementModel]] memory leak ([https://github.com/multitheftauto/mtasa-blue/commit/4e7afa2586c6992a75ac5312378c1096d87148ae 4e7afa2] by '''tederis''')&lt;br /&gt;
* Fixed [[getObjectProperty]] returns invalid ''air_ressistance'' property ([https://github.com/multitheftauto/mtasa-blue/commit/b51e1116283e9ec453881d3c48229b96c6198d5a b51e111] by '''FileEX''')&lt;br /&gt;
* Fixed missing states in [[getPedControlState]] ([https://github.com/multitheftauto/mtasa-blue/commit/3333a115f1a14f00378161681aeba609b4e993c0 3333a11] by '''FileEX''')&lt;br /&gt;
* Fixed for randomly bright objects after weapon change  ([https://github.com/multitheftauto/mtasa-blue/commit/9b9120c73ec97bf1b2f24703889a62fc19326f1f 9b9120c] by '''FileEX''')&lt;br /&gt;
* Fixed some small problems with Device Selection Dialog ([https://github.com/multitheftauto/mtasa-blue/commit/6f90880bee4d9169d4eda5f6afc63f4ed1bf652f 6f90880] by '''forkerer''')&lt;br /&gt;
* Allow dynamic models to be created as buildings ([https://github.com/multitheftauto/mtasa-blue/commit/642438ec1302daba50b6f6069844e96cbaa31818 642438e] by '''TheNormalnij''')&lt;br /&gt;
* Fixed crash when disconnecting from server after creating projectiles ([https://github.com/multitheftauto/mtasa-blue/commit/9ab6104d9c1ec246fde29ae6bf303ae5848bbbe1 9ab6104] by '''TheNormalnij''')&lt;br /&gt;
* Allow client peds to enter/exit client vehicles ([https://github.com/multitheftauto/mtasa-blue/pull/3678 #3678], [https://github.com/multitheftauto/mtasa-blue/commit/67beec77b06897552dc2c756c15283bfdc19b143 67beec7] by '''gownosatana''' and '''Tracer''')&lt;br /&gt;
* Use immersive dark mode on game window ([https://github.com/multitheftauto/mtasa-blue/commit/fd9520498919ae191c718c49b2a5c742bbbf8239 fd95204] by '''FileEX''')&lt;br /&gt;
* Added damageable objects support for [[engineRequestModel]] ([https://github.com/multitheftauto/mtasa-blue/commit/21593b9239765343ad5a4975c9f8424e571a036d 21593b9] by '''TheNormalnij''')&lt;br /&gt;
* Fixed crash with [[setElementHealth]] in [[onClientPedDamage]] event ([https://github.com/multitheftauto/mtasa-blue/commit/2d3397df56827f7c218689873f8b4741ea9af44e 2d3397d] by '''FileEX''')&lt;br /&gt;
* Fixed [[setPedControlState]] is aborted when ped created/player join ([https://github.com/multitheftauto/mtasa-blue/commit/8117ebcb95d3e3c35c400ee073a6ebab81e3f9fb 8117ebc] by '''FileEX''')&lt;br /&gt;
* Added '''buildings''' support to [[engineApplyShaderToWorldTexture]] ([https://github.com/multitheftauto/mtasa-blue/commit/fe1dd063170aef6a866bc241c305278a73200fdd fe1dd06] by '''TheNormalnij''')&lt;br /&gt;
* Fixed unintended behavior for ped control states ([https://github.com/multitheftauto/mtasa-blue/commit/a38e6acaf5c0fd83b5627660439f36d380cd26e6 a38e6ac] by '''Nico834''')&lt;br /&gt;
* Fixed SVG colors bug ([https://github.com/multitheftauto/mtasa-blue/commit/04f297b7b1aecb3753c8fbfa19fa9627abf422b4 04f297b] by '''TheNormalnij''')&lt;br /&gt;
* Fixed &amp;quot;CEF Launcher&amp;quot; process remaining after closing MTA ([https://github.com/multitheftauto/mtasa-blue/commit/a6c00278a5329e3b2b870b298d78565b14a7bed2 a6c0027] by '''botder''')&lt;br /&gt;
* Removed ''login'' cmd from chat history ([https://github.com/multitheftauto/mtasa-blue/commit/4639aea8a5544bfa4460bfcc8bba1d5b032e931a 4639aea] by '''PlatinMTA''')&lt;br /&gt;
* Fixed in-game updater dialog incorrectly showing 0% progress ([https://github.com/multitheftauto/mtasa-blue/commit/40d9ac11a9864d4f26c9eb1979e3a30ec0624061 40d9ac1] by '''Dutchman101''')&lt;br /&gt;
* Fixed invalid references counter to TXD after [[engineSetModelTXDID]] (top 1 crash according to players crash stats) ([https://github.com/multitheftauto/mtasa-blue/commit/1b7e9e82997fb4ac2eec5722d9134299902a16e6 1b7e9e8] by '''TheNormalnij''')&lt;br /&gt;
* Fixed server cache memory leak on connecting to another server ([https://github.com/multitheftauto/mtasa-blue/commit/e3476592fc46dc28f9da98f525797ae94ebf3ec3 e347659] by '''Lpsd''')&lt;br /&gt;
* Added the ability to set CPU affinity (CPU 0) in the '''advanced''' tab in the settings ([https://github.com/multitheftauto/mtasa-blue/commit/d04c92b24e7b85f6015fa93192ddda06e9023c85 d04c92b] by '''FileEX''')&lt;br /&gt;
* Fixed crash in ''CClientDisplayManager'' (top 2 crash according to players crash stats) ([https://github.com/multitheftauto/mtasa-blue/commit/0df0a4b40f7aea7c16473d0844a03fcece888420 0df0a4b] by '''Lpsd''')&lt;br /&gt;
* Set main menu FPS limit to current display refresh rate ([https://github.com/multitheftauto/mtasa-blue/commit/acbcc8e03ba8ac677a9c2c8182fb6f24868cae46 acbcc8e] by '''samr46''')&lt;br /&gt;
* [[setSoundEffectParameter]] and [[getSoundEffectParameters]] can be now used also on players! ([https://github.com/multitheftauto/mtasa-blue/commit/20851ecf7d69cc42fc00a62446a87d7e99c1e19d 20851ec] by '''tederis''')&lt;br /&gt;
* Fixed elements sometimes being visible from other dimensions in the current dimension ([https://github.com/multitheftauto/mtasa-blue/commit/9af03b3263a5a320e2f92140f6caa6c94b9fe9a5 9af03b3], [https://github.com/multitheftauto/mtasa-blue/commit/1dff560099459bc1b8248ef50643886158b0d731 1dff560] by '''FileEX''' &amp;amp; '''tederis''')&lt;br /&gt;
* Fixed bug &amp;quot;Copying text from CEF Browser shows Chinese characters in console&amp;quot; ([https://github.com/multitheftauto/mtasa-blue/commit/892beb0457b461d5afd5d91e86763181bdb972d3 892beb0] by '''ColombuxMaximus''')&lt;br /&gt;
* Fixed a bug where hidden vehicle components became visible after changing the variant or handling ([https://github.com/multitheftauto/mtasa-blue/commit/1d81347ee7e2614cd94e4b1807947d2c98b3305f 1d81347] by '''ColombuxMaximus''')&lt;br /&gt;
* Fixed persian characters in main menu &amp;amp; CEGUI ([https://github.com/multitheftauto/mtasa-blue/commit/efb2edfa853aa9a95f39ed9a843c3230b2e627cf efb2edf] by '''tzwer''')&lt;br /&gt;
* Added new movement states to [[getPedMoveState]] and fixed incorrect returning of &amp;quot;fall&amp;quot; ([https://github.com/multitheftauto/mtasa-blue/commit/c43c1b98b8ec0b7253d98c65b405ead482a765d8 c43c1b9], [https://github.com/multitheftauto/mtasa-blue/commit/797331fadbca4367f6cfd43633e48af44a99a115 797331f] by '''FileEX''')&lt;br /&gt;
* Fixed a bug where friendly fire did not prevent fire damage ([https://github.com/multitheftauto/mtasa-blue/commit/9c4397707dd2a94d8a6124d6b502d39793f0d2ba 9c43977] by '''FileEX''')&lt;br /&gt;
* Fixed [[engineReplaceModel]] memory leak &amp;amp; potential crash ([https://github.com/multitheftauto/mtasa-blue/commit/1dbbfd025c5ff791f31e1ef4f255514198f88d0c 1dbbfd0] by '''FileEX''')&lt;br /&gt;
* Fixed '''ALT + F4''' not working ([https://github.com/multitheftauto/mtasa-blue/commit/93963a98f24fdb5e8374baaddaa6d99260be967e 93963a9] by '''lopezloo''')&lt;br /&gt;
* Fixed [[setPedOnFire]] doesn't cancel '''TASK_SIMPLE_PLAYER_ON_FIRE''' ([https://github.com/multitheftauto/mtasa-blue/commit/2a2f31bccd9d90adfc2b03f1f63248b9d016c725 2a2f31b] by '''FileEX''')&lt;br /&gt;
* Fixed crash related to buildings ([https://github.com/multitheftauto/mtasa-blue/commit/4bcded5c89caffd005b266021d3c1bbd83a554cb 4bcded5] by '''tederis''')&lt;br /&gt;
* Fixed client freeze in some locations on the map ([https://github.com/multitheftauto/mtasa-blue/commit/3a376e479201b30b27488a5a674d7d816397e79a 3a376e4] by '''tederis''')&lt;br /&gt;
* Added disconnect warning when using quick connect while connected to server ([https://github.com/multitheftauto/mtasa-blue/commit/be395665c0f5094793b923e9f4fb94056ccff961 be39566] by '''omar-o22''')&lt;br /&gt;
* Added missing trashcan in help section ([https://github.com/multitheftauto/mtasa-blue/commit/853a7d54a25bc09ee421ac837f22201882ece1b7 853a7d5] by '''omar-o22''')&lt;br /&gt;
* Fixed [[getElementsWithinRange]] not working with building element type ([https://github.com/multitheftauto/mtasa-blue/commit/5ad35b46004f4e758348a1a0c0b1024d4becb3c4 5ad35b4], [https://github.com/multitheftauto/mtasa-blue/commit/24bd2187c099a60881cabb001fbb6bb326044c81 24bd218] by '''PlatinMTA''' and '''omar-o22''')&lt;br /&gt;
* Fixed [[getElementDistanceFromCentreOfMassToBaseOfModel]] not working with building element type ([https://github.com/multitheftauto/mtasa-blue/commit/20d36cd3ef687108acf99f97b02965fa5dd6003b 20d36cd] by '''omar-o22''')&lt;br /&gt;
* Added ability to remove all domains from whitelist and blacklist ([https://github.com/multitheftauto/mtasa-blue/commit/280b6cd9917eb8e624fa037f3783eb958123a7a2 280b6cd] by '''omar-o22''')&lt;br /&gt;
&lt;br /&gt;
=== Server ===&lt;br /&gt;
* Fixed bullet sync check in CBulletsyncPacket by verifying total ammo instead of clip ammo ([https://github.com/multitheftauto/mtasa-blue/commit/ca06762413833e1c7f8d17970334607763414a45 ca06762] by '''shadylua''')&lt;br /&gt;
* Check deprecated account name length on [[banPlayer]] to fix all players getting kicked ([https://github.com/multitheftauto/mtasa-blue/commit/b5e2332ca5857f3e984467ca0cb8163ec998ea06 b5e2332] by '''patrikjuvonen''')&lt;br /&gt;
* Fixed a crash in CHandlingManager ([https://github.com/multitheftauto/mtasa-blue/commit/b6867a0d2ed0b4ab12a4461c3f1ca7d667bdedbc b6867a0] by '''Olya-Marinova''')&lt;br /&gt;
* Removed min-version lua function from old MTA versions ([https://github.com/multitheftauto/mtasa-blue/commit/222b2720c93f29977fffb722f8d42ea3fb5f790d 222b272] by '''Olya-Marinova''')&lt;br /&gt;
* Disallow loadstring by default ([https://github.com/multitheftauto/mtasa-blue/commit/89e2d375d12deb026ee91fedc5e1ced04dc9a723 89e2d37] by '''srslyyyy''')&lt;br /&gt;
* Added valid values for 'donotbroadcastlan' setting ([https://github.com/multitheftauto/mtasa-blue/commit/f8d4422ad75c0d7f21894f9f868aa37ec6993a35 f8d4422] by '''Dark-Dragon''')&lt;br /&gt;
* Fixed &amp;quot;ped revives when syncer changes&amp;quot; ([https://github.com/multitheftauto/mtasa-blue/commit/af604ae7dfec742661206fb809f149140ce3a960 af604ae] by '''Zangomangu''')&lt;br /&gt;
* Fixed files not unloading after renaming ([https://github.com/multitheftauto/mtasa-blue/commit/2846e2794af1d9d441b7b988f49af521bd765fb0 2846e27] by '''W3lac3''')&lt;br /&gt;
* Added ability to limit client triggered events via [[triggerServerEvent]] ([https://github.com/multitheftauto/mtasa-blue/commit/eae47fe2f432d9053c425fd515ea27f963c254ec eae47fe] by '''Lpsd''')&lt;br /&gt;
* Added FileExists check to CMainConfig::AddMissingSettings ([https://github.com/multitheftauto/mtasa-blue/commit/1ebaa28e0381fb114b946f2f5a4d4bc5834ebd03 1ebaa28] by '''Lpsd''')&lt;br /&gt;
* Added server side weapon related checks ([https://github.com/multitheftauto/mtasa-blue/commit/86448ea52c7ee13e554a907c424aa3c891e51e31 86448ea] by '''NanoBob''')&lt;br /&gt;
* Added [[dbConnect]] option for MySQL ''&amp;quot;use_ssl=0&amp;quot;'' ([https://github.com/multitheftauto/mtasa-blue/commit/e6476767a9b6848467f0d123830dd2f90bd4442d e647676] by '''Lpsd''')&lt;br /&gt;
* Added ''content'' parameter to [[onPlayerPrivateMessage]] event ([https://github.com/multitheftauto/mtasa-blue/commit/79f8ed6a374d62e5cf1ec707b2ba25e3a959f509 79f8ed6] by '''FileEX''')&lt;br /&gt;
* Fix ability to move server-side vehicles that are far away from the player. New parameter can be set in the [[Server_mtaserver.conf#vehicle_contact_sync_radius|mtaserver.conf]] ([https://github.com/multitheftauto/mtasa-blue/commit/e3338c2fbbdb500c4ce28dc0677ceadef1f1ca4c e3338c2] by '''MegadreamsBE''')&lt;br /&gt;
* Added ''sync'' parameter for vehicles ([https://github.com/multitheftauto/mtasa-blue/commit/f88d31306d3c7fadfbc1542c85922612fd00b131 f88d313] by '''znvjder''')&lt;br /&gt;
* Fixed server-side pickup collision size ([https://github.com/multitheftauto/mtasa-blue/commit/49d97513e1eb2e0c96c5aa5a1d542d14131edd76 49d9751] by '''Proxy-99''') &lt;br /&gt;
* Fixed ''CSimBulletsyncPacket'' crash ([https://github.com/multitheftauto/mtasa-blue/commit/ee8bc92907a112a5584844329dbb07cc82326ad1 ee8bc92] by '''G-Moris''')&lt;br /&gt;
* Fixed onVehicleExit doesn't trigger if pulled out ([https://github.com/multitheftauto/mtasa-blue/commit/af4f7facca73bb68238437e6eff3504bd6f1cfe0 af4f7fa] by '''Proxy-99''')&lt;br /&gt;
* Fixed arguments in [[setPedAnimation]] being ignored when nil was passed ([https://github.com/multitheftauto/mtasa-blue/commit/f6f544e6b54054a06497fdf94cd077b862af8055 f6f544e] by '''FileEX''')&lt;br /&gt;
* Fixed Sirens not removed correctly ([https://github.com/multitheftauto/mtasa-blue/commit/9e419620069ec8ad5828c50295c1901685166cf9 9e41962] by '''Proxy-99''')&lt;br /&gt;
* Fixed a bug where [[setPedWeaponSlot]] did not update data in [[getPedWeapon]] and [[getPedWeaponSlot]] ([https://github.com/multitheftauto/mtasa-blue/commit/9615523faf84f584179412fb8e0cc04f9f4ee48f 9615523] by '''FileEX''')&lt;br /&gt;
* Added '''player''' parameter to [[onVehicleExplode]] ([https://github.com/multitheftauto/mtasa-blue/commit/1ec1f5be69d3ef99bd2e26fd3d008a7cecd0a5ad 1ec1f5b] by '''FileEX''')&lt;br /&gt;
* Excluded '''meta.xml''' from glob patterns for security reasons ([https://github.com/multitheftauto/mtasa-blue/commit/78f6d669adc97c51a825250dd4dbf1a4a4a0ff15 78f6d66] by '''FileEX''')&lt;br /&gt;
* Fixed the bug where changing a vehicle to one with a different number of seats caused passengers to experience network trouble ([https://github.com/multitheftauto/mtasa-blue/commit/1fcd732ca9031060602c8e2425e40ce602d35253 1fcd732] by '''FileEX''')&lt;br /&gt;
* Glob patterns added to meta.xml for HTML files ([https://github.com/multitheftauto/mtasa-blue/commit/7e6b4d02ec113b7ce3a6fd9937a6e8ad0a1ad9cb 7e6b4d0] by '''FileEX''')&lt;br /&gt;
* Fixed console not maintaining position &amp;amp; size when GUI skin changed ([https://github.com/multitheftauto/mtasa-blue/commit/30d8e6dbfe75db47cf396aa909f43c24c4dbe127] by '''NanoBob''')&lt;br /&gt;
* Added '''includeCustom''' argument for [[getValidPedModels]] clientside ([https://github.com/multitheftauto/mtasa-blue/commit/889567a7a0ecb8a8b8d938826d2395ef9f43a76b] by '''Fernando-A-Rocha''')&lt;br /&gt;
* Fixed '''min_mta_version''' tag for server ([https://github.com/multitheftauto/mtasa-blue/commit/8c0a01bac62ecc3e9510133dee9f8d6700065f03 8c0a01b] by '''Fernando-A-Rocha''')&lt;br /&gt;
* Allowed user to pass multiple resource names to start/stop/restart ([https://github.com/multitheftauto/mtasa-blue/commit/6f5fb9c65ee93a5c1692b0d3516a483dcea48f08 6f5fb9c] by '''botder''')&lt;br /&gt;
* Added sync peds/players animations for new players ([https://github.com/multitheftauto/mtasa-blue/commit/b32eafc70816ece8ad995d98d380d8f6e9950475 b32eafc] by '''FileEX''')&lt;br /&gt;
* Optimized processing big files by server ([https://github.com/multitheftauto/mtasa-blue/commit/cb90339aad461d3ee8c1008f2da10934afc38a4c cb90339] by '''AlexTMjugador''')&lt;br /&gt;
* Separate icon for ''mta-server.exe'' ([https://github.com/multitheftauto/mtasa-blue/commit/6cb9d3edf9686749e524f136985cefb53772898e 6cb9d3e] by '''Nico834''')&lt;br /&gt;
* Fixed a bug that caused warnings in debugscript when using depracated function names as variable names ([https://github.com/multitheftauto/mtasa-blue/commit/f23e39521b7e35ad5389e467360fbc525c099887 f23e395] by '''YelehaUwU''')&lt;br /&gt;
* [[onVehicleExplode]] can now be cancelled! ([https://github.com/multitheftauto/mtasa-blue/commit/fcb5b038981066f561f3792c2ae3d97d76d9d0fe fcb5b03] by '''Nico834''')&lt;br /&gt;
* Added '''eventName''' parameter to [[onPlayerTriggerEventThreshold]] ([https://github.com/multitheftauto/mtasa-blue/commit/76d7764c7ec408b77eb7b12379e88882e014527f 76d7764] by '''ColombuxMaximus''')&lt;br /&gt;
&lt;br /&gt;
=== More Technical Changes and Bug Fixes ===&lt;br /&gt;
&amp;lt;section show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
:* Updated CLuaFunctionParser.h ([https://github.com/multitheftauto/mtasa-blue/commit/55647f4023c78a846870f7c96069fab411cff5c5 55647f4] by '''Xenius97''')&lt;br /&gt;
:* Fixed build after above update ([https://github.com/multitheftauto/mtasa-blue/commit/9dcc651d42ae78b7b04257e7612c5b594cb0fffd 9dcc651] by '''Pirulax''')&lt;br /&gt;
:* Fixed std::unordered_map&amp;lt;std::string, std::string&amp;gt; parsing ([https://github.com/multitheftauto/mtasa-blue/commit/005592417b42de63c3d8ba9c572a81cdc8f96164 0055924] by '''tederis''')&lt;br /&gt;
:* Addendum to [https://github.com/multitheftauto/mtasa-blue/pull/3251 #3251] ([https://github.com/multitheftauto/mtasa-blue/commit/9544a34a28d3b4e766d7d07a44d63a8fe45dc506 9544a34] by '''Lpsd''')&lt;br /&gt;
:* Fixes for [https://github.com/multitheftauto/mtasa-blue/pull/3251 #3251] ([https://github.com/multitheftauto/mtasa-blue/commit/07013d24766a6259f4115bd0349a86f790dbf5d0 07013d2] by '''Lpsd''')&lt;br /&gt;
:* Fixed SetStreamingBufferSize possibly accessing memory out-of-bounds ([https://github.com/multitheftauto/mtasa-blue/commit/e08b84fbfe6ad0431605b31c2ba5a50a8f116dc9 e08b84f] by '''Pirulax''')&lt;br /&gt;
:* Added a check to verify itemList validity ([https://github.com/multitheftauto/mtasa-blue/commit/668073787fa6b952d0f1520e8ccae0999dbdba13 6680737] by '''R4ven47''')&lt;br /&gt;
:* Various code clean ups and refactors&lt;br /&gt;
::* Removed COffsetsMP and EU addresses ([https://github.com/multitheftauto/mtasa-blue/commit/52b0115a2d9157b7a153b5f24316ff6fd053e79b 52b0115] by '''Merlin''')&lt;br /&gt;
::* Removed COffsets and EU addresses ([https://github.com/multitheftauto/mtasa-blue/commit/959141de324126245d2b5ebf029c924302ff64e9 959141d] by '''Merlin''')&lt;br /&gt;
::* Clean ups ''multiplayer_sa'' code ([https://github.com/multitheftauto/mtasa-blue/commit/38982043978dd1ec72230569a6d534792e7c18bd 3898204] by '''CrosRoad95''')&lt;br /&gt;
::* Removed old easter-egg &amp;amp; debug code ([https://github.com/multitheftauto/mtasa-blue/commit/b26f80c3d72d628d63807529b408be4b61a5be60 b26f80c], [https://github.com/multitheftauto/mtasa-blue/commit/530212f34fc44e95599ca5e39e608583ecdbb5cc 530212f] by '''botder''' and '''Merlin''')&lt;br /&gt;
::* Refactored entity hierarchy &amp;lt;!-- Fixed accepting possible malicious packets --&amp;gt; ([https://github.com/multitheftauto/mtasa-blue/commit/fdaced046a9421a39de87b81eaf0f7de7c234c4b fdaced0] by '''Tracer''')&lt;br /&gt;
::* Removed unused symbol from ''CConsole'' class ([https://github.com/multitheftauto/mtasa-blue/commit/4fe9084a2e5c5eeed4b0a9a30a07607c812e923b 4fe9084] by '''Nico834''')&lt;br /&gt;
::* Refactored ''CLuaBlipDefs'' ([https://github.com/multitheftauto/mtasa-blue/commit/d05d09be8b9bd1327e37631411fa1e3b16c4dbb7 d05d09b], [https://github.com/multitheftauto/mtasa-blue/commit/c278c12debfd346377354017992543fc7cf6397b c278c12] by '''FileEX''')&lt;br /&gt;
::* Refactored ''CLuaTeamDefs'' ([https://github.com/multitheftauto/mtasa-blue/commit/74ffa1d0138ab3d848b0e081ca265f18ae6c7bd8 74ffa1d], [https://github.com/multitheftauto/mtasa-blue/commit/f37bbada1381370eeadabd4f4dde2a024ec48f5f f37bbad] by '''Nico834''')&lt;br /&gt;
::* Removed dead ''CAnimManagerSA'' code ([https://github.com/multitheftauto/mtasa-blue/commit/d18d7d35fb50fdeea3f70ad688a5857b29867185 d18d7d3] by '''G-Moris''')&lt;br /&gt;
::* Refactored class hierarchy and removed VTBL hacks ([https://github.com/multitheftauto/mtasa-blue/commit/61d1caffb5bfa9c620c08d43280150906dd172d5 61d1caf] by '''TheNormalnij''')&lt;br /&gt;
::* Refactored ''CWeaponSA'' and ''CPedSA'' classes ([https://github.com/multitheftauto/mtasa-blue/commit/a3b7c8519d0d167c66e70c8c7ed5d2f810b7ae39 a3b7c85], [https://github.com/multitheftauto/mtasa-blue/commit/2526a7dd6cde545e600792dcac3ab1b8ece0edec 2526a7d] by '''FileEX''')&lt;br /&gt;
::* Cleaning up client Common.h and moving enums to separate files ([https://github.com/multitheftauto/mtasa-blue/commit/1e56571479217f787b6444d48770f8aa69f14387 1e56571] by '''FileEX''')&lt;br /&gt;
:* Addd Comments to Frame Rate Fixes in CMultiplayerSA_FrameRateFixes.cpp ([https://github.com/multitheftauto/mtasa-blue/commit/e4e6d1b5a9609cb093a191db405c61339d4280d2 e4e6d1b] by '''Merlin''')&lt;br /&gt;
:* Fixed build after CEF update ([https://github.com/multitheftauto/mtasa-blue/commit/9980252446a6869609b1afa1ae1168282a99cb17 9980252] by '''TheNormalnij''')&lt;br /&gt;
:* Bump chromedriver from 114.0.2 to 119.0.1 in /utils/localization/generate-images ([https://github.com/multitheftauto/mtasa-blue/commit/5d8d3756d98b0272687b87c30adca2961eee86c8 5d8d375])&lt;br /&gt;
:* Bump axios from 1.4.0 to 1.6.1 in /utils/localization/generate-images ([https://github.com/multitheftauto/mtasa-blue/commit/ba018013085058905aa789c4fa3f39c4ed32fc69 ba01801])&lt;br /&gt;
:* Fixed file lock after img:destroy ([https://github.com/multitheftauto/mtasa-blue/commit/c2ccfd2c648a2d3f33ead2169262c30533f79bac c2ccfd2] by '''TheNormalnij''')&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
:* Bump follow-redirects from 1.15.2 to 1.15.6 in /utils/localization/generate-images ([https://github.com/multitheftauto/mtasa-blue/commit/437dbcd8024c5217c22ef0e38719f93f33f47ce5 437dbcd])&lt;br /&gt;
:* Fix permission check in File.create method ([https://github.com/multitheftauto/mtasa-blue/commit/92144a4d7383af09dfa05b7bcd3db09fa487e6fd 92144a4] by '''theSarrum''')&lt;br /&gt;
:* mbedTLS fix for cURL 8.8.0 ([https://github.com/multitheftauto/mtasa-blue/commit/4f7e0d87ec04e44d2e47f5b869c2d7c765817c0f 4f7e0d8] by '''Lpsd''')&lt;br /&gt;
:* Discord RPC Tweaks ([https://github.com/multitheftauto/mtasa-blue/commit/8ef351eabe46fd50da096247d8b6fc74508cb911 8ef351e] by '''theSarrum''')&lt;br /&gt;
:* Fixed small overhead in argument parser for strings ([https://github.com/multitheftauto/mtasa-blue/commit/d20582d770dfd2a1677d9981005b3b6d28fb8e4e d20582d] by '''TheNormalnij''')&lt;br /&gt;
:* Bump ws from 8.13.0 to 8.17.1 in /utils/localization/generate-images ([https://github.com/multitheftauto/mtasa-blue/commit/cc172fcae7654ead0d3530a4819c71f76205a175 cc172fc])&lt;br /&gt;
:* Generic exception type for argument parser instead of std::invalid_argument ([https://github.com/multitheftauto/mtasa-blue/commit/2043acfdb210a8f1158501e2fbb431b625bbf74d 2043acf] by '''tederis''')&lt;br /&gt;
:* Added comments for hooks in CMultiplayerSA_CrashFixHacks.cpp ([https://github.com/multitheftauto/mtasa-blue/commit/0327cb1bef9b234451f8a22ece9c6c70fdc9adb0 0327cb1] by '''FileEX''')&lt;br /&gt;
:* Optimization handling ([https://github.com/multitheftauto/mtasa-blue/commit/e3a8bd96d4eccb30e439ba8bd4a2029d01586154 e3a8bd9], [https://github.com/multitheftauto/mtasa-blue/commit/5ac6c8adad9c9ffd4a1c299c7cd548713e485bd6 5ac6c8a] by '''G-Moris''')&lt;br /&gt;
:* Added ability to use varargs in ArgumentParser functions ([https://github.com/multitheftauto/mtasa-blue/commit/8c2f95a5ffade0e7fb212b62282e69d7f433d36f 8c2f95a] by '''Tracer''')&lt;br /&gt;
:* Fixed google-breakpad in newer GCC versions ([https://github.com/multitheftauto/mtasa-blue/commit/5508c7e4058ad9d29cacc9964f8e84df2c60d14f 5508c7e] by '''Tracer''')&lt;br /&gt;
:* Validate serial on player join ([https://github.com/multitheftauto/mtasa-blue/commit/84437e49e6ebca758e1e87d93e7846f9aa99a673 84437e4] by '''Fernando-A-Rocha''')&lt;br /&gt;
:* Extract TXD class ([https://github.com/multitheftauto/mtasa-blue/commit/733683d70dc037fdcbb256fb17d86e93b fedd239] by '''TheNormalnij''')&lt;br /&gt;
:* Fixed a bug with desynchronization of the values of some fields of the ''CTickRateSettings'' structure ([https://github.com/multitheftauto/mtasa-blue/commit/af5b6968e0a28dbde7d92f3828dead0f1a936eec af5b696], [https://github.com/multitheftauto/mtasa-blue/commit/514a3b36d09906f09bb32e900c39dc09b1c29d10 514a3b3] by '''nweb''')&lt;br /&gt;
:* Fixed ''MinClientReqCheck'' and improve resource upgrade ([https://github.com/multitheftauto/mtasa-blue/commit/f0954109c0644c551ae3ec1df4474d1857e4bed8 f095410] by '''Fernando-A-Rocha''')&lt;br /&gt;
:* Refactored and improved player map (F11) ([https://github.com/multitheftauto/mtasa-blue/commit/2c5cf3226a573637b91d8b255d57113b7043dc28 2c5cf32] by '''Fernando-A-Rocha''')&lt;br /&gt;
:* Fixed ''CVector'' optional arguments ([https://github.com/multitheftauto/mtasa-blue/commit/6a70cf7def14db86980a499d0fdf4c63565915e1 6a70cf7] by '''Tracer''')&lt;br /&gt;
:* Fixed memory overwriting by ''EnumToString'' &amp;amp; ''StringToEnum'' ([https://github.com/multitheftauto/mtasa-blue/commit/3ab068ba213abca718ace47ac3bb8df9e4b1c3fc 3ab068b] by '''FileEX''')&lt;br /&gt;
:* Allow using ''std::variant'' with several pointers ([https://github.com/multitheftauto/mtasa-blue/commit/9d776c8bfc2680fc28857fc0a5dc4a4e40d4c3bf 9d776c8] by '''tederis''')&lt;br /&gt;
:* Fixed argument parser not distinguishing arrays from maps ([https://github.com/multitheftauto/mtasa-blue/commit/d4388a2452f4427bd56c3d93b80d4ea74c05b6e5 d4388a2] by '''FileEX''')&lt;br /&gt;
:* Fixed crash with nested arrays/maps in new argument parser ([https://github.com/multitheftauto/mtasa-blue/commit/ca877d33471fabbe970cf03d9d6d9b3413b6daa1 ca877d3] by '''tederis''')&lt;br /&gt;
&lt;br /&gt;
== 13 Vendor Updates ==&lt;br /&gt;
=== Client ===&lt;br /&gt;
* Updated libpng to 1.6.50 ([https://github.com/multitheftauto/mtasa-blue/commit/c24b39d41fd768337c3d336a944588d53dfaba44] by '''Nico834''')&lt;br /&gt;
* Updatee CEF to 127.3.5+g114ea2a+chromium-127.0.6533.120 ([https://github.com/multitheftauto/mtasa-blue/commit/bca4dff8dc490328000d7653a9166704d859b7e5 bca4dff] by '''Dutchman101''')&lt;br /&gt;
* Updated Unifont to 15.1.05 ([https://github.com/multitheftauto/mtasa-blue/commit/02115a5c00e2480bbb3b829b655869e7436de955 02115a5] by '''Dutchman101''')&lt;br /&gt;
&lt;br /&gt;
=== Server ===&lt;br /&gt;
* Updated cURL to 8.14.1 ([https://github.com/multitheftauto/mtasa-blue/commit/7c27c20da7503c68234cde0b726f10a3dcdf85e3] by '''Nico834''')&lt;br /&gt;
* Updated MySQL to 8.4.0 &amp;amp; OpenSSL to 3.3.1 ([https://github.com/multitheftauto/mtasa-blue/commit/a44d673bb8731506418fdbaa6690b339a98d82c1 a44d673] by '''botder''')&lt;br /&gt;
* Updated SQLite to 3.46.0 ([https://github.com/multitheftauto/mtasa-blue/commit/30e31af2ca1ae96e03386670a9df6db70336b968 30e31af] by '''Dutchman101''')&lt;br /&gt;
&lt;br /&gt;
=== Shared ===&lt;br /&gt;
* Updated mbedTLS to 3.6.4 ([https://github.com/multitheftauto/mtasa-blue/commit/45955dad5471f49e2784e37cbafd1b92196abe96] by '''Nico834''')&lt;br /&gt;
* Updated 7-Zip Standalone plugins to 24.07 (24.7.0.0) ([https://github.com/multitheftauto/mtasa-blue/commit/9b979b2d5c7f4b885046a85d9895e58416563890 9b979b2] by '''Dutchman101''')&lt;br /&gt;
* Updated freetype to freetype-37cefe3 (freetype/freetype@37cefe3) ([https://github.com/multitheftauto/mtasa-blue/commit/89e022cb8586aba5bdacd7b56c7d45c9b7b95f97 89e022c] by '''Dutchman101''')&lt;br /&gt;
* Updated nvapi from r550 to r555 ([https://github.com/multitheftauto/mtasa-blue/commit/5fdcada80a18af530381b04f54c3c69b6988f479 5fdcada] by '''Dutchman101''')&lt;br /&gt;
* Updated unrar to 7.0.9 ([https://github.com/multitheftauto/mtasa-blue/commit/ab9461be5777427261bc3a330acb4c0f5cdc2c8b ab9461b] by '''Dutchman101''')&lt;br /&gt;
* Updated FreeType to 2.13.2 ([https://github.com/multitheftauto/mtasa-blue/commit/a783e994264d4e954489e31459505c53759ca7f1 a783e99] by '''Dutchman101''')&lt;br /&gt;
* Updated zlib from 1.2.13 to 1.3 ([https://github.com/multitheftauto/mtasa-blue/commit/0f37ac0b18845e9f035d0ca45bbb41b9cd1aa979 0f37ac0] by '''Dutchman101''')&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
=== 46+ Changes and Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
'''admin'''&lt;br /&gt;
:* Removed execute code functionality for safety reasons ([https://github.com/multitheftauto/mtasa-resources/commit/507a04937524997410e450a6d4292974fa801bf8 507a049] by '''srslyyyy''')&lt;br /&gt;
:* Updated skins.xml ([https://github.com/multitheftauto/mtasa-resources/commit/b5306484a789cc59b05f4182505ac07df3d90e07 b530648] by '''shadylua''')&lt;br /&gt;
:* Fixed warnings ([https://github.com/multitheftauto/mtasa-resources/commit/d7b02022fa8168fc300dd562118100265cf0688b d7b0202] by '''jlillis''')&lt;br /&gt;
:* Making the admin window focused ([https://github.com/multitheftauto/mtasa-resources/commit/33f7cc938d243687fa36fa300ec588b2d057d02c 33f7cc9] by '''Proxy-99''')&lt;br /&gt;
:* Resource settings button is only displayed if there are settings ([https://github.com/multitheftauto/mtasa-resources/commit/0224ef52c699f27bd6e0e6364fbc81ecd0ec345f 0224ef5] by '''T-MaxWiese-T''')&lt;br /&gt;
:* Fixed nil index error and removed invalid characters causing syntax errors ([https://github.com/multitheftauto/mtasa-resources/commit/79857393ddb42f52ee05cf5758d5fdc8c2ff845c 7985739] by '''rad3sh''')&lt;br /&gt;
:* Allow disabling/enabling default reporting system ([https://github.com/multitheftauto/mtasa-resources/commit/0dbb83df7d3e9a20a2c897612db778bf4e395c92 0dbb83d] by '''Viude''')&lt;br /&gt;
:* Updated clientcheckban setting to ban serial instead of IP ([https://github.com/multitheftauto/mtasa-resources/commit/fa5beb96e10d9f30d9565ca212fe901f88e413a5 fa5beb9] by '''Viude''')&lt;br /&gt;
:* Fixed that double clicking on a resource without setting opened the GUI settings window ([https://github.com/multitheftauto/mtasa-resources/commit/82d5b835b503594101a99041498501e19a433a79 82d5b83] by '''T-MaxWiese-T''')&lt;br /&gt;
:* Fixed gridlist bug in weapons/vehicles ([https://github.com/multitheftauto/mtasa-resources/commit/6ba5a88b8a5da4a9df67f20347056754ea5a2c87 6ba5a88] by '''omar-o22''')&lt;br /&gt;
&lt;br /&gt;
'''admin2'''&lt;br /&gt;
:* Forward-ported permissions widget from admin1 and minor fixes ([https://github.com/multitheftauto/mtasa-resources/commit/25dcc4c655de26de0a2d0eb1b55ef7f3b3f6725e 25dcc4c] by '''Dark-Dragon''')&lt;br /&gt;
:* Fixed /report message viewer widget and minor fixes ([https://github.com/multitheftauto/mtasa-resources/commit/6dbdf2cf90d0e447879bea86942e01caf949b8f5 6dbdf2c] by '''Dark-Dragon''')&lt;br /&gt;
:* Refactored bans functionality ([https://github.com/multitheftauto/mtasa-resources/commit/d8c35b0a38a295d119054c4328a892c4e26be358 d8c35b0] by '''jlillis''')&lt;br /&gt;
:* Fixed messagebox not showing ([https://github.com/multitheftauto/mtasa-resources/commit/5afe0247e6ca44c5754a2d9a6a0af7bc8b57f967 5afe024] by '''FileEX''')&lt;br /&gt;
:* Added missing glitches and world properties ([https://github.com/multitheftauto/mtasa-resources/commit/6856aa075c8e5674379c2a89f355d8b167ab6fdb 6856aa0] by '''FileEX''')&lt;br /&gt;
:* Added content for &amp;quot;Users&amp;quot; sub-tab in the &amp;quot;Rights&amp;quot; tab ([https://github.com/multitheftauto/mtasa-resources/commit/3f8ecca953cc3dfa84e4d1b38b6b4c41f323688b 3f8ecca] by '''FileEX''')&lt;br /&gt;
:* Removed execute code functionality for safety reasons ([https://github.com/multitheftauto/mtasa-resources/commit/c4bc73a2b088b98116ece27065cc7f5a1dced15b c4bc73a] by '''jlillis''')&lt;br /&gt;
:* Replaced checkboxes with a gridlist for glitches and special world properties ([https://github.com/multitheftauto/mtasa-resources/commit/1dcb2953757c6741c93b9c63db33c032183047bc 1dcb295] by '''FileEX''')&lt;br /&gt;
:* Added ability to change server configuration settings ([https://github.com/multitheftauto/mtasa-resources/commit/118d58e383f631f111fe3f2463480182235c71d1 118d58e] by '''FileEX''')&lt;br /&gt;
:* Added content for &amp;quot;Resources&amp;quot; sub-tab in the &amp;quot;Rights&amp;quot; tab ([https://github.com/multitheftauto/mtasa-resources/commit/f16577e24ca9125eac5f2e96621077ad0d213b69 f16577e] by '''FileEX''')&lt;br /&gt;
:* Making the admin window focused ([https://github.com/multitheftauto/mtasa-resources/commit/33f7cc938d243687fa36fa300ec588b2d057d02c 33f7cc9] by '''Proxy-99''')&lt;br /&gt;
:* Fixed panel bind bug after reconnect ([https://github.com/multitheftauto/mtasa-resources/commit/c96bdd5297cf180f947596c1eded8929b4982e6c c96bdd5] by '''ricksterhd123''')&lt;br /&gt;
:* Added the new world special ([https://github.com/multitheftauto/mtasa-resources/commit/08ef1d07ee44540d1f74737e4871288568222331 08ef1d0] by '''omar-o22''')&lt;br /&gt;
:* Updated add ban GUI style ([https://github.com/multitheftauto/mtasa-resources/commit/52aec17bda8b63be70f02385400cf649952ac3ea 52aec17] by '''omar-o22''')&lt;br /&gt;
&lt;br /&gt;
'''chatmanager'''&lt;br /&gt;
:* Added a new resource for chat handling and management ([https://github.com/multitheftauto/mtasa-resources/commit/4e45cb75a8780b0c191031091a4fcd2d76442aa7 4e45cb7], [https://github.com/multitheftauto/mtasa-resources/commit/3f0f0d09a640178e01de71fa9e9b2caa9c21bcfa 3f0f0d0] by '''omar-o22''' and '''srslyyyy''')&lt;br /&gt;
&lt;br /&gt;
'''defaultstats'''&lt;br /&gt;
:* Don't re-apply stats on every respawn ([https://github.com/multitheftauto/mtasa-resources/commit/9fde199ec5025052468df0255bf5c5011ef29718 9fde199] by '''Dutchman101''')&lt;br /&gt;
:* Fixed issue where defaultstats did not set player stats correctly ([https://github.com/multitheftauto/mtasa-resources/commit/567d10c552305dae3f57d5c422a34c25f22fdc12 567d10c] by '''MittellBuurman''')&lt;br /&gt;
&lt;br /&gt;
'''editor'''&lt;br /&gt;
:* Various fixes for local spawned or invalid elements ([https://github.com/multitheftauto/mtasa-resources/commit/4e3c57941cd789cff8d9ce240e99edca871a345d 4e3c579] by '''chris1384''')&lt;br /&gt;
:* Various bug fixes and improvements ([https://github.com/multitheftauto/mtasa-resources/commit/4674fa9c6dbff7a1073fb949cac44588c65df3fb 4674fa9] by '''IIYAMA12''')&lt;br /&gt;
:* Fixed rotation issues ([https://github.com/multitheftauto/mtasa-resources/commit/679c01b93132050548a86dba25ead7feaf9d5a1f 679c01b] by '''Nico834''')&lt;br /&gt;
:* Toggleable rotation mechanic and improve threshold ([https://github.com/multitheftauto/mtasa-resources/commit/83e2c79cbd959aa54c55d4220a5b4d38747e8353 83e2c79] by '''chris1384''')&lt;br /&gt;
:* Added missing objects and collisions ([https://github.com/multitheftauto/mtasa-resources/commit/4e83755d51345c0dc8e2e0f2ddf61588bf854641 4e83755] by '''THEGizmoOfficial''')&lt;br /&gt;
&lt;br /&gt;
'''edf'''&lt;br /&gt;
:* Fixed massive lag after stopping ''editor'' resource ([https://github.com/multitheftauto/mtasa-resources/commit/4674fa9c6dbff7a1073fb949cac44588c65df3fb 4674fa9] by '''IIYAMA12''')&lt;br /&gt;
&lt;br /&gt;
'''editor_main'''&lt;br /&gt;
:* Improvements ([https://github.com/multitheftauto/mtasa-resources/commit/5bf553f85cb9c53027814fe666268cb24ed66b2e 5bf553f], [https://github.com/multitheftauto/mtasa-resources/commit/e9b75fd615922c7d70f4e435a05fa933dcb9d2a5 e9b75fd] by '''q8X''')&lt;br /&gt;
:* Add xmlns namespace when saving map ([https://github.com/multitheftauto/mtasa-resources/commit/23fa3f38f71c2f3d28780df1b3ce163ab2eaae84 23fa3f3] by '''omar-o22''')&lt;br /&gt;
&lt;br /&gt;
'''editor_gui'''&lt;br /&gt;
:* Fixed test panel issues ([https://github.com/multitheftauto/mtasa-resources/commit/e558c846e8b0589997f342f431b36fdc371da000 e558c84] by '''chris1384''')&lt;br /&gt;
&lt;br /&gt;
'''fallout'''&lt;br /&gt;
:* Refactor &amp;amp; many improvements ([https://github.com/multitheftauto/mtasa-resources/commit/c733b69a735d004235ba61b1201ac1412acc6482 c733b69] by '''IIYAMA12''')&lt;br /&gt;
&lt;br /&gt;
'''freeroam'''&lt;br /&gt;
:* Updated skins.xml ([https://github.com/multitheftauto/mtasa-resources/commit/cacbe40a805402dec3a62180b987d4b777817ea6 cacbe40] by '''shadylua''')&lt;br /&gt;
:* Added Walk styles ([https://github.com/multitheftauto/mtasa-resources/commit/4a18d7585a2fa45eaed18d4b4796744a235a23c5 4a18d75] by '''shadylua''')&lt;br /&gt;
:* Security improvements ([https://github.com/multitheftauto/mtasa-resources/commit/2ec92132036d0dc073279dda3c88d71f578d651f 2ec9213] by '''IIYAMA12''')&lt;br /&gt;
:* Fixed freezetime flickering ([https://github.com/multitheftauto/mtasa-resources/commit/b40f27be0274b641c2cddd4c75a6f86f73ea4941 b40f27b], [https://github.com/multitheftauto/mtasa-resources/commit/817aa1ea9130fbccb1a23b7410309af2f8a21ddc 817aa1e] by '''ricksterhd123''' and '''jlillis''')&lt;br /&gt;
:* Fixed map key bind interferes with race editor help ([https://github.com/multitheftauto/mtasa-resources/commit/e62bc5471433b347b16c15709d469209cf202390 e62bc54] by '''MittellBuurman''')&lt;br /&gt;
:* Fixed player blips staying visible after closing spawn map with F1 ([https://github.com/multitheftauto/mtasa-resources/commit/aaf2dd7ed7a0b6b6c6609a4ee5d8319101e8a674 1a5031c] by '''omar-o22''')&lt;br /&gt;
&lt;br /&gt;
'''hedit'''&lt;br /&gt;
:* Added German localization [[File:Flag_de.png|x14px]] ([https://github.com/multitheftauto/mtasa-resources/pull/568/commits/c58df8666fbccfb0be73f27c52aa680dae2f0c1a bc33634] by '''shadylua''')&lt;br /&gt;
:* Added Brazilian Portuguese localization [[File:Flag_br.png|x14px]] ([https://github.com/multitheftauto/mtasa-resources/commit/d1b85d7dda45293ce497cf03f21eea2f59100b89 d1b85d7] by '''ricksterhd123''')&lt;br /&gt;
:* Added Hungarian localization [[File:Flag_hu.png|x18px]] ([https://github.com/multitheftauto/mtasa-resources/commit/53050dd0bf73a164969480c9277fc3c6b0601b7e 53050dd] by '''Nico834''')&lt;br /&gt;
:* Updated Turkish localization [[File:Tr.gif]] ([https://github.com/multitheftauto/mtasa-resources/commit/3044d00a796488870556b19b088ac505c332952c 3044d00] by '''mahlukat5''')&lt;br /&gt;
:* Updated Spanish localization [[File:Flag_es.png|x18px]] ([https://github.com/multitheftauto/mtasa-resources/commit/b74c2393cc15e403d4588ebb671659c16cc36269 b74c239] by '''kxndrick0''')&lt;br /&gt;
&lt;br /&gt;
'''internetradio'''&lt;br /&gt;
:* Fixed that the GUI window of the resource &amp;quot;internetradio&amp;quot; collides with the GUI window of the resource &amp;quot;helpmanager&amp;quot; ([https://github.com/multitheftauto/mtasa-resources/commit/313f3dde6b7cdb389f11f1a62a6d3e8c093c159f 313f3dd] by '''T-MaxWiese-T''')&lt;br /&gt;
:* Improvements ([https://github.com/multitheftauto/mtasa-resources/commit/a3c9e17cf6b85374b5f9b5881937aee97da94745 a3c9e17] by '''srslyyyy''')&lt;br /&gt;
:* Added attaching to vehicles ([https://github.com/multitheftauto/mtasa-resources/commit/3dd5cbd32f092337707277fbecc5ee54988e07fc 3dd5cbd] by '''ds1-e''')&lt;br /&gt;
:* Added admin commands ([https://github.com/multitheftauto/mtasa-resources/commit/5c160212e190f74461d65fac1668cda07a2d0b11 https://github.com/multitheftauto/mtasa-resources/commit/5c160212e190f74461d65fac1668cda07a2d0b11] by '''ds1-e''')&lt;br /&gt;
:* Added ability to show speaker owner ([https://github.com/multitheftauto/mtasa-resources/commit/6189fc1eefce29c8467c5a1093eaa8bfd8ed97f0 6189fc1] by '''ds1-e''')&lt;br /&gt;
:* Fixed playSound3D and track name showing in other dimensions ([https://github.com/multitheftauto/mtasa-resources/commit/d4c04db009cdd68913fdb47bbc73acd91e63f981 d4c04db] by '''mateo-14'''&lt;br /&gt;
:* Added ability to edit the volume ([https://github.com/multitheftauto/mtasa-resources/commit/73ecb610fdc096926291e8c24c56eea7c43bb4d6 73ecb61], [https://github.com/multitheftauto/mtasa-resources/commit/254700cffdf5c6b054e8f6e17afb4b7342593a85 254700c] by '''omar-o22''' and '''srslyyyy''')&lt;br /&gt;
&lt;br /&gt;
'''ip2c'''&lt;br /&gt;
:* Added missing fetchRemote aclrequest ([https://github.com/multitheftauto/mtasa-resources/commit/e1364c3ebcc956dbf7f61e2d89741837776edec2 e1364c3] by '''Fernando-A-Rocha''')&lt;br /&gt;
:* Added backed up file and .gitignore to ignore the real one (auto-updated) ([https://github.com/multitheftauto/mtasa-resources/commit/e182291a53c3c76a2cf45834ba313aa9d18c16f4 e182291] by '''Fernando-A-Rocha''')&lt;br /&gt;
&lt;br /&gt;
'''ipb'''&lt;br /&gt;
:* Replaced the onClientResource start event with the onPlayerResourceStart event ([https://github.com/multitheftauto/mtasa-resources/commit/cca3a05adf7fc940b913453a5fad5d5f3c8e3518 cca3a05] by '''srslyyyy''')&lt;br /&gt;
&lt;br /&gt;
'''parachute'''&lt;br /&gt;
:* Fixed warnings about min_mta_version ([https://github.com/multitheftauto/mtasa-resources/commit/b4119cca4665d63a3043f14c1624ce9c96700b96 b4119cc] by '''NetroX1993''')&lt;br /&gt;
&lt;br /&gt;
'''playerblips'''&lt;br /&gt;
:* Fixed that the resource &amp;quot;playercolors&amp;quot; should be activated for teams ([https://github.com/multitheftauto/mtasa-resources/commit/2cd28db5fa891f361c5af07a491532378a820b83 2cd28db] by '''T-MaxWiese-T''')&lt;br /&gt;
:* Real-time update of settings ([https://github.com/multitheftauto/mtasa-resources/commit/9505b181fe7fc2bab53142746f73bc64a8fd984d 9505b18] by '''Nico834''')&lt;br /&gt;
:* Improved debug messages ([https://github.com/multitheftauto/mtasa-resources/commit/4084e5d369907d3ededd1b2eb19c916983680154 4084e5d] by '''T-MaxWiese-T''')&lt;br /&gt;
:* Fixed that when a player changed or joined teams the color of the blip was not updated ([https://github.com/multitheftauto/mtasa-resources/commit/ff80005f114a3d010624f7d54510ffde47dddb00 ff80005] by '''T-MaxWiese-T''')&lt;br /&gt;
&lt;br /&gt;
'''playercolors'''&lt;br /&gt;
:* Player nametag color should revert to team color when the resource is stopped ([https://github.com/multitheftauto/mtasa-resources/commit/d45d2d0cd963186639d76ab1cb27ef6a042cd0bd d45d2d0] by '''T-MaxWiese-T''')&lt;br /&gt;
:* Fixed chat messages sent twice ([https://github.com/multitheftauto/mtasa-resources/commit/0547cf72514a7dc7efc987f47903c35b310a3b22 0547cf7] by '''Fernando-A-Rocha''')&lt;br /&gt;
&lt;br /&gt;
'''performancebrowser'''&lt;br /&gt;
:* Fixed player names not being reinitialized on change ([https://github.com/multitheftauto/mtasa-resources/commit/3e0166dc7fa9c11c596a7958b02423b6aeff8410 3e0166d] by '''YelehaUwU''')&lt;br /&gt;
&lt;br /&gt;
'''runcode'''&lt;br /&gt;
:* Added aclrequest for loadstring function ([https://github.com/multitheftauto/mtasa-resources/commit/c40b8095f054b6e87b46e1d53d9b6ec77cf943c7 c40b809] by '''IIYAMA12 ''')&lt;br /&gt;
&lt;br /&gt;
'''scoreboard'''&lt;br /&gt;
:* Replaced drawing arrow from path to texture ([https://github.com/multitheftauto/mtasa-resources/commit/128f26952810804df6acb233ca9476853caa1286 128f269] by '''srslyyyy''')&lt;br /&gt;
&lt;br /&gt;
'''speedometer'''&lt;br /&gt;
:* Display at resource start ([https://github.com/multitheftauto/mtasa-resources/commit/31a5ac4013c3633647178e695474da6632eb38b8 31a5ac4] by '''Nico834''')&lt;br /&gt;
:* Preventing pointer overflow ([https://github.com/multitheftauto/mtasa-resources/commit/8689cdc247a3fd16125524aac04eb054c398084c 8689cdc] by '''Nico834''')&lt;br /&gt;
&lt;br /&gt;
'''superman'''&lt;br /&gt;
:* Fixes and improvements ([https://github.com/multitheftauto/mtasa-resources/commit/2b3bc102225b2f1c3144cffe290175e9a2c71728 2b3bc10], [https://github.com/multitheftauto/mtasa-resources/commit/e1c06c3c2581c16a6e05401381263a47dd6ac5f0 e1c06c3], [https://github.com/multitheftauto/mtasa-resources/commit/1e4319d180be0f482d42f2f32fbf2c1e5cd440cc 1e4319d] by '''ds1-e''')&lt;br /&gt;
:* Fixed a bug where you couldn't move after death while Superman is active ([https://github.com/multitheftauto/mtasa-resources/commit/715ee57664287083f7ecb299f534bc3093f796a0 715ee57] by '''omar-o22''')&lt;br /&gt;
&lt;br /&gt;
'''votemanager'''&lt;br /&gt;
:* Fixed lint error ([https://github.com/multitheftauto/mtasa-resources/commit/c8630075317123e510645464a3bf56ebb244573b c863007] by '''Dark-Dragon''')&lt;br /&gt;
&lt;br /&gt;
'''mapfixes'''&lt;br /&gt;
:* A new resource has been added that fixes many holes and bugs in the default map ([https://github.com/multitheftauto/mtasa-resources/commit/23f6bd94370440af5ed79a47bda1ff0caf92fa8e 23f6bd9] by '''Fernando-A-Rocha''')&lt;br /&gt;
&lt;br /&gt;
'''gps'''&lt;br /&gt;
:* Added export functions for custom logic ([https://github.com/multitheftauto/mtasa-resources/commit/537d92d11b357cf9e795a7bb3ec87c13fa62c7bc 537d92d] by '''T-MaxWiese-T''')&lt;br /&gt;
&lt;br /&gt;
'''deathmatch'''&lt;br /&gt;
:* Improvements and update ([https://github.com/multitheftauto/mtasa-resources/commit/a01ec8a86e636ca61f25a03d4ee30bd898754cbd a01ec8a], [https://github.com/multitheftauto/mtasa-resources/commit/b94ffddfd5b230544d54e5eca8c9c5d87dc69128 b94ffdd] by '''jlillis'''&lt;br /&gt;
&lt;br /&gt;
'''race'''&lt;br /&gt;
:* Fixed automatic nextid assignment breaking ([https://github.com/multitheftauto/mtasa-resources/commit/2c695a9e793825a8cafd2ee3be490d2d8e9ad318 2c695a9] by '''lotsofs''')&lt;br /&gt;
&lt;br /&gt;
'''voice_local'''&lt;br /&gt;
:* Improvements ([https://github.com/multitheftauto/mtasa-resources/commit/53cf63d83169018e0de9f45ecb565958855d717d 53cf63d] by '''Fernando-A-Rocha''')&lt;br /&gt;
&lt;br /&gt;
'''Others / Uncategorized'''&lt;br /&gt;
:* Refactor of resources meta.xml ([https://github.com/multitheftauto/mtasa-resources/commit/6713b07a459739c06112ac3e608776f3f0696144 6713b07] by '''Fernando-A-Rocha''')&lt;br /&gt;
&lt;br /&gt;
== Extra information ==&lt;br /&gt;
''More detailed information available on our GitHub repositories:&lt;br /&gt;
* [https://github.com/multitheftauto/mtasa-blue MTA:SA Blue]&lt;br /&gt;
* [https://github.com/multitheftauto/mtasa-resources MTA:SA Official Resources]&lt;br /&gt;
&lt;br /&gt;
[[Category:Changelog]]&lt;br /&gt;
[[Category:Incomplete]]&lt;/div&gt;</summary>
		<author><name>Xenius</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/SetAccountSerial</id>
		<title>SetAccountSerial</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/SetAccountSerial"/>
		<updated>2025-07-26T08:00:16Z</updated>

		<summary type="html">&lt;p&gt;Mohab: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{server function}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
{{New feature/item|3.0161|1.6.0|23232|This function sets the serial number for a specified player account. It allows administrators to update or assign a new [[serial]] to registered accounts.}}&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 setAccountSerial ( account theAccount, string serial )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{OOP||[[account]]:setSerial|serial|}}&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
*'''theAccount:''' The account element to set the serial for&lt;br /&gt;
*'''serial:''' A valid 32-character hexadecimal string representing the new serial number&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns ''true'' if the serial was successfully set, ''false'' otherwise.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- Simple example: Set a serial for a player's account&lt;br /&gt;
local player = getPlayerFromName(&amp;quot;John&amp;quot;)&lt;br /&gt;
local account = getPlayerAccount(player)&lt;br /&gt;
local newSerial = &amp;quot;A1B2C3D4E5F6789012345678901234AB&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if setAccountSerial(account, newSerial) then&lt;br /&gt;
    outputChatBox(&amp;quot;Serial updated successfully!&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
    outputChatBox(&amp;quot;Failed to update serial!&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- Advanced example: Administrative command system&lt;br /&gt;
function changePlayerSerial(player, newSerial)&lt;br /&gt;
    local account = getPlayerAccount(player)&lt;br /&gt;
    if account and not isGuestAccount(account) then&lt;br /&gt;
        if setAccountSerial(account, newSerial) then&lt;br /&gt;
            outputChatBox(&amp;quot;Serial number updated successfully!&amp;quot;, player, 0, 255, 0)&lt;br /&gt;
            return true&lt;br /&gt;
        else&lt;br /&gt;
            outputChatBox(&amp;quot;Failed to update serial number. Invalid format!&amp;quot;, player, 255, 0, 0)&lt;br /&gt;
            return false&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        outputChatBox(&amp;quot;You must be logged into a registered account.&amp;quot;, player, 255, 0, 0)&lt;br /&gt;
        return false&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Command to set a player's account serial&lt;br /&gt;
addCommandHandler(&amp;quot;setserial&amp;quot;, function(player, cmd, targetPlayer, newSerial)&lt;br /&gt;
    if not targetPlayer or not newSerial then&lt;br /&gt;
        outputChatBox(&amp;quot;Usage: /setserial &amp;lt;player&amp;gt; &amp;lt;32-char-hex-serial&amp;gt;&amp;quot;, player)&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local target = getPlayerFromName(targetPlayer)&lt;br /&gt;
    if target then&lt;br /&gt;
        if string.len(newSerial) == 32 and string.match(newSerial, &amp;quot;^[A-Fa-f0-9]+$&amp;quot;) then&lt;br /&gt;
            changePlayerSerial(target, newSerial)&lt;br /&gt;
        else&lt;br /&gt;
            outputChatBox(&amp;quot;Serial must be 32 hexadecimal characters!&amp;quot;, player, 255, 0, 0)&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        outputChatBox(&amp;quot;Player not found!&amp;quot;, player, 255, 0, 0)&lt;br /&gt;
    end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
*[[getAccountSerial]]&lt;br /&gt;
*[[getAccountsBySerial]]&lt;br /&gt;
*[[addAccount]]&lt;br /&gt;
*[[removeAccount]]&lt;br /&gt;
*[[isGuestAccount]]&lt;br /&gt;
*[[getPlayerAccount]]&lt;br /&gt;
{{Account functions}}&lt;/div&gt;</summary>
		<author><name>Mohab</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/ResetVehicleAudioSettings</id>
		<title>ResetVehicleAudioSettings</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/ResetVehicleAudioSettings"/>
		<updated>2025-07-25T17:51:13Z</updated>

		<summary type="html">&lt;p&gt;Mohab: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{client function}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
{{New feature/item|3.0161|1.6.0|23140|This function resets the audio properties of a specific vehicle instance back to its model's default settings. Any custom audio settings that were applied to the vehicle using [[setVehicleAudioSetting]] will be removed, restoring the original sound characteristics.}}&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 resetVehicleAudioSettings ( vehicle theVehicle )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
*'''theVehicle:''' The vehicle element to reset audio settings for&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns ''true'' if the vehicle audio settings were successfully reset, ''false'' otherwise.&lt;br /&gt;
&lt;br /&gt;
{{Note|This function only affects the specific vehicle instance, not the vehicle model's default settings. After calling this function, the vehicle will use the default audio settings for its model.}}&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- Reset audio settings for the player's current vehicle&lt;br /&gt;
local player = getLocalPlayer()&lt;br /&gt;
local vehicle = getPedOccupiedVehicle(player)&lt;br /&gt;
&lt;br /&gt;
if vehicle then&lt;br /&gt;
    local success = resetVehicleAudioSettings(vehicle)&lt;br /&gt;
    if success then&lt;br /&gt;
        outputChatBox(&amp;quot;Vehicle audio settings have been reset to default.&amp;quot;)&lt;br /&gt;
    else&lt;br /&gt;
        outputChatBox(&amp;quot;Failed to reset vehicle audio settings.&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
else&lt;br /&gt;
    outputChatBox(&amp;quot;You must be in a vehicle to use this command.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
*[[getVehicleAudioSettings]]&lt;br /&gt;
*[[setVehicleAudioSetting]]&lt;br /&gt;
*[[getVehicleModelAudioSettings]]&lt;br /&gt;
*[[setVehicleModelAudioSetting]]&lt;br /&gt;
*[[resetVehicleModelAudioSettings]]&lt;br /&gt;
{{Client vehicle functions}}&lt;/div&gt;</summary>
		<author><name>Mohab</name></author>
	</entry>
</feed>