<?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-05-31T10:25:34Z</updated>
	<subtitle>From Multi Theft Auto: Wiki</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/ResetDynamicPedShadows</id>
		<title>ResetDynamicPedShadows</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/ResetDynamicPedShadows"/>
		<updated>2026-04-17T09:55:33Z</updated>

		<summary type="html">&lt;p&gt;Arran Fortuna: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Client function}}&lt;br /&gt;
This function restores the dynamic ped shadow setting back to the player's original video configuration.&lt;br /&gt;
&lt;br /&gt;
If [[setDynamicPedShadowsEnabled]] was used to override the setting, calling this function will remove that override and reapply the value defined in the player's settings.&lt;br /&gt;
&lt;br /&gt;
This is useful for ensuring that temporary changes made by a resource do not persist after it stops.&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 resetDynamicPedShadows ( )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
*None&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns ''true'' if the reset was successful, ''false'' otherwise.&lt;br /&gt;
&lt;br /&gt;
===Examples===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- Reset dynamic ped shadows to player's settings&lt;br /&gt;
resetDynamicPedShadows()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Example: Safe usage in a resource===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
addEventHandler(&amp;quot;onClientResourceStart&amp;quot;, resourceRoot,&lt;br /&gt;
    function()&lt;br /&gt;
        setDynamicPedShadowsEnabled(false)&lt;br /&gt;
    end&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
addEventHandler(&amp;quot;onClientResourceStop&amp;quot;, resourceRoot,&lt;br /&gt;
    function()&lt;br /&gt;
        resetDynamicPedShadows()&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;
{{World functions|client}}&lt;/div&gt;</summary>
		<author><name>Arran Fortuna</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/SetDynamicPedShadowsEnabled</id>
		<title>SetDynamicPedShadowsEnabled</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/SetDynamicPedShadowsEnabled"/>
		<updated>2026-04-17T09:54:25Z</updated>

		<summary type="html">&lt;p&gt;Arran Fortuna: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Client function}}&lt;br /&gt;
This function allows scripts to override the current dynamic ped shadow setting on the client.&lt;br /&gt;
&lt;br /&gt;
When used, it temporarily overrides the player’s video setting for dynamic ped shadows. To restore the original value based on the player's settings, use [[resetDynamicPedShadows]].&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 setDynamicPedShadowsEnabled ( bool enabled )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
*'''enabled:''' a boolean value specifying whether dynamic ped shadows should be enabled (''true'') or disabled (''false'').&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns ''true'' if the setting was successfully applied, ''false'' otherwise.&lt;br /&gt;
&lt;br /&gt;
===Examples===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- Disable dynamic ped shadows&lt;br /&gt;
setDynamicPedShadowsEnabled(false)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Example: Toggle shadows===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local current = isDynamicPedShadowsEnabled()&lt;br /&gt;
setDynamicPedShadowsEnabled(not current)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Example: Disable shadows on resource start and restore on stop===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
addEventHandler(&amp;quot;onClientResourceStart&amp;quot;, resourceRoot,&lt;br /&gt;
    function()&lt;br /&gt;
        setDynamicPedShadowsEnabled(false)&lt;br /&gt;
    end&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
addEventHandler(&amp;quot;onClientResourceStop&amp;quot;, resourceRoot,&lt;br /&gt;
    function()&lt;br /&gt;
        resetDynamicPedShadows()&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;
{{Client world functions}}&lt;/div&gt;</summary>
		<author><name>Arran Fortuna</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/wiki/IsDynamicPedShadowsEnabled</id>
		<title>IsDynamicPedShadowsEnabled</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/IsDynamicPedShadowsEnabled"/>
		<updated>2026-04-17T09:53:02Z</updated>

		<summary type="html">&lt;p&gt;Arran Fortuna: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Client function}}&lt;br /&gt;
This function checks whether dynamic shadows for peds are currently enabled on the client.&lt;br /&gt;
&lt;br /&gt;
The returned value may reflect:&lt;br /&gt;
* The player's video settings.&lt;br /&gt;
* Any override applied using [[setDynamicPedShadowsEnabled]].&lt;br /&gt;
&lt;br /&gt;
Use [[resetDynamicPedShadows]] to restore the setting back to the player’s original video configuration.&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 isDynamicPedShadowsEnabled ( )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
*None&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns ''true'' if dynamic ped shadows are enabled, ''false'' otherwise.&lt;br /&gt;
&lt;br /&gt;
===Examples===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
if isDynamicPedShadowsEnabled() then&lt;br /&gt;
    outputChatBox(&amp;quot;Dynamic ped shadows are enabled.&amp;quot;)&lt;br /&gt;
else&lt;br /&gt;
    outputChatBox(&amp;quot;Dynamic ped shadows are disabled.&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Example: Toggle shadows===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- Toggle dynamic ped shadows&lt;br /&gt;
local current = isDynamicPedShadowsEnabled()&lt;br /&gt;
setDynamicPedShadowsEnabled(not current)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{World functions|client}}&lt;/div&gt;</summary>
		<author><name>Arran Fortuna</name></author>
	</entry>
	<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>
</feed>