<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.multitheftauto.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Zver-CR</id>
	<title>Multi Theft Auto: Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.multitheftauto.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Zver-CR"/>
	<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/Special:Contributions/Zver-CR"/>
	<updated>2026-04-27T01:40:21Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=SetElementData&amp;diff=81882</id>
		<title>SetElementData</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=SetElementData&amp;diff=81882"/>
		<updated>2025-03-26T19:43:48Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Server client function}}&lt;br /&gt;
__NOTOC__ &lt;br /&gt;
This function stores [[element data]] under a certain key, attached to an element. Element data set using this is then synced with all clients and the server. The data can contain server-created elements, but you should avoid passing data that is not able to be synced such as xmlnodes, acls, aclgroups etc.&lt;br /&gt;
&lt;br /&gt;
As element data is synced to all clients, it can generate a lot of network traffic and be heavy on performance. Events are much more efficient for sending data from a client to the server only, or from the server to a specific client. &amp;lt;br/&amp;gt;&lt;br /&gt;
Usage of element data should be discouraged where your goal can be achieved with events like above, and [[table|tables]] for storing and retrieving data.&lt;br /&gt;
{{Tip|A simple and efficient way to make a variable known to the server and clients is to use setElementData on the [[root]] element.}}&lt;br /&gt;
{{Note|See [[Script security]] for tips on preventing cheaters when using events and element data.}}&lt;br /&gt;
{{Note|For performance reasons, never use setElementData in events that fire often (like [[onClientRender]]) without further optimization or conditions. In fact, using element data in general, can take such a toll on performance that not using it unless strictly necessary (e.g use alternatives such as storing data in tables) is recommended.}}&lt;br /&gt;
&lt;br /&gt;
{{New items|3.0158|1.5.7|A subscription mode has been introduced for [[setElementData]] serverside. When setting data in subscription mode, only clients that are added through [[addElementDataSubscriber]] will receive the data, which is good for performance.&lt;br /&gt;
Note this mode only works when setting element data serverside. Setting data clientside still sends the update to all clients if 'synchronize' is set to true.&lt;br /&gt;
|20477}}&lt;br /&gt;
&lt;br /&gt;
==Syntax== &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;
bool setElementData ( element theElement, string key, var value [, string syncMode = &amp;quot;broadcast&amp;quot;, string clientChangesPolicy = &amp;quot;default&amp;quot; ] )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
{{OOP||[[element]]:setData||getElementData}}&lt;br /&gt;
&lt;br /&gt;
===Required Arguments=== &lt;br /&gt;
*'''theElement:''' The [[element]] you wish to attach the data to.&lt;br /&gt;
*'''key:''' The key you wish to store the data under. (Maximum 128 characters.) &lt;br /&gt;
*'''value:''' The value you wish to store. See [[element data]] for a list of acceptable datatypes.&lt;br /&gt;
&lt;br /&gt;
===Optional Arguments=== &lt;br /&gt;
{{New items|3.0158|1.5.7|&lt;br /&gt;
*'''syncMode:''' Synchronization mode.&lt;br /&gt;
**''&amp;quot;broadcast&amp;quot;'' - Synchronize to all clients (default behavior). You can also parse ''true'' for this option.&lt;br /&gt;
**''&amp;quot;local&amp;quot;'' - Don't synchronize. You can also parse ''false'' for this option.&lt;br /&gt;
**''&amp;quot;subscribe&amp;quot;'' - Only synchronize to specific clients. See [[addElementDataSubscriber]] and [[removeElementDataSubscriber]].&lt;br /&gt;
|20477}}&lt;br /&gt;
{{New items|3.0161|1.6.0|&lt;br /&gt;
*'''clientChangesPolicy:''' Client changes policy.&lt;br /&gt;
**''&amp;quot;default&amp;quot;'' - Use '''elementdata_whitelisted''' setting from [https://wiki.multitheftauto.com/wiki/Server_mtaserver.conf#elementdata_whitelisted mtaserver.conf]&lt;br /&gt;
**''&amp;quot;allow&amp;quot;'' - Trust changes from clients.&lt;br /&gt;
**''&amp;quot;deny&amp;quot;'' - Deny client changes. The server will trigger the [[onPlayerChangesProtectedData]] event when the client attempts to change the value.&lt;br /&gt;
|22815}}&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&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;
bool setElementData ( element theElement, string key, var value [, bool synchronize = true ] )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
{{OOP||[[element]]:setData||getElementData}}&lt;br /&gt;
&lt;br /&gt;
===Required Arguments=== &lt;br /&gt;
*'''theElement:''' The [[element]] you wish to attach the data to.&lt;br /&gt;
*'''key:''' The key you wish to store the data under. (Maximum 128 characters.) &lt;br /&gt;
*'''value:''' The value you wish to store. See [[element data]] for a list of acceptable datatypes.&lt;br /&gt;
&lt;br /&gt;
===Optional Arguments=== &lt;br /&gt;
*'''synchronize:''' Determines whether or not the data will be synchronized with the server.&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns ''true'' if the data was set successfully, ''false'' otherwise.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
Example 1&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;
This example allows a player to add a custom tag onto their nickname, and also reverts it back to normal if they wish.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function addPlayerCustomTag ( thePlayer, command, newTag )&lt;br /&gt;
	--Let's make sure the newTag param has been entered...&lt;br /&gt;
	if ( newTag ) then&lt;br /&gt;
		--Grab their current playername for saving.&lt;br /&gt;
		local sPlayerNickname = getPlayerName ( thePlayer )&lt;br /&gt;
		--Create their new nickname with their tag&lt;br /&gt;
		local sNewPlayerNickname = newTag .. &amp;quot; &amp;quot; .. sPlayerNickname&lt;br /&gt;
		&lt;br /&gt;
		--Let's first load the element data, see if it's there already&lt;br /&gt;
		--The reason for this is that if a player were to do /addtag twice,&lt;br /&gt;
		--the tag would be prepended a second time&lt;br /&gt;
		local sOldNick = getElementData( thePlayer, &amp;quot;tempdata.originalnick&amp;quot; )&lt;br /&gt;
		if ( sOldNick == false ) then&lt;br /&gt;
			--Save their orignal nickname in their element data&lt;br /&gt;
			setElementData ( thePlayer, &amp;quot;tempdata.originalnick&amp;quot;, sPlayerNickname )&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		--Set their new nickname globally&lt;br /&gt;
		setPlayerName ( thePlayer, sNewPlayerNickname )&lt;br /&gt;
		&lt;br /&gt;
		--Tell them it's done&lt;br /&gt;
		outputChatBox ( &amp;quot;Your new nickname has been set, to put it back to its original state you can use /deltag&amp;quot;, thePlayer )&lt;br /&gt;
	else&lt;br /&gt;
		--The newTag param was not entered, give an error message&lt;br /&gt;
		outputChatBox ( &amp;quot;/addtag - Incorrect syntax, Correct: /addtag &amp;lt;newtag&amp;gt;&amp;quot;, thePlayer )&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
addCommandHandler ( &amp;quot;addtag&amp;quot;, addPlayerCustomTag )&lt;br /&gt;
&lt;br /&gt;
function removePlayerCustomTag ( thePlayer, command )&lt;br /&gt;
	--We first need to check that they have already used /addtag, let's do that now&lt;br /&gt;
	local sOldNick = getElementData( thePlayer, &amp;quot;tempdata.originalnick&amp;quot; )&lt;br /&gt;
	if ( sOldNick ) then&lt;br /&gt;
		--Great, they have a tag added, let's reset them&lt;br /&gt;
		&lt;br /&gt;
		--First we will want to reset the element data back to its default (that being false)&lt;br /&gt;
		setElementData ( thePlayer, &amp;quot;tempdata.originalnick&amp;quot;, false )&lt;br /&gt;
		&lt;br /&gt;
		--Now set the client name back&lt;br /&gt;
		setPlayerName( thePlayer, sOldNick )&lt;br /&gt;
		&lt;br /&gt;
		--Notify them&lt;br /&gt;
		outputChatBox ( &amp;quot;Your old nickname has been set&amp;quot;, thePlayer )&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
addCommandHandler ( &amp;quot;deltag&amp;quot;, removePlayerCustomTag )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Changelog==&lt;br /&gt;
{{ChangelogHeader}}&lt;br /&gt;
{{ChangelogItem|1.6.0-9.22815|Added clientChangesPolicy argument}}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Element_functions}}&lt;br /&gt;
&lt;br /&gt;
[[pt-br:SetElementData]]&lt;br /&gt;
[[tr:setElementData]]&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=SetElementData&amp;diff=81881</id>
		<title>SetElementData</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=SetElementData&amp;diff=81881"/>
		<updated>2025-03-26T18:56:19Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Server client function}}&lt;br /&gt;
__NOTOC__ &lt;br /&gt;
This function stores [[element data]] under a certain key, attached to an element. Element data set using this is then synced with all clients and the server. The data can contain server-created elements, but you should avoid passing data that is not able to be synced such as xmlnodes, acls, aclgroups etc.&lt;br /&gt;
&lt;br /&gt;
As element data is synced to all clients, it can generate a lot of network traffic and be heavy on performance. Events are much more efficient for sending data from a client to the server only, or from the server to a specific client. &amp;lt;br/&amp;gt;&lt;br /&gt;
Usage of element data should be discouraged where your goal can be achieved with events like above, and [[table|tables]] for storing and retrieving data.&lt;br /&gt;
{{Tip|A simple and efficient way to make a variable known to the server and clients is to use setElementData on the [[root]] element.}}&lt;br /&gt;
{{Note|See [[Script security]] for tips on preventing cheaters when using events and element data.}}&lt;br /&gt;
{{Note|For performance reasons, never use setElementData in events that fire often (like [[onClientRender]]) without further optimization or conditions. In fact, using element data in general, can take such a toll on performance that not using it unless strictly necessary (e.g use alternatives such as storing data in tables) is recommended.}}&lt;br /&gt;
&lt;br /&gt;
{{New items|3.0158|1.5.7|A subscription mode has been introduced for [[setElementData]] serverside. When setting data in subscription mode, only clients that are added through [[addElementDataSubscriber]] will receive the data, which is good for performance.&lt;br /&gt;
Note this mode only works when setting element data serverside. Setting data clientside still sends the update to all clients if 'synchronize' is set to true.&lt;br /&gt;
|20477}}&lt;br /&gt;
&lt;br /&gt;
==Syntax== &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;
bool setElementData ( element theElement, string key, var value [, string syncMode = &amp;quot;broadcast&amp;quot;, string clientChangesPolicy = &amp;quot;default&amp;quot; ] )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
{{OOP||[[element]]:setData||getElementData}}&lt;br /&gt;
&lt;br /&gt;
===Required Arguments=== &lt;br /&gt;
*'''theElement:''' The [[element]] you wish to attach the data to.&lt;br /&gt;
*'''key:''' The key you wish to store the data under. (Maximum 128 characters.) &lt;br /&gt;
*'''value:''' The value you wish to store. See [[element data]] for a list of acceptable datatypes.&lt;br /&gt;
&lt;br /&gt;
===Optional Arguments=== &lt;br /&gt;
{{New items|3.0158|1.5.7|&lt;br /&gt;
*'''syncMode:''' Synchronization mode.&lt;br /&gt;
**''&amp;quot;broadcast&amp;quot;'' - Synchronize to all clients (default behavior). You can also parse ''true'' for this option.&lt;br /&gt;
**''&amp;quot;local&amp;quot;'' - Don't synchronize. You can also parse ''false'' for this option.&lt;br /&gt;
**''&amp;quot;subscribe&amp;quot;'' - Only synchronize to specific clients. See [[addElementDataSubscriber]] and [[removeElementDataSubscriber]].&lt;br /&gt;
|20477}}&lt;br /&gt;
{{New items|3.0161|1.6.0|&lt;br /&gt;
*'''clientChangesPolicy:''' Client changes policy.&lt;br /&gt;
**''&amp;quot;default&amp;quot;'' - Use '''elementdata_whitelisted''' setting from [https://wiki.multitheftauto.com/wiki/Server_mtaserver.conf#elementdata_whitelisted mtaserver.conf]&lt;br /&gt;
**''&amp;quot;allow&amp;quot;'' - Trust changes from clients.&lt;br /&gt;
**''&amp;quot;deny&amp;quot;'' - Deny client changes. The server will trigger the [[onPlayerChangesProtectedData]] event when the client attempts to change the value.&lt;br /&gt;
|22815}}&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&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;
bool setElementData ( element theElement, string key, var value [, bool synchronize = true ] )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
{{OOP||[[element]]:setData||getElementData}}&lt;br /&gt;
&lt;br /&gt;
===Required Arguments=== &lt;br /&gt;
*'''theElement:''' The [[element]] you wish to attach the data to.&lt;br /&gt;
*'''key:''' The key you wish to store the data under. (Maximum 128 characters.) &lt;br /&gt;
*'''value:''' The value you wish to store. See [[element data]] for a list of acceptable datatypes.&lt;br /&gt;
&lt;br /&gt;
===Optional Arguments=== &lt;br /&gt;
*'''synchronize:''' Determines whether or not the data will be synchronized with the server.&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns ''true'' if the data was set successfully, ''false'' otherwise.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
Example 1&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;
This example allows a player to add a custom tag onto their nickname, and also reverts it back to normal if they wish.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function addPlayerCustomTag ( thePlayer, command, newTag )&lt;br /&gt;
	--Let's make sure the newTag param has been entered...&lt;br /&gt;
	if ( newTag ) then&lt;br /&gt;
		--Grab their current playername for saving.&lt;br /&gt;
		local sPlayerNickname = getPlayerName ( thePlayer )&lt;br /&gt;
		--Create their new nickname with their tag&lt;br /&gt;
		local sNewPlayerNickname = newTag .. &amp;quot; &amp;quot; .. sPlayerNickname&lt;br /&gt;
		&lt;br /&gt;
		--Let's first load the element data, see if it's there already&lt;br /&gt;
		--The reason for this is that if a player were to do /addtag twice,&lt;br /&gt;
		--the tag would be prepended a second time&lt;br /&gt;
		local sOldNick = getElementData( thePlayer, &amp;quot;tempdata.originalnick&amp;quot; )&lt;br /&gt;
		if ( sOldNick == false ) then&lt;br /&gt;
			--Save their orignal nickname in their element data&lt;br /&gt;
			setElementData ( thePlayer, &amp;quot;tempdata.originalnick&amp;quot;, sPlayerNickname )&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		--Set their new nickname globally&lt;br /&gt;
		setPlayerName ( thePlayer, sNewPlayerNickname )&lt;br /&gt;
		&lt;br /&gt;
		--Tell them it's done&lt;br /&gt;
		outputChatBox ( &amp;quot;Your new nickname has been set, to put it back to its original state you can use /deltag&amp;quot;, thePlayer )&lt;br /&gt;
	else&lt;br /&gt;
		--The newTag param was not entered, give an error message&lt;br /&gt;
		outputChatBox ( &amp;quot;/addtag - Incorrect syntax, Correct: /addtag &amp;lt;newtag&amp;gt;&amp;quot;, thePlayer )&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
addCommandHandler ( &amp;quot;addtag&amp;quot;, addPlayerCustomTag )&lt;br /&gt;
&lt;br /&gt;
function removePlayerCustomTag ( thePlayer, command )&lt;br /&gt;
	--We first need to check that they have already used /addtag, let's do that now&lt;br /&gt;
	local sOldNick = getElementData( thePlayer, &amp;quot;tempdata.originalnick&amp;quot; )&lt;br /&gt;
	if ( sOldNick ) then&lt;br /&gt;
		--Great, they have a tag added, let's reset them&lt;br /&gt;
		&lt;br /&gt;
		--First we will want to reset the element data back to its default (that being false)&lt;br /&gt;
		setElementData ( thePlayer, &amp;quot;tempdata.originalnick&amp;quot;, false )&lt;br /&gt;
		&lt;br /&gt;
		--Now set the client name back&lt;br /&gt;
		setPlayerName( thePlayer, sOldNick )&lt;br /&gt;
		&lt;br /&gt;
		--Notify them&lt;br /&gt;
		outputChatBox ( &amp;quot;Your old nickname has been set&amp;quot;, thePlayer )&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
addCommandHandler ( &amp;quot;deltag&amp;quot;, removePlayerCustomTag )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
[[tr:setElementData]]&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
[[pt-br:SetElementData]]&lt;br /&gt;
{{Element_functions}}&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=Template:Useful_Functions&amp;diff=77677</id>
		<title>Template:Useful Functions</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=Template:Useful_Functions&amp;diff=77677"/>
		<updated>2023-09-27T20:20:24Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
=== Table functions ===&lt;br /&gt;
*[[addTableChangeHandler]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function monitors the changes of a table.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getTableFromSql]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This functionality is used to obtain saved tables using the function ([https://wiki.multitheftauto.com/wiki/SetTableToSql SetTableToSql ]).&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isValueInTable]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns true if the value exists in the table, false if the value does not exist in the table.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[pairsByKeys]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function sort pairs table.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[rangeToTable]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function converts a string range to a table containing number values.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[setTableProtected]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function protects a table and makes it read-only.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[setTableToSql]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function is used to save the table in the database (sql).&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[Sort_Functions]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» These functions are able to sort your tables by a key.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[table.compare]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function checks whether two given tables are equal.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[table.copy]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function copies a whole table and all the tables in that table.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[table.deepmerge]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function deep merges two tables. Every nested table will be correspondingly merged.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[table.element]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns a new table with only userdata content.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[table.empty]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function checks whether a table is empty.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[table.fromString]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function converts string to a table.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[table.getRandomRows]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns random rows from table.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[table.map]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function goes through a table and replaces every field with the return of the passed function, where the field's value is passed as first argument and optionally more arguments.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[table.merge]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function merges two or more tables together.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[table.random]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function retrieves a random value from a table.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[table.removeValue]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function removes a specified value from a table.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[table.size]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns the absolute size of a table.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[table.toString]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function converts table to a string.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ACL functions ===&lt;br /&gt;
*[[aclGroupClone]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function clone a group to another group with/without ACLs and/or objects.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getAccountsRanks]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function is used to detect the account name groups and put them in the chat.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getPlayerAcls]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns a table of all ACL groups on a player.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getPlayersInACLGroup]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns all players in an ACL group.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isPlayerInACL]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function checks if a player element is in an ACL group.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[renameAclGroup]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function gives an existing ACL group a new name.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isPlayerACLAdmin]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function checks if a player element belong to Admin group in ACL&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Account functions ===&lt;br /&gt;
*[[getPlayerFromAccountName]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function is used to obtain a player by the name of his account.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Camera functions ===&lt;br /&gt;
*[[smoothMoveCamera]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function allows you to create a cinematic camera flight.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Colshape functions ===&lt;br /&gt;
*[[createGarageColShape]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function creates a collision shape from the specified garage.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Cursor functions ===&lt;br /&gt;
*[[getCursorMovedOn]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function checks in which way the cursor is currently moving.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[setCursorCenteredOnRectangle]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This functions will center the cursor inside a rectangle.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Drawing functions ===&lt;br /&gt;
*[[dxDrawAnimWindow]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function draws an animated 2D window on the screen.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawBorderedRectangle]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This is a function that will create a bordered rectangle.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawBorderedText]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This is a function that will create a bordered text.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawDashedLine]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function draws a line with dashes.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawGifImage]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function simulates the effect of a GIF image by using image sprites in 2D.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawImage3D]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function draws a 3D image in GTA world.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawImageOnElement]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function draws an image on any element.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawLinedRectangle]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This is a function that will create a rectangle outline with dx lines.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawLoading]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function draws a loading bar on the screen.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawOctagon3D]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function creates a 3D Octagon&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawPolygon]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function draws a custom polygon on the screen.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawProgressBar]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function simulates a progress bar drawed using DirectDraw.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawRectangle3D]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function draws a 3D rectangle in GTA world.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawRectangleOnPlayer]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function draws a 3D rectangle above the player.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawRing]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function draws a ring with dx lines.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawRombo]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function creates a Rhombus.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawSprite]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function draw a sprite in the 3D world.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawTextOnElement]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function draws a text on any element.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawTextOnRectangle]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» Esta funcion crea un rectangle con un texto dentro.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawTriangle]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This is a function that will create a triangle with dx lines.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxGetFontSizeFromHeight]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function calculates the font size from given height.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxGetRealFontHeight]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function calculates the height of a font.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getScreenStartPositionFromBox]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function helps with getting the correct position for your dx-effects.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[wordWrap]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function breaks a long string into a table of separate lines limited to a specific length in pixels, for drawing separately.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[CreateRectangle3D]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This is a function that will create a 3d rectangle on the player screen.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[DxDrawBordered3DLine]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;»This function creates a bordered area with 3D dx lines.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Effects functions ===&lt;br /&gt;
*[[attachEffect]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function allows you attach an effect to an element.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[setScreenFlash]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function will make the screen flash(like a screenshot).&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Element functions === &lt;br /&gt;
*[[autoAttach]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function attaches one element into another at the same position and rotation they are.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isElementPlayer]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function checks whether the element is a player or not.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[attachElementToBone]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function allows you to attach an element to ped bone accurately using new bone functions.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getElementsInDimension]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns a table of elements that are in the specified dimension.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getElementSpeed]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns the specified element's speed in m/s, km/h or mph.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getElementsWithinMarker]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns a table of elements that are within a marker's collision shape.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getElementUsingData]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns table elements that contains the elements data with the given key and value.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getNearestElement]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns the nearest element (of a specific type) to a player.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isElementInPhotograph]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function checks if an element is in the player's camera picture area.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isElementInRange]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function allows you to check if an element's range to a main point is within the maximum range.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isElementMoving]]&amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function checks if an element is moving.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isElementWithinAColShape]]&amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function checks if an element is within a collision shape element.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isElementInAir]]&amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function checks if an element is in air or not.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[multi_check]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function checks one element to many, handy and clean.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[setElementSpeed]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function allows you to set the speed of an element in kph or mph units.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getElementDirectionCardialPoint]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns the direction of the element according to the ''wind rose''.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Events ===&lt;br /&gt;
*[[onVehicleWeaponFire]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This code implements an event that is triggered when a player in a vehicle fires a vehicle's weapon.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Input functions ===&lt;br /&gt;
*[[bindControlKeys]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function allows you to bind each key bound to a control individually. Doing this bypasses a little MTA restriction.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getBoundControls]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns a table of control names that are bound to the specified key.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[unbindControlKeys]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function allows you to unbind each key bound to a control individually. Use this function with [[bindControlKeys]].&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isCommandHandlerAdded]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function allows you to check if a command is added or not in the respective resource.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Data functions === &lt;br /&gt;
*[[byte2human]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function converts an integer (number of bytes) into a human-readable unit.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[capitalize]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function capitalizes a given string.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[convertDate]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function converts date to another look.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[convertServerTickToTimeStamp]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function converts server ticks to a unix timestamp.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[convertTextToSpeech]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function converts the provided text to a speech in the provided language which players can hear.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[findRotation3D]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function takes two sets of XYZ coordinates. It returns the 3D direction from point A to point B.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[findRotation]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function takes two points and returns the direction from point A to point B.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[formatDate]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function formats a date on the basis of a format string and returns it.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[formatNumber]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function formats large numbers by adding commas.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[generateRandomASCIIString]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns a random string which uses ASCII characters. &amp;lt;/span&amp;gt;&lt;br /&gt;
*[[generateString]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function generates a random string with any characters.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getAge]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function calculates the age of a given birthday.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getDistanceBetweenElements]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» Returns the distance between two elements.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getDistanceBetweenPointAndSegment2D]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function takes point coordinates and line (a segment) starting and ending coordinates. It returns the shortest distance between the point and the line.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getEasterDate]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns easter date monthday and month for a given year.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getElementRelatedAngle]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns the related angle between one element to another. This is useful to check which side an element is to another.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getFreeDimension]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function get free dimension.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getKeyFromValueInTable]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns the key of the specified value in a table.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getOffsetFromXYZ]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function allows you to take an entity and a position and calculate the relative offset between them accounting for rotations.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getPointFromDistanceRotation]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function finds a point based on a starting point, direction and distance.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getRealMonth]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns the current month name&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getRGColorFromPercentage]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia', sans-serif; font-size:smaller;&amp;quot;&amp;gt;»This function returns two integers representing red and green colors according to the specified percentage.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getScreenRotationFromWorldPosition]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns a screen relative rotation to a world position.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getTimestamp]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns the UNIX timestamp of a specified date and time.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[gradientString]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function transforms a string in a new coloured gradient string.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[hex2rgb]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function convert hex to rgb.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[hexColorToRGB]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function convert hex string/number to RGBA values.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isLeapYear]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns a boolean representing if a given year is a leap year.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isValidMail]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function checks whether a provided e-mail string is valid.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[removeHex]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function is used to remove hexadecimal numbers (colors, for example) from strings.&lt;br /&gt;
*[[RGBToHex]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns a string representing the color in hexadecimal.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[RGBToHSV]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function convert RGB to HSV color space.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[RGBToDecimal]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function convert RGB to Decimal color.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[secondsToTimeDesc]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function converts a plain seconds-integer into a user-friendly time description.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[string.count]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function counts the amount of occurences of a string in a string.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[string.explode]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function splits a string at a given separator pattern and returns a table with the pieces.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[string.insert]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function inserts a string within another string at a given position.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[switch]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function allows the value of a variable or expression to control the flow of program execution via a multiway branch.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[tocolor2rgba]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function convert tocolor to rgba.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[toHex]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function converts a decimal number to a hexadecimal number, as a fix to be used client-side.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[var dump]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function outputs information about one or more variables using outputConsole.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[wavelengthToRGBA]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function converts a physical wavelength of light to a RGBA color.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GUI functions === &lt;br /&gt;
*[[centerWindow]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function centers a CEGUI window element responsively in any resolution.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[guiMoveElement]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function moves guiElement by/like using moveObject.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[guiSetStaticImageMovable]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function allows you to move a static image like a gui window.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isMouseOnGUICloseButton]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function allows you to check whether the mouse cursor/pointer is within a gui-window's native close button.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isMouseOnGuiElement]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function allows you to check whether or not your mouse is over a specific gui element, this is especially useful if the gui element has a parent. &amp;lt;/span&amp;gt;&lt;br /&gt;
=====Comboboxes=====&lt;br /&gt;
*[[guiComboBoxAdjustHeight]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function adjusts a CEGUI combobox element to have the correct height.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Gridlists=====&lt;br /&gt;
*[[convertGridListToText]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function converts grid list contents to text.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getGridListRowIndexFromText]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns the GridList row index from the specified text.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[guiGridListAddPlayers]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function add all online players to a grid list.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[guiGridListGetColumnIDFromTitle]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function gets a gridlist's column ID from the column title.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[guiGridListGetSelectedText]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns a string containing the inner text of a selected gridlist item.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[guiGridListSetColumnNonSortable]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function makes a gridlist column become non-sortable.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isTextInGridList]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function checks if some text exist or not in the GridList.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=====Labels=====&lt;br /&gt;
*[[guiLabelAddEffect]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function add an effects to the gui-label like (shadow, outline).&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Marker functions ===&lt;br /&gt;
*[[createMarkerAttachedTo]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function creates a marker that is attached to an element.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Math functions ===&lt;br /&gt;
*[[math.clamp]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns the number between range of numbers or it's minimum or maximum.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[math.getBezierPoint]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» Get N-th order bezier point.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[math.hypot]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns the Hypotenuse of the triangle given by sides x and y.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[math.isPointInPolygon]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» Check if point is inside polygon or not.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[math.lerp]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» Get val between two integer.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[math.percent]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns a percentage from two number values.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[math.polygonArea]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» Compute area of any polygon.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[math.randomDiff]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» Generates a pseudo-random integer that's always different from the last random number generated.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[math.rotVecToEulerAngle]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» Rotation Vector To Euler Angle&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[math.round]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» Rounds a number whereas the number of decimals to keep and the method may be set.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[mathNumber]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function is a workaround for the client-side floating-point precision of 24-bits.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[reMap]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» Re-maps a number from one range to another.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[Math.percentProgress|math.percentProgress]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» Returns a percentage progress from two specific values.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[math.average]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns the simple arithmetic mean of multiple numbers.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Map functions ===&lt;br /&gt;
*[[assignLod]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function lets you conveniently generate and apply a LOD model to a mapping object.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getWorldPositionFromMapPosition]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function converts an F11 map position to world position.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ped functions ===&lt;br /&gt;
*[[getAlivePlayers (Client)|getAlivePlayers]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns a table of the alive players client-side.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getAlivePlayersInTeam]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns a table of the alive players in a team.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getGuestPlayers]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function gets a players not login or players Guest .&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getOnlineAdmins]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns a table of all logged-in administrators.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getPedEyesPosition]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function allows you to get peds eyes position.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getPedGender]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function allows you to get peds their gender.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getPedMaxHealth]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns a pedestrians's maximum health by converting it from their maximum health stat.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getPedMaxOxygenLevel]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns a ped's maximum oxygen level by converting it from their maximum underwater stamina stat.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getPedWeaponSkill]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns a ped's corresponding weapon skill level name.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getPedHitBone]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function gets the approximate number of the bone where the ped is hit.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getPlayerFromNamePart]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns a player from partial name.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getPlayerFromSerial]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns a player from their serial.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getPlayersByData]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns a table of players that have the specified data name.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getPlayersInPhotograph]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns a table of all players in photograph.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getPlayersInVehicles]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns a table of the players insides vehicles from a specified dimension.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isPedAiming]]&amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function checks if a pedestrian is aiming their weapon.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isPedAimingNearPed]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This is similar to isPedAiming but uses a colshape to be more precise.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isPedDiving]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This feature checks that pedestrian is diving in the water.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isPedDrivingVehicle]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function checks if a specified pedestrian is driving a vehicle.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isPlayerInTeam]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function checks if a player is in a specified team.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[setPedAttack]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function will make a ped attack a specified target.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[setPedFollow]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function will make a ped follow a specified target.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getPlayerNameFromID]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function will get the player name from the ID element data.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Player functions ===&lt;br /&gt;
*[[countPlayersInRange]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns the number of players that are within a certain range of the specified coordinates.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getPlayerPreviousAndNextWeapon]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns the player previous and next weapon.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getPlayersInRange]]&amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function make a table of players within certain range.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isPlayerActuallyInVehicle]]&amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function checks if a player is actually in a vehicle instead of just in the process of entering.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isPlayerHitByVehicle]]&amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function cancels event when a element is hit by a vehicle.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Resource functions ===&lt;br /&gt;
*[[getFilesInResourceFolder]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function gets a list of files that are inside a folder of a resource.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getResourceScripts]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns a table of the resource scripts.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getResourceSettings]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns a table of the resource settings.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getResourceSize]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns the size of a specified resource in kB(kilobyte)&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[refreshResource]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function refreshes your resource if you changed any of the files&lt;br /&gt;
*[[setResourcePriority]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function set resource download priority group.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sound functions ===&lt;br /&gt;
*[[isSoundFinished]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function checks if a sound element has finished.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isSoundPlaying]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function checks if a sound element is playing or not.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[stopSoundSlowly]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function stop your sound element slowly.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Browser functions ===&lt;br /&gt;
*[[playVideo]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function plays a video on the screen.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Team functions ===&lt;br /&gt;
*[[getTeamFromColor]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns a team element by the specified color.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getTeamWithFewestPlayers]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns a team element with least players of all the specified teams.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Vehicle functions ===&lt;br /&gt;
*[[findEmptyCarSeat]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function finds you the first empty seat in a vehicle.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getNearestVehicle]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function gets the nearest vehicle to the specified player in a specified distance.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getRandomVehicle]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function gets a random vehicle.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getValidVehicleModels]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns a table of all valid vehicle models.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getVehiclesCountByType]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns the amount of vehicles by the given type as an integer value.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getVehicleTurnVelocityCenterOfMass]]&amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function gets a vehicle's turn velocity relative to the vehicle's center or mass.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isVehicleDoubleExhaust]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function checks is exhaust vehicle double.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isVehicleEmpty]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function checks whether a vehicle is empty.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isVehicleOccupied]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function checks if a specified vehicle is occupied.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isVehicleOnRoof]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function checks whether vehicle is on roof.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isVehicleOnFire]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function checks if the vehicle is on fire or not.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isVehicleReversing]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function checks if a specified vehicle is moving backwards.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isVehicleUpgraded]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function checks is vehicle upgraded by upgrade ID.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[setVehicleGravityPoint]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function sets a vehicle's gravity in the direction of a 3 dimensional coordinate with the strength specified.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[setVehicleTurnVelocityCenterOfMass]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function sets a vehicle's turn velocity relative to the vehicle's center or mass.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[setVehicleHandlingFromText]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function sets a vehicle's handling from text.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[setVehicleWheelModel]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function changes the wheel model of the informed vehicle.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Weapon functions === &lt;br /&gt;
*[[getJetpackWeaponsEnabled]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns a table of enabled weapons usable on a jetpack.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Object functions ===&lt;br /&gt;
*[[getDynamicDoorObjectOpenRatio]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function tells you how open a dynamic door is in a range from 0 to 1.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isElementObject]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function tells you if an element is an object or no.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== XML functions ===&lt;br /&gt;
*[[getXMLNodes]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns all children of a XML node.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Engine functions ===&lt;br /&gt;
*[[engineGetCOLsFromLibrary]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function gets the collision data from the col library.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[engineLoadIMGContainer]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function loads the IMG container.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Utility ===&lt;br /&gt;
*[[animate]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function allows you to use interpolateBetween without render event and easily used.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[callClientFunction]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function allows you to call any client-side function from the server's side.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[callServerFunction]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function allows you to call any server-side function from the client's side.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[check]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function checks if its arguments are of the right type and calls the error-function if one is not.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[checkPassiveTimer]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function allows you to use passive timers in your conditions. For example you want to prevent players repeatedly using a command.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[coroutine.resume]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function applies a fix for hidden coroutine error messages.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[compact]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function create table containing variables and their values.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getBanFromName]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This functions returns the ban of the given playername.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getCurrentFPS]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns the frames per second at which GTA: SA is running.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getSkinNameFromID]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns the name of the skin from the given id.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[IfElse]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns one of two values based on a boolean expression.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isCharInString]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This shared function allows you to check if a char specified is in a string value.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isMouseInCircle]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function checks if a cursor position is in circular area or not.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isMouseInPosition]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function allows you to check whether the mouse cursor/pointer is within a rectangular position.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[iterElements]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function returns ''a time-saving'' iterator for your for-loops.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[PlotTrajectoryAtTime]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» Calculate projectile/water trajectory.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[preprocessor]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function allow you to use gcc macros.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[vector3:compare]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This method checks whether two vectors match, with optional precision.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[svgCreateRoundedRectangle]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function creates a rectangle with rounded edges.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Useful Functions]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetFilesInResourceFolder&amp;diff=77673</id>
		<title>GetFilesInResourceFolder</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetFilesInResourceFolder&amp;diff=77673"/>
		<updated>2023-09-27T19:29:33Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Useful Function}}&amp;lt;lowercasetitle&amp;gt;&amp;lt;/lowercasetitle&amp;gt;__NOTOC__&lt;br /&gt;
This function lists all files in a resource folder. '''PS''': This function should only be performed on server-side.&lt;br /&gt;
{{Note|The listing is only done with files that are specified in the '''meta.xml''' file in attributes named '''src'''.}}&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;table, table getFilesInResourceFolder ( string directory, [ resource theResource ] )&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''directory''': The [[string]] that will determine the folder in which to list files. To get all files, use &amp;lt;code&amp;gt;'/'&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Optional Arguments=== &lt;br /&gt;
{{OptionalArg}}&lt;br /&gt;
* '''theResource''': The [[resource]] to be searched. If not specified, the search is performed on the resource where the function was executed.&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns two [[table|tables]], the 1st storing the name / path of the obtained files, and the 2nd storing only the name of the files (with their respective extensions). Otherwise it returns '''false'''.&lt;br /&gt;
======Format======&lt;br /&gt;
* 1&amp;lt;small&amp;gt;st&amp;lt;/small&amp;gt; table: &amp;lt;code style='color: green'&amp;gt; {&amp;lt;b&amp;gt;'Folder1/Folder2/file.ext'&amp;lt;/b&amp;gt;, &amp;lt;b&amp;gt;'Folder1/file2.ext'&amp;lt;/b&amp;gt;, &amp;lt;b&amp;gt;'file3.ext'&amp;lt;/b&amp;gt;} &amp;lt;/code&amp;gt;&lt;br /&gt;
* 2&amp;lt;small&amp;gt;nd&amp;lt;/small&amp;gt; table: &amp;lt;code style='color: green'&amp;gt; {&amp;lt;b&amp;gt;'file.ext'&amp;lt;/b&amp;gt;, &amp;lt;b&amp;gt;'file2.ext'&amp;lt;/b&amp;gt;, &amp;lt;b&amp;gt;'file3.ext'&amp;lt;/b&amp;gt;} &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Source code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Server-side&amp;quot; class=&amp;quot;server&amp;quot; show=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function getFilesInResourceFolder(path, res)&lt;br /&gt;
	if (triggerServerEvent) then error('The @getFilesInResourceFolder function should only be used on server-side', 2) end&lt;br /&gt;
	&lt;br /&gt;
	if not (type(path) == 'string') then&lt;br /&gt;
		error(&amp;quot;@getFilesInResourceFolder argument #1. Expected a 'string', got '&amp;quot;..type(path)..&amp;quot;'&amp;quot;, 2)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not (tostring(path):find('/$')) then&lt;br /&gt;
		error(&amp;quot;@getFilesInResourceFolder argument #1. The path must contain '/' at the end to make sure it is a directory.&amp;quot;, 2)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	res = (res == nil) and getThisResource() or res&lt;br /&gt;
	if not (type(res) == 'userdata' and getUserdataType(res) == 'resource-data') then  &lt;br /&gt;
		error(&amp;quot;@getFilesInResourceFolder argument #2. Expected a 'resource-data', got '&amp;quot;..(type(res) == 'userdata' and getUserdataType(res) or tostring(res))..&amp;quot;' (type: &amp;quot;..type(res)..&amp;quot;)&amp;quot;, 2)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local files = {}&lt;br /&gt;
	local files_onlyname = {}&lt;br /&gt;
	local thisResource = res == getThisResource() and res or false&lt;br /&gt;
	local charsTypes = '%.%_%w%d%|%\%&amp;lt;%&amp;gt;%:%(%)%&amp;amp;%;%#%?%*'&lt;br /&gt;
	local resourceName = getResourceName(res)&lt;br /&gt;
	local Meta = xmlLoadFile(':'..resourceName ..'/meta.xml')&lt;br /&gt;
	if not Meta then error(&amp;quot;(@getFilesInResourceFolder) Could not get the 'meta.xml' for the resource '&amp;quot;..resourceName..&amp;quot;'&amp;quot;, 2) end&lt;br /&gt;
	for _, nod in ipairs(xmlNodeGetChildren(Meta)) do&lt;br /&gt;
		local srcAttribute = xmlNodeGetAttribute(nod, 'src')&lt;br /&gt;
		if (srcAttribute) then&lt;br /&gt;
			local onlyFileName = tostring(srcAttribute:match('/(['..charsTypes..']+%.['..charsTypes..']+)') or srcAttribute)&lt;br /&gt;
			local theFile = fileOpen(thisResource and srcAttribute or ':'..resourceName..'/'..srcAttribute)&lt;br /&gt;
			if theFile then&lt;br /&gt;
				if (path == '/') then&lt;br /&gt;
					table.insert(files, srcAttribute)&lt;br /&gt;
					table.insert(files_onlyname, onlyFileName)&lt;br /&gt;
				else&lt;br /&gt;
					local filePath = fileGetPath(theFile)&lt;br /&gt;
					filePath = filePath:gsub('/['..charsTypes..']+%.['..charsTypes..']+', '/'):gsub(':'..resourceName..'/', '')&lt;br /&gt;
					if (filePath == tostring(path)) then&lt;br /&gt;
						table.insert(files, srcAttribute)&lt;br /&gt;
						table.insert(files_onlyname, onlyFileName)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				fileClose(theFile)&lt;br /&gt;
			else&lt;br /&gt;
				outputDebugString(&amp;quot;(@getFilesInResourceFolder) Could not check file '&amp;quot;..onlyFileName..&amp;quot;' from resource '&amp;quot;..nomeResource..&amp;quot;'&amp;quot;, 2)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	xmlUnloadFile(Meta)&lt;br /&gt;
	return #files &amp;gt; 0 and files or false, #files_onlyname &amp;gt; 0 and files_onlyname or 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;
&amp;lt;section name=&amp;quot;Example 1 (Server)&amp;quot; class=&amp;quot;server&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
This example create the command handler '''/filesfrom &amp;lt;folder&amp;gt; [resource_name]''' which displays in the chat some information about the data obtained from the file search.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function searchFiles(player, cmd, folderName, resName)&lt;br /&gt;
    if (hasObjectPermissionTo(player, 'function.banPlayer', false)) then -- The player will only proceed with this command if he is allowed to ban&lt;br /&gt;
        if (folderName) then -- If you specified the folder name, then&lt;br /&gt;
            local theRes&lt;br /&gt;
            if (resName) then -- If you specified the name of the resource then we will define it&lt;br /&gt;
                theRes = getResourceFromName(tostring(resName))&lt;br /&gt;
                if not theRes then -- If there is no resource with the specified name, then we will let you know&lt;br /&gt;
                    return outputChatBox(&amp;quot;#FF0000##FFFFFF There is no resource named '&amp;quot;..resName..&amp;quot;'&amp;quot;, player, 255, 255, 255, true)&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            local files, onlyFilesName = getFilesInResourceFolder(folderName, theRes) -- then we will do the search&lt;br /&gt;
            if (files and onlyFilesName) then -- If everything went well, then we show the response data&lt;br /&gt;
                outputChatBox('===== Got files! =====', player, 255, 255, 255, true)&lt;br /&gt;
                outputChatBox('=&amp;gt; Folder: '..tostring(folderName), player, 255, 255, 255, true)&lt;br /&gt;
                outputChatBox('=&amp;gt; Resource: '..tostring(resName), player, 255, 255, 255, true)&lt;br /&gt;
                outputChatBox('=&amp;gt; Total files: '..tostring(#files)..' arquivos', player, 255, 255, 255, true)&lt;br /&gt;
                outputChatBox('=&amp;gt; Files: #00FF00'..tostring(table.concat(onlyFilesName, ', ')), player, 255, 255, 255, true)&lt;br /&gt;
                outputChatBox('==============================', player, 255, 255, 255, true)&lt;br /&gt;
            else&lt;br /&gt;
                outputChatBox(&amp;quot;#FF0000##FFFFFF Couldn't get file list&amp;quot;, player, 255, 255, 255, true)&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            outputChatBox('#FF0000##FFFFFF Specify the name of the folder you want to search for files', player, 255, 255, 255, true)&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        outputChatBox('# You are not allowed to run this command.', player, 255, 0, 0, false)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
addCommandHandler('filesfrom', searchFiles)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&amp;lt;section name=&amp;quot;Example 2 (Server)&amp;quot; class=&amp;quot;server&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
This example create the command handler '''/fileshere &amp;lt;folder&amp;gt;''' which displays in the chat information about the files obtained by the useful function.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function searchFiles(player, cmd, folderName)&lt;br /&gt;
    if (hasObjectPermissionTo(player, 'function.banPlayer', false)) then -- Only those who are allowed to ban players will continue with this command.&lt;br /&gt;
        if (folderName) then -- If you specified the name of the folder you want to search, then ...&lt;br /&gt;
            local files, onlyFilesName = getFilesInResourceFolder(folderName)&lt;br /&gt;
            if (files and onlyFilesName) then -- If we obtained data about the files, then we will display&lt;br /&gt;
                outputChatBox('===== Got files! =====', player, 255, 255, 255, true)&lt;br /&gt;
                outputChatBox('=&amp;gt; Folder: '..tostring(folderName), player, 255, 255, 255, true)&lt;br /&gt;
                outputChatBox('=&amp;gt; Resource: '..getResourceName(getThisResource()), player, 255, 255, 255, true)&lt;br /&gt;
                outputChatBox('=&amp;gt; Total files: '..tostring(#files)..' arquivos', player, 255, 255, 255, true)&lt;br /&gt;
                outputChatBox('=&amp;gt; Files: #00FF00'..tostring(table.concat(onlyFilesName, ', ')), player, 255, 255, 255, true)&lt;br /&gt;
                outputChatBox('==============================', player, 255, 255, 255, true)&lt;br /&gt;
            else&lt;br /&gt;
                outputChatBox('#FF0000##FFFFFF Could not retrieve files in the specified folder', player, 255, 255, 255, true)&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            outputChatBox('#FF0000##FFFFFF Specify the name of the folder you want to search', player, 255, 255, 255, true)&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        outputChatBox('# You are not allowed to run this command', player, 255, 0, 0, false)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
addCommandHandler('fileshere', searchFiles)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Credits==&lt;br /&gt;
*'''Author:''' [[User:Lettify|KronoS Lettify]].&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;br /&gt;
[[PT-BR:GetFilesInResourceFolder]]&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetFilesInResourceFolder&amp;diff=77672</id>
		<title>GetFilesInResourceFolder</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetFilesInResourceFolder&amp;diff=77672"/>
		<updated>2023-09-27T19:09:13Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: Undo revision 77671 by Zver-CR (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Useful Function}}&amp;lt;lowercasetitle&amp;gt;&amp;lt;/lowercasetitle&amp;gt;__NOTOC__&lt;br /&gt;
This function lists all files in a resource folder. '''PS''': This function should only be performed on server-side.&lt;br /&gt;
{{Note|The listing is only done with files that are specified in the '''meta.xml''' file in attributes named '''src'''.}}&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;table, table getFilesInResourceFolder ( string directory, [ resource theResource ] )&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Argument===&lt;br /&gt;
* '''directory''': The [[string]] that will determine the folder in which to list files. To get all files, use &amp;lt;code&amp;gt;'/'&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Optional Argument=== &lt;br /&gt;
{{BR/ArgOpcional}} &lt;br /&gt;
* '''theResource''': The [[resource]](userdata) to be searched. If not specified, the search is performed on the resource where the function was executed.&lt;br /&gt;
&lt;br /&gt;
===Return===&lt;br /&gt;
Return two [[table|tables]], the 1st storing the name / path of the obtained files, and the 2nd storing only the name of the files (with their respective extensions). Otherwise it returns '''false'''.&lt;br /&gt;
======Format======&lt;br /&gt;
* 1&amp;lt;small&amp;gt;st&amp;lt;/small&amp;gt; table: &amp;lt;code style='color: green'&amp;gt; {&amp;lt;b&amp;gt;'Folder1/Folder2/file.ext'&amp;lt;/b&amp;gt;, &amp;lt;b&amp;gt;'Folder1/file2.ext'&amp;lt;/b&amp;gt;, &amp;lt;b&amp;gt;'file3.ext'&amp;lt;/b&amp;gt;} &amp;lt;/code&amp;gt;&lt;br /&gt;
* 2&amp;lt;small&amp;gt;nd&amp;lt;/small&amp;gt; table: &amp;lt;code style='color: green'&amp;gt; {&amp;lt;b&amp;gt;'file.ext'&amp;lt;/b&amp;gt;, &amp;lt;b&amp;gt;'file2.ext'&amp;lt;/b&amp;gt;, &amp;lt;b&amp;gt;'file3.ext'&amp;lt;/b&amp;gt;} &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Source code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Server-side&amp;quot; class=&amp;quot;server&amp;quot; show=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function getFilesInResourceFolder(path, res)&lt;br /&gt;
	if (triggerServerEvent) then error('The @getFilesInResourceFolder function should only be used on server-side', 2) end&lt;br /&gt;
	&lt;br /&gt;
	if not (type(path) == 'string') then&lt;br /&gt;
		error(&amp;quot;@getFilesInResourceFolder argument #1. Expected a 'string', got '&amp;quot;..type(path)..&amp;quot;'&amp;quot;, 2)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not (tostring(path):find('/$')) then&lt;br /&gt;
		error(&amp;quot;@getFilesInResourceFolder argument #1. The path must contain '/' at the end to make sure it is a directory.&amp;quot;, 2)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	res = (res == nil) and getThisResource() or res&lt;br /&gt;
	if not (type(res) == 'userdata' and getUserdataType(res) == 'resource-data') then  &lt;br /&gt;
		error(&amp;quot;@getFilesInResourceFolder argument #2. Expected a 'resource-data', got '&amp;quot;..(type(res) == 'userdata' and getUserdataType(res) or tostring(res))..&amp;quot;' (type: &amp;quot;..type(res)..&amp;quot;)&amp;quot;, 2)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local files = {}&lt;br /&gt;
	local files_onlyname = {}&lt;br /&gt;
	local thisResource = res == getThisResource() and res or false&lt;br /&gt;
	local charsTypes = '%.%_%w%d%|%\%&amp;lt;%&amp;gt;%:%(%)%&amp;amp;%;%#%?%*'&lt;br /&gt;
	local resourceName = getResourceName(res)&lt;br /&gt;
	local Meta = xmlLoadFile(':'..resourceName ..'/meta.xml')&lt;br /&gt;
	if not Meta then error(&amp;quot;(@getFilesInResourceFolder) Could not get the 'meta.xml' for the resource '&amp;quot;..resourceName..&amp;quot;'&amp;quot;, 2) end&lt;br /&gt;
	for _, nod in ipairs(xmlNodeGetChildren(Meta)) do&lt;br /&gt;
		local srcAttribute = xmlNodeGetAttribute(nod, 'src')&lt;br /&gt;
		if (srcAttribute) then&lt;br /&gt;
			local onlyFileName = tostring(srcAttribute:match('/(['..charsTypes..']+%.['..charsTypes..']+)') or srcAttribute)&lt;br /&gt;
			local theFile = fileOpen(thisResource and srcAttribute or ':'..resourceName..'/'..srcAttribute)&lt;br /&gt;
			if theFile then&lt;br /&gt;
				if (path == '/') then&lt;br /&gt;
					table.insert(files, srcAttribute)&lt;br /&gt;
					table.insert(files_onlyname, onlyFileName)&lt;br /&gt;
				else&lt;br /&gt;
					local filePath = fileGetPath(theFile)&lt;br /&gt;
					filePath = filePath:gsub('/['..charsTypes..']+%.['..charsTypes..']+', '/'):gsub(':'..resourceName..'/', '')&lt;br /&gt;
					if (filePath == tostring(path)) then&lt;br /&gt;
						table.insert(files, srcAttribute)&lt;br /&gt;
						table.insert(files_onlyname, onlyFileName)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				fileClose(theFile)&lt;br /&gt;
			else&lt;br /&gt;
				outputDebugString(&amp;quot;(@getFilesInResourceFolder) Could not check file '&amp;quot;..onlyFileName..&amp;quot;' from resource '&amp;quot;..nomeResource..&amp;quot;'&amp;quot;, 2)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	xmlUnloadFile(Meta)&lt;br /&gt;
	return #files &amp;gt; 0 and files or false, #files_onlyname &amp;gt; 0 and files_onlyname or false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Examples== &lt;br /&gt;
====Example 1====&lt;br /&gt;
&amp;lt;section name=&amp;quot;Server-side&amp;quot; class=&amp;quot;server&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
This example create the command handler '''/filesfrom &amp;lt;folder&amp;gt; [resource_name]''' which displays in the chat some information about the data obtained from the file search.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function searchFiles(player, cmd, folderName, resName)&lt;br /&gt;
    if (hasObjectPermissionTo(player, 'function.banPlayer', false)) then -- The player will only proceed with this command if he is allowed to ban&lt;br /&gt;
        if (folderName) then -- If you specified the folder name, then&lt;br /&gt;
            local theRes&lt;br /&gt;
            if (resName) then -- If you specified the name of the resource then we will define it&lt;br /&gt;
                theRes = getResourceFromName(tostring(resName))&lt;br /&gt;
                if not theRes then -- If there is no resource with the specified name, then we will let you know&lt;br /&gt;
                    return outputChatBox(&amp;quot;#FF0000##FFFFFF There is no resource named '&amp;quot;..resName..&amp;quot;'&amp;quot;, player, 255, 255, 255, true)&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            local files, onlyFilesName = getFilesInResourceFolder(folderName, theRes) -- then we will do the search&lt;br /&gt;
            if (files and onlyFilesName) then -- If everything went well, then we show the response data&lt;br /&gt;
                outputChatBox('===== Got files! =====', player, 255, 255, 255, true)&lt;br /&gt;
                outputChatBox('=&amp;gt; Folder: '..tostring(folderName), player, 255, 255, 255, true)&lt;br /&gt;
                outputChatBox('=&amp;gt; Resource: '..tostring(resName), player, 255, 255, 255, true)&lt;br /&gt;
                outputChatBox('=&amp;gt; Total files: '..tostring(#files)..' arquivos', player, 255, 255, 255, true)&lt;br /&gt;
                outputChatBox('=&amp;gt; Files: #00FF00'..tostring(table.concat(onlyFilesName, ', ')), player, 255, 255, 255, true)&lt;br /&gt;
                outputChatBox('==============================', player, 255, 255, 255, true)&lt;br /&gt;
            else&lt;br /&gt;
                outputChatBox(&amp;quot;#FF0000##FFFFFF Couldn't get file list&amp;quot;, player, 255, 255, 255, true)&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            outputChatBox('#FF0000##FFFFFF Specify the name of the folder you want to search for files', player, 255, 255, 255, true)&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        outputChatBox('# You are not allowed to run this command.', player, 255, 0, 0, false)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
addCommandHandler('filesfrom', searchFiles)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Exemplo 2====&lt;br /&gt;
&amp;lt;section name=&amp;quot;Lado servidor&amp;quot; class=&amp;quot;server&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
This example create the command handler '''/fileshere &amp;lt;folder&amp;gt;''' which displays in the chat information about the files obtained by the useful function.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function searchFiles(player, cmd, folderName)&lt;br /&gt;
    if (hasObjectPermissionTo(player, 'function.banPlayer', false)) then -- Only those who are allowed to ban players will continue with this command.&lt;br /&gt;
        if (folderName) then -- If you specified the name of the folder you want to search, then ...&lt;br /&gt;
            local files, onlyFilesName = getFilesInResourceFolder(folderName)&lt;br /&gt;
            if (files and onlyFilesName) then -- If we obtained data about the files, then we will display&lt;br /&gt;
                outputChatBox('===== Got files! =====', player, 255, 255, 255, true)&lt;br /&gt;
                outputChatBox('=&amp;gt; Folder: '..tostring(folderName), player, 255, 255, 255, true)&lt;br /&gt;
                outputChatBox('=&amp;gt; Resource: '..getResourceName(getThisResource()), player, 255, 255, 255, true)&lt;br /&gt;
                outputChatBox('=&amp;gt; Total files: '..tostring(#files)..' arquivos', player, 255, 255, 255, true)&lt;br /&gt;
                outputChatBox('=&amp;gt; Files: #00FF00'..tostring(table.concat(onlyFilesName, ', ')), player, 255, 255, 255, true)&lt;br /&gt;
                outputChatBox('==============================', player, 255, 255, 255, true)&lt;br /&gt;
            else&lt;br /&gt;
                outputChatBox('#FF0000##FFFFFF Could not retrieve files in the specified folder', player, 255, 255, 255, true)&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            outputChatBox('#FF0000##FFFFFF Specify the name of the folder you want to search', player, 255, 255, 255, true)&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        outputChatBox('# You are not allowed to run this command', player, 255, 0, 0, false)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
addCommandHandler('fileshere', searchFiles)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Credits==&lt;br /&gt;
*'''Author:''' [[User:Lettify|KronoS Lettify]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;br /&gt;
[[PT-BR:GetFilesInResourceFolder]]&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetFilesInResourceFolder&amp;diff=77671</id>
		<title>GetFilesInResourceFolder</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetFilesInResourceFolder&amp;diff=77671"/>
		<updated>2023-09-27T19:08:05Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Useful Function}}&amp;lt;lowercasetitle&amp;gt;&amp;lt;/lowercasetitle&amp;gt;__NOTOC__&lt;br /&gt;
This function lists all files in a resource folder. '''PS''': This function should only be performed on server-side.&lt;br /&gt;
{{Note|The listing is only done with files that are specified in the '''meta.xml''' file in attributes named '''src'''.}}&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;table, table getFilesInResourceFolder ( string directory, [ resource theResource ] )&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Argument===&lt;br /&gt;
* '''directory''': The [[string]] that will determine the folder in which to list files. To get all files, use &amp;lt;code&amp;gt;'/'&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Optional Argument=== &lt;br /&gt;
{{BR/ArgOpcional}} &lt;br /&gt;
* '''theResource''': The [[resource]](userdata) to be searched. If not specified, the search is performed on the resource where the function was executed.&lt;br /&gt;
&lt;br /&gt;
===Return===&lt;br /&gt;
Return two [[table|tables]], the 1st storing the name / path of the obtained files, and the 2nd storing only the name of the files (with their respective extensions). Otherwise it returns '''false'''.&lt;br /&gt;
======Format======&lt;br /&gt;
* 1&amp;lt;small&amp;gt;st&amp;lt;/small&amp;gt; table: &amp;lt;code style='color: green'&amp;gt; {&amp;lt;b&amp;gt;'Folder1/Folder2/file.ext'&amp;lt;/b&amp;gt;, &amp;lt;b&amp;gt;'Folder1/file2.ext'&amp;lt;/b&amp;gt;, &amp;lt;b&amp;gt;'file3.ext'&amp;lt;/b&amp;gt;} &amp;lt;/code&amp;gt;&lt;br /&gt;
* 2&amp;lt;small&amp;gt;nd&amp;lt;/small&amp;gt; table: &amp;lt;code style='color: green'&amp;gt; {&amp;lt;b&amp;gt;'file.ext'&amp;lt;/b&amp;gt;, &amp;lt;b&amp;gt;'file2.ext'&amp;lt;/b&amp;gt;, &amp;lt;b&amp;gt;'file3.ext'&amp;lt;/b&amp;gt;} &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Source code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Server-side&amp;quot; class=&amp;quot;server&amp;quot; show=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function getFilesInResourceFolder(path, res)&lt;br /&gt;
	if (triggerServerEvent) then error('The @getFilesInResourceFolder function should only be used on server-side', 2) end&lt;br /&gt;
	&lt;br /&gt;
	if not (type(path) == 'string') then&lt;br /&gt;
		error(&amp;quot;@getFilesInResourceFolder argument #1. Expected a 'string', got '&amp;quot;..type(path)..&amp;quot;'&amp;quot;, 2)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not (tostring(path):find('/$')) then&lt;br /&gt;
		error(&amp;quot;@getFilesInResourceFolder argument #1. The path must contain '/' at the end to make sure it is a directory.&amp;quot;, 2)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	res = (res == nil) and getThisResource() or res&lt;br /&gt;
	if not (type(res) == 'userdata' and getUserdataType(res) == 'resource-data') then  &lt;br /&gt;
		error(&amp;quot;@getFilesInResourceFolder argument #2. Expected a 'resource-data', got '&amp;quot;..(type(res) == 'userdata' and getUserdataType(res) or tostring(res))..&amp;quot;' (type: &amp;quot;..type(res)..&amp;quot;)&amp;quot;, 2)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local files = {}&lt;br /&gt;
	local files_onlyname = {}&lt;br /&gt;
	local thisResource = res == getThisResource() and res or false&lt;br /&gt;
	local charsTypes = '%.%_%w%d%|%\%&amp;lt;%&amp;gt;%:%(%)%&amp;amp;%;%#%?%*'&lt;br /&gt;
	local resourceName = getResourceName(res)&lt;br /&gt;
	local Meta = xmlLoadFile(':'..resourceName ..'/meta.xml')&lt;br /&gt;
	if not Meta then error(&amp;quot;(@getFilesInResourceFolder) Could not get the 'meta.xml' for the resource '&amp;quot;..resourceName..&amp;quot;'&amp;quot;, 2) end&lt;br /&gt;
	for _, nod in ipairs(xmlNodeGetChildren(Meta)) do&lt;br /&gt;
		local srcAttribute = xmlNodeGetAttribute(nod, 'src')&lt;br /&gt;
		if (srcAttribute) then&lt;br /&gt;
			local onlyFileName = tostring(srcAttribute:match('/(['..charsTypes..']+%.['..charsTypes..']+)') or srcAttribute)&lt;br /&gt;
			local theFile = fileOpen(thisResource and srcAttribute or ':'..resourceName..'/'..srcAttribute)&lt;br /&gt;
			if theFile then&lt;br /&gt;
				if (path == '/') then&lt;br /&gt;
					table.insert(files, srcAttribute)&lt;br /&gt;
					table.insert(files_onlyname, onlyFileName)&lt;br /&gt;
				else&lt;br /&gt;
					local filePath = fileGetPath(theFile)&lt;br /&gt;
					filePath = filePath:gsub('/['..charsTypes..']+%.['..charsTypes..']+', '/'):gsub(':'..resourceName..'/', '')&lt;br /&gt;
					if (filePath == tostring(path)) then&lt;br /&gt;
						table.insert(files, srcAttribute)&lt;br /&gt;
						table.insert(files_onlyname, onlyFileName)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				fileClose(theFile)&lt;br /&gt;
			else&lt;br /&gt;
				outputDebugString(&amp;quot;(@getFilesInResourceFolder) Could not check file '&amp;quot;..onlyFileName..&amp;quot;' from resource '&amp;quot;..nomeResource..&amp;quot;'&amp;quot;, 2)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	xmlUnloadFile(Meta)&lt;br /&gt;
	return #files &amp;gt; 0 and files or false, #files_onlyname &amp;gt; 0 and files_onlyname or false&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==Examples== &lt;br /&gt;
====Example 1====&lt;br /&gt;
&amp;lt;section name=&amp;quot;Server-side&amp;quot; class=&amp;quot;server&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
This example create the command handler '''/filesfrom &amp;lt;folder&amp;gt; [resource_name]''' which displays in the chat some information about the data obtained from the file search.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function searchFiles(player, cmd, folderName, resName)&lt;br /&gt;
    if (hasObjectPermissionTo(player, 'function.banPlayer', false)) then -- The player will only proceed with this command if he is allowed to ban&lt;br /&gt;
        if (folderName) then -- If you specified the folder name, then&lt;br /&gt;
            local theRes&lt;br /&gt;
            if (resName) then -- If you specified the name of the resource then we will define it&lt;br /&gt;
                theRes = getResourceFromName(tostring(resName))&lt;br /&gt;
                if not theRes then -- If there is no resource with the specified name, then we will let you know&lt;br /&gt;
                    return outputChatBox(&amp;quot;#FF0000##FFFFFF There is no resource named '&amp;quot;..resName..&amp;quot;'&amp;quot;, player, 255, 255, 255, true)&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            local files, onlyFilesName = getFilesInResourceFolder(folderName, theRes) -- then we will do the search&lt;br /&gt;
            if (files and onlyFilesName) then -- If everything went well, then we show the response data&lt;br /&gt;
                outputChatBox('===== Got files! =====', player, 255, 255, 255, true)&lt;br /&gt;
                outputChatBox('=&amp;gt; Folder: '..tostring(folderName), player, 255, 255, 255, true)&lt;br /&gt;
                outputChatBox('=&amp;gt; Resource: '..tostring(resName), player, 255, 255, 255, true)&lt;br /&gt;
                outputChatBox('=&amp;gt; Total files: '..tostring(#files)..' arquivos', player, 255, 255, 255, true)&lt;br /&gt;
                outputChatBox('=&amp;gt; Files: #00FF00'..tostring(table.concat(onlyFilesName, ', ')), player, 255, 255, 255, true)&lt;br /&gt;
                outputChatBox('==============================', player, 255, 255, 255, true)&lt;br /&gt;
            else&lt;br /&gt;
                outputChatBox(&amp;quot;#FF0000##FFFFFF Couldn't get file list&amp;quot;, player, 255, 255, 255, true)&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            outputChatBox('#FF0000##FFFFFF Specify the name of the folder you want to search for files', player, 255, 255, 255, true)&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        outputChatBox('# You are not allowed to run this command.', player, 255, 0, 0, false)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
addCommandHandler('filesfrom', searchFiles)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Exemplo 2====&lt;br /&gt;
&amp;lt;section name=&amp;quot;Lado servidor&amp;quot; class=&amp;quot;server&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
This example create the command handler '''/fileshere &amp;lt;folder&amp;gt;''' which displays in the chat information about the files obtained by the useful function.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function searchFiles(player, cmd, folderName)&lt;br /&gt;
    if (hasObjectPermissionTo(player, 'function.banPlayer', false)) then -- Only those who are allowed to ban players will continue with this command.&lt;br /&gt;
        if (folderName) then -- If you specified the name of the folder you want to search, then ...&lt;br /&gt;
            local files, onlyFilesName = getFilesInResourceFolder(folderName)&lt;br /&gt;
            if (files and onlyFilesName) then -- If we obtained data about the files, then we will display&lt;br /&gt;
                outputChatBox('===== Got files! =====', player, 255, 255, 255, true)&lt;br /&gt;
                outputChatBox('=&amp;gt; Folder: '..tostring(folderName), player, 255, 255, 255, true)&lt;br /&gt;
                outputChatBox('=&amp;gt; Resource: '..getResourceName(getThisResource()), player, 255, 255, 255, true)&lt;br /&gt;
                outputChatBox('=&amp;gt; Total files: '..tostring(#files)..' arquivos', player, 255, 255, 255, true)&lt;br /&gt;
                outputChatBox('=&amp;gt; Files: #00FF00'..tostring(table.concat(onlyFilesName, ', ')), player, 255, 255, 255, true)&lt;br /&gt;
                outputChatBox('==============================', player, 255, 255, 255, true)&lt;br /&gt;
            else&lt;br /&gt;
                outputChatBox('#FF0000##FFFFFF Could not retrieve files in the specified folder', player, 255, 255, 255, true)&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            outputChatBox('#FF0000##FFFFFF Specify the name of the folder you want to search', player, 255, 255, 255, true)&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        outputChatBox('# You are not allowed to run this command', player, 255, 0, 0, false)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
addCommandHandler('fileshere', searchFiles)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Credits==&lt;br /&gt;
*'''Author:''' [[User:Lettify|KronoS Lettify]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
==See Also==&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;br /&gt;
[[PT-BR:GetFilesInResourceFolder]]&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=IsElementObject&amp;diff=77670</id>
		<title>IsElementObject</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=IsElementObject&amp;diff=77670"/>
		<updated>2023-09-27T19:07:58Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Useful_Function}}&lt;br /&gt;
This function tells you if an element is an object or no.&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;float isElementObject ( element theElement )&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
*'''theElement:''' The element that you wish to check if is an object or no.&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns an object.&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function isElementObject(element)&lt;br /&gt;
   if isElement(element) and getElementType(element) == &amp;quot;object&amp;quot; then&lt;br /&gt;
      return element&lt;br /&gt;
   end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Author: Hydra45'''&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetDynamicDoorObjectOpenRatio&amp;diff=77669</id>
		<title>GetDynamicDoorObjectOpenRatio</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetDynamicDoorObjectOpenRatio&amp;diff=77669"/>
		<updated>2023-09-27T19:07:52Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Useful_Function}}&lt;br /&gt;
This function tells you how open a dynamic (interactive - pushable) door is (the 'open ratio') just like the [[GetVehicleDoorOpenRatio]] function.&lt;br /&gt;
&lt;br /&gt;
{{Note|This function only works properly on objects that have the special collision-response IDE flag #6 (SWINGDOOR). These are: '''1491''', '''1492''', '''1494''', '''1499''', '''1502''', '''1523'''}}&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;float getDynamicDoorObjectOpenRatio ( object theObject )&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
*'''theObject:''' The [[object]] that you wish to get the door open ratio of.&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns a number between 0 and 1 that indicates how open the door is. 0 is closed, and 1 is fully open. Returns false if invalid arguments are passed.&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function getDynamicDoorObjectOpenRatio(theObject)&lt;br /&gt;
    if isElement(theObject) then&lt;br /&gt;
        if getElementType(theObject) == &amp;quot;object&amp;quot; then&lt;br /&gt;
            local angularVelocity = select(3, getElementAngularVelocity(theObject))&lt;br /&gt;
&lt;br /&gt;
            if math.abs(angularVelocity) &amp;gt; 0 then&lt;br /&gt;
                local objectMatrix = getElementMatrix(theObject)&lt;br /&gt;
                local initialAngle = select(3, getElementRotation(theObject, &amp;quot;ZXY&amp;quot;))&lt;br /&gt;
                local currentAngle = -math.deg(math.atan2(objectMatrix[2][1], objectMatrix[2][2]))&lt;br /&gt;
&lt;br /&gt;
                if initialAngle + 180 &amp;gt;= currentAngle then&lt;br /&gt;
                    if initialAngle - 180 &amp;gt; currentAngle then&lt;br /&gt;
                        currentAngle = currentAngle + 360&lt;br /&gt;
                    end&lt;br /&gt;
                else&lt;br /&gt;
                    currentAngle = currentAngle - 360&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
                return math.abs(currentAngle - initialAngle) / 108&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            return 0&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;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=SetVehicleHandlingFromText&amp;diff=77668</id>
		<title>SetVehicleHandlingFromText</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=SetVehicleHandlingFromText&amp;diff=77668"/>
		<updated>2023-09-27T19:07:46Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Useful Function}}&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;vehicle setVehicleHandlingFromText( element vehicle, string handling)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''vehicle''': The vehicle that needs to be installed handling.&lt;br /&gt;
* '''handling''': Text of handling.&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Server side Script&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;
local countHandlingTable = {&lt;br /&gt;
	[1] = &amp;quot;mass&amp;quot;,&lt;br /&gt;
	[2] = &amp;quot;turnMass&amp;quot;,&lt;br /&gt;
	[3] = &amp;quot;dragCoeff&amp;quot;,&lt;br /&gt;
	[4] = &amp;quot;centerOfMassX&amp;quot;,&lt;br /&gt;
	[5] = &amp;quot;centerOfMassY&amp;quot;,&lt;br /&gt;
	[6] = &amp;quot;centerOfMassZ&amp;quot;,&lt;br /&gt;
	[7] = &amp;quot;percentSubmerged&amp;quot;,&lt;br /&gt;
	[8] = &amp;quot;tractionMultiplier&amp;quot;,&lt;br /&gt;
	[9] = &amp;quot;tractionLoss&amp;quot;,&lt;br /&gt;
	[10] = &amp;quot;tractionBias&amp;quot;,&lt;br /&gt;
	[11] = &amp;quot;numberOfGears&amp;quot;,&lt;br /&gt;
	[12] = &amp;quot;maxVelocity&amp;quot;,&lt;br /&gt;
	[13] = &amp;quot;engineAcceleration&amp;quot;,&lt;br /&gt;
	[14] = &amp;quot;engineInertia&amp;quot;,&lt;br /&gt;
	[15] = &amp;quot;driveType&amp;quot;,&lt;br /&gt;
	[16] = &amp;quot;engineType&amp;quot;,&lt;br /&gt;
	[17] = &amp;quot;brakeDeceleration&amp;quot;,&lt;br /&gt;
	[18] = &amp;quot;brakeBias&amp;quot;,&lt;br /&gt;
	[19] = &amp;quot;ABS&amp;quot;,&lt;br /&gt;
	[20] = &amp;quot;steeringLock&amp;quot;,&lt;br /&gt;
	[21] = &amp;quot;suspensionForceLevel&amp;quot;,&lt;br /&gt;
	[22] = &amp;quot;suspensionDamping&amp;quot;,&lt;br /&gt;
	[23] = &amp;quot;suspensionHighSpeedDamping&amp;quot;,&lt;br /&gt;
	[24] = &amp;quot;suspensionUpperLimit&amp;quot;,&lt;br /&gt;
	[25] = &amp;quot;suspensionLowerLimit&amp;quot;,&lt;br /&gt;
	[26] = &amp;quot;suspensionFrontRearBias&amp;quot;,&lt;br /&gt;
	[27] = &amp;quot;suspensionAntiDiveMultiplier&amp;quot;,&lt;br /&gt;
	[28] = &amp;quot;seatOffsetDistance&amp;quot;,&lt;br /&gt;
	[29] = &amp;quot;collisionDamageMultiplier&amp;quot;,&lt;br /&gt;
	[30] = &amp;quot;monetary&amp;quot;,&lt;br /&gt;
	[31] = &amp;quot;modelFlags&amp;quot;,&lt;br /&gt;
	[32] = &amp;quot;handlingFlags&amp;quot;,&lt;br /&gt;
	[33] = &amp;quot;headLight&amp;quot;,&lt;br /&gt;
	[34] = &amp;quot;tailLight&amp;quot;,&lt;br /&gt;
	[35] = &amp;quot;animGroup&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local driveTypes = {&lt;br /&gt;
	[&amp;quot;4&amp;quot;] = &amp;quot;awd&amp;quot;,&lt;br /&gt;
	[&amp;quot;r&amp;quot;] = &amp;quot;rwd&amp;quot;,&lt;br /&gt;
	[&amp;quot;f&amp;quot;] = &amp;quot;fwd&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function setVehicleHandlingFromText (vehicle, text)&lt;br /&gt;
	local t = {}&lt;br /&gt;
	local carID = vehicle.model&lt;br /&gt;
	local tText = split(text, &amp;quot; &amp;quot;)&lt;br /&gt;
	table.remove (tText, 1)&lt;br /&gt;
	local countHandling = 1&lt;br /&gt;
	for i, v in ipairs (tText) do&lt;br /&gt;
		t[countHandlingTable[i]] = v&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local acceptCenterMass = false&lt;br /&gt;
	local centerMass = {x = nil, y = nil, z = nil}&lt;br /&gt;
	for i, v in pairs (t) do&lt;br /&gt;
		if i == &amp;quot;centerOfMassX&amp;quot; then&lt;br /&gt;
			centerMass.x = tonumber(v)&lt;br /&gt;
		elseif i == &amp;quot;centerOfMassY&amp;quot; then&lt;br /&gt;
			centerMass.y = tonumber(v)&lt;br /&gt;
		elseif i == &amp;quot;centerOfMassZ&amp;quot; then&lt;br /&gt;
			centerMass.z = tonumber(v)&lt;br /&gt;
		else&lt;br /&gt;
			if centerMass.x and centerMass.y and centerMass.z and not acceptCenterMass then&lt;br /&gt;
				setVehicleHandling (vehicle, &amp;quot;centerOfMass&amp;quot;, {centerMass.x, centerMass.y, centerMass.z})&lt;br /&gt;
				acceptCenterMass = true&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			if i == &amp;quot;modelFlags&amp;quot; or i == &amp;quot;handlingFlags&amp;quot; then&lt;br /&gt;
				setVehicleHandling (vehicle, i, &amp;quot;0x&amp;quot;..tostring(v))&lt;br /&gt;
			elseif i == &amp;quot;driveType&amp;quot; then&lt;br /&gt;
				setVehicleHandling (vehicle, i, driveTypes[v])&lt;br /&gt;
			else&lt;br /&gt;
				setVehicleHandling (vehicle, i, tonumber(v) or tostring(v))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetNearestVehicle&amp;diff=77667</id>
		<title>GetNearestVehicle</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetNearestVehicle&amp;diff=77667"/>
		<updated>2023-09-27T19:07:40Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Note|You can use [[GetNearestElement|getNearestElement]] for other element types, and not just vehicles}}&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;vehicle getNearestVehicle( element thePlayer )&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''thePlayer''': The player you want to get the nearest vehicle of.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Return a vehicle element if success, false if there's no vehicles in a 10meter circle..&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Server- and/or clientside 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;
function getNearestVehicle(player,distance)&lt;br /&gt;
	local lastMinDis = distance-0.0001&lt;br /&gt;
	local nearestVeh = false&lt;br /&gt;
	local px,py,pz = getElementPosition(player)&lt;br /&gt;
	local pint = getElementInterior(player)&lt;br /&gt;
	local pdim = getElementDimension(player)&lt;br /&gt;
&lt;br /&gt;
	for _,v in pairs(getElementsByType(&amp;quot;vehicle&amp;quot;)) do&lt;br /&gt;
		local vint,vdim = getElementInterior(v),getElementDimension(v)&lt;br /&gt;
		if vint == pint and vdim == pdim then&lt;br /&gt;
			local vx,vy,vz = getElementPosition(v)&lt;br /&gt;
			local dis = getDistanceBetweenPoints3D(px,py,pz,vx,vy,vz)&lt;br /&gt;
			if dis &amp;lt; distance then&lt;br /&gt;
				if dis &amp;lt; lastMinDis then &lt;br /&gt;
					lastMinDis = dis&lt;br /&gt;
					nearestVeh = v&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return nearestVeh&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=Sort_Functions&amp;diff=77666</id>
		<title>Sort Functions</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=Sort_Functions&amp;diff=77666"/>
		<updated>2023-09-27T19:07:34Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Useful_Function}}&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
'''Sorting Algorithms provided by DreTaX&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
table insertSortingByIndex(table t, int SortByKey)&lt;br /&gt;
table fixedBubbleSortingByIndex(table t, int SortByKey)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;section name=&amp;quot;Function source&amp;quot; class=&amp;quot;both&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Insert Sorting works possibly the fastest way If we don't know how sorted our array is.&lt;br /&gt;
You need to specify a table, and the table's index which we will be using to sort with.&lt;br /&gt;
For Example if our table has values like this, then you would specify 3:&lt;br /&gt;
{player, vehicle, playerid, npc}&lt;br /&gt;
local table = insertSortingByIndex(table, 3)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function insertSortingByIndex(array, e)&lt;br /&gt;
	local data = array&lt;br /&gt;
	for i = 2, #data do&lt;br /&gt;
		local j = i - 1&lt;br /&gt;
		local ass = data[i]&lt;br /&gt;
		while j &amp;gt; 0 and data[j][e] &amp;gt; ass[e] do&lt;br /&gt;
			data[j + 1] = data[j]&lt;br /&gt;
			j = j - 1&lt;br /&gt;
		end&lt;br /&gt;
		data[j + 1] = ass&lt;br /&gt;
	end&lt;br /&gt;
	return data&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
o(n^2) Sorting algorithm for lua.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function fixedBubbleSortingByIndex(array, e)&lt;br /&gt;
	local data = array&lt;br /&gt;
	local i = #data&lt;br /&gt;
	while i &amp;gt;= 2 do&lt;br /&gt;
		local idx = 0&lt;br /&gt;
		for j = 1, (i - 1) do&lt;br /&gt;
			if data[j][e] &amp;gt; data[j + 1][e] then&lt;br /&gt;
				local holder = data[j][e]&lt;br /&gt;
				data[j][e] = data[j + 1][e]&lt;br /&gt;
				data[j + 1][e] = holder&lt;br /&gt;
				idx = j&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		i = idx&lt;br /&gt;
	end&lt;br /&gt;
	return data&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local TestArray = {&lt;br /&gt;
	{1, &amp;quot;test&amp;quot;},&lt;br /&gt;
	{33, &amp;quot;test&amp;quot;},&lt;br /&gt;
	{-32, &amp;quot;test&amp;quot;},&lt;br /&gt;
	{-1, &amp;quot;test&amp;quot;},&lt;br /&gt;
	{5, &amp;quot;test&amp;quot;},&lt;br /&gt;
	{11, &amp;quot;test&amp;quot;},&lt;br /&gt;
	{968, &amp;quot;test&amp;quot;},&lt;br /&gt;
	{723, &amp;quot;test&amp;quot;},&lt;br /&gt;
	{33, &amp;quot;test&amp;quot;},&lt;br /&gt;
	{16, &amp;quot;test&amp;quot;},&lt;br /&gt;
	{4, &amp;quot;test&amp;quot;},&lt;br /&gt;
	{5, &amp;quot;test&amp;quot;},&lt;br /&gt;
}&lt;br /&gt;
local SortedTestArray = fixedBubbleSortingByIndex(TestArray, 1)&lt;br /&gt;
for k, v in pairs(SortedTestArray) do&lt;br /&gt;
	outputChatBox(&amp;quot;Value: &amp;quot; .. v[1])&lt;br /&gt;
end&lt;br /&gt;
local SortedTestArray2 = insertSortingByIndex(TestArray, 1)&lt;br /&gt;
for k, v in pairs(SortedTestArray2) do&lt;br /&gt;
	outputChatBox(&amp;quot;Value: &amp;quot; .. v[1])&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=ReMap&amp;diff=77665</id>
		<title>ReMap</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=ReMap&amp;diff=77665"/>
		<updated>2023-09-27T19:07:29Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Useful_Function}}&lt;br /&gt;
Re-maps a number from one range to another.&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;int/float reMap(float value, float low1, float high1, float low2, float high2)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''value''': The incoming value to be converted&lt;br /&gt;
* '''low1''': Lower bound of the value's current range&lt;br /&gt;
* '''high1''': Upper bound of the value's current range&lt;br /&gt;
* '''low2''': Lower bound of the value's target range&lt;br /&gt;
* '''high2''': Upper bound of the value's target range&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns the re-mapped number.&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function reMap(value, low1, high1, low2, high2)&lt;br /&gt;
    return low2 + (value - low1) * (high2 - low2) / (high1 - low1)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Clientside Example&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; lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local alpha = 127.5&lt;br /&gt;
local opacity = reMap(alpha, 0, 255, 0, 1)&lt;br /&gt;
&lt;br /&gt;
-- And the &amp;quot;opacity&amp;quot; return 0.5 because 255/2 = 127.5 and 0 to 1 range is 0.5&lt;br /&gt;
&lt;br /&gt;
-- Reverse:&lt;br /&gt;
local opacity = 0.5&lt;br /&gt;
local alpha = reMap(opacity, 0, 1, 0, 255)&lt;br /&gt;
&lt;br /&gt;
-- And the &amp;quot;alpha &amp;quot; return 127.5 because 1/2 = 0.5 and 0 to 255 range is 127.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;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=AssignLod&amp;diff=77664</id>
		<title>AssignLod</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=AssignLod&amp;diff=77664"/>
		<updated>2023-09-27T19:07:22Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Useful_Function}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
This function is used to conveniently create a LOD for map objects.&lt;br /&gt;
&lt;br /&gt;
{{Note|In most cases you will still need to use [[engineSetModelLODDistance]] besides this function to avoid drawing distance of map objects becoming 1 meter or the script appearing not to load them at all. Refer to the second example on that page, it's a client-side function and cannot be used next to assignLOD.}}&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''element''': The element (model) you would like to generate a LOD for&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 assignLOD(element)&lt;br /&gt;
    local lod = createObject(getElementModel(element),0, 0 ,0, 0, 0, 0, true)&lt;br /&gt;
    setElementDimension(lod,getElementDimension(element))&lt;br /&gt;
    setElementPosition(lod, getElementPosition(element))&lt;br /&gt;
    setElementRotation(lod, getElementRotation(element))&lt;br /&gt;
    setElementCollisionsEnabled(lod,false)&lt;br /&gt;
    setLowLODElement(element,lod)&lt;br /&gt;
    return lod&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Server&amp;quot; class=&amp;quot;server&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
This example shows how to correctly call the function by embedding it into the target element's createObject (for map models).&lt;br /&gt;
Maps must first be converted from .map to .lua (createObject) before the LOD creation script will work per the example.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
addEventHandler (&amp;quot;onResourceStart&amp;quot;, resourceRoot,&lt;br /&gt;
    function()&lt;br /&gt;
        assignLOD(createObject(2283, -820.107421875, 512.89978027344, 21.44261932373, 0, 0, 22.4990234375))&lt;br /&gt;
        assignLOD(createObject(1238, -823.825421875, 524.15778027344, 16.12261932373))&lt;br /&gt;
        assignLOD(createObject(1238, -829.204421875, 536.33978027344, 15.98161932373))&lt;br /&gt;
    end&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
function assignLOD(element)&lt;br /&gt;
    local lod = createObject(getElementModel(element),0, 0 ,0, 0, 0, 0, true)&lt;br /&gt;
    setElementDimension(lod,getElementDimension(element))&lt;br /&gt;
    setElementPosition(lod, getElementPosition(element))&lt;br /&gt;
    setElementRotation(lod, getElementRotation(element))&lt;br /&gt;
    setElementCollisionsEnabled(lod,false)&lt;br /&gt;
    setLowLODElement(element,lod)&lt;br /&gt;
    return lod&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=RU/%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BD%D1%82%D0%B8%D1%87%D0%B8%D1%82_MTA_%D0%B4%D0%BB%D1%8F_%D1%84%D0%BE%D1%80%D0%BA-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%BE%D0%B2&amp;diff=77116</id>
		<title>RU/Полный античит MTA для форк-проектов</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=RU/%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BD%D1%82%D0%B8%D1%87%D0%B8%D1%82_MTA_%D0%B4%D0%BB%D1%8F_%D1%84%D0%BE%D1%80%D0%BA-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%BE%D0%B2&amp;diff=77116"/>
		<updated>2023-06-25T14:48:59Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ {{Примечание|Информация на этой странице не относится к официальным сборкам MTA.}}&lt;br /&gt;
&lt;br /&gt;
Форки MTA, которым недостаточно использовать &amp;quot;обычный netc для форков&amp;quot; (из bdata/netc.dll), как описано на вики-странице [[Forks]], из-за того, что он предлагает очень ограниченную античит-защиту, могут изучить возможности использования нового netc варианта: &amp;quot;полного античита для форков&amp;quot;. Это, однако, имеет свои ограничения, относящиеся к особенностям вашего форк-проекта и реализации, которые нелегко объяснить, но эта страница стремится сделать это как можно точнее.&lt;br /&gt;
&lt;br /&gt;
''Эта операция превратит ваш форк в проект с &amp;quot;надлежащим античитом, основанным на методе исправлений&amp;quot;, как описано в спойлере в этой теме: https://forum.multitheftauto.com/topic/66858-bounty-for-finding-security-flaws-and-working-cheats-in-mta/, а не максимум 15% 'основанным на сигнатурах' античитом, как описано на вики-странице [[Forks]] для обычных форков.''&lt;br /&gt;
&lt;br /&gt;
Основная идея:&lt;br /&gt;
* Модуль netc &amp;quot;с полным античитом для форков&amp;quot; будет предоставлять 95% функций античита, имеющихся в официальных MTA (multitheftauto.com &amp;gt; Кнопка &amp;quot;Download&amp;quot;) сборках.&lt;br /&gt;
* Чем больше несовместимых функций/реализаций (пользовательских изменений) имеет ваш форк-проект, которые '''вы''' можете отключить (добавив их в белый список обнаружения: '''disableac''' массив в '''mtaserver.conf''', как описано на странице [https://wiki.multitheftauto.com/wiki/RU/Anti-cheat_guide#%3Cdisableac%3E%3C/disableac%3E Anti-cheat guide / Руководство по античиту: DISABLEAC]), тем ниже будет указанное число защиты в процентах.&lt;br /&gt;
** '''Например''', если вам нужно отключить 3 различных типа обнаружения (допустим, для российских форков, учитывая загрузку внешних модов вне MTA API/limit adjuster'а, наиболее распространёнными являются: 5, 6, 21), вы получите 85% оставшейся античит-защиты. Хотя это число относительно, так как это даёт разработчикам читов возможность использовать именно эти отключенные категории обнаружения для обеспечения работы их читов/хаков, и эти 3 кода уже предоставляют некоторые конкретные пути для записи в память GTA.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Понимаете, к чему всё это идёт? Ниже в этой статье появится ссылка на &amp;quot;полный античит для форков&amp;quot;, и то, что вы будете делать с ним - это метод проб и ошибок. Попытка интегрировать полную поддержку античита в ваш форк - это вопрос &amp;quot;Мы можем попробовать, и если это сработает, то будет здорово.. если нам придётся отключить некоторые обнаружения, то процент защиты будет выше, чем у обычного античита форков: 15% и это уже огромный выигрыш..&amp;quot; и во многом зависит от меры возможностей. Потому что причина, по которой мы разделили netc форков (из bdata/netc.dll) на тот, в котором отсутствует большинство античит-функций, может быть понятна любому опытному разработчику: netc модуль (античит) не рассчитан на все типы настроек, которые разработчик форка может добавить в свою кодовую базу, это было сделано в духе предоставления максимальной свободы и гибкости. Тем более, что многие форки имеют не самых лучших разработчиков, не понимающих, почему им лучше следовать рекомендациям MTA (mtasa-blue) по написанию кода, структуре проекта и максимально приближать свои пользовательские реализации так, как это обычно делает участник MTA, прошедший проверку (ревью) кода. Таким образом, здесь происходит отделение 'чистых' изменений от 'грязного моддинга', который также часто встречается в российских форках, '''использующих один или несколько следующих подходов к кодовой базе своего проекта:&lt;br /&gt;
'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Реализация моддинговых GTA: SA проектов внешним 'грязным' способом, как limit adjuster (fastman92 и т.д.)&lt;br /&gt;
* Необработанная (raw) загрузка модифицированных данных GTA: SA &amp;amp; .IMG файлов, через распространение предварительно модифицированных установочных папок GTA среди игроков форк клиента. Тем самым полностью игнорируя MTA API для замены моделей и различных игровых процессов.&lt;br /&gt;
* Различные грязные патчи, в широком смысле описанные в абзаце выше. Также включает в себя несоблюдение рекомендаций MTA по &amp;quot;Raw memory access&amp;quot; (необработанному доступу к памяти), найденных здесь: https://github.com/multitheftauto/mtasa-blue/wiki/Dev-Tips, что является значительным фактором риска для сценариев, не ожидаемых netc.dll (античитом), так как если он защищает от модификаций памяти, зная их происхождение, и вы просто поместите грязный 'writeProcessMemory' или memcpy в случайный .cpp файл, это вызовет нарушение. Это далеко не всё, и это плохой пример, но просто чтобы вы поняли, почему существуют несовместимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Получение максимального % античит-защиты ===&lt;br /&gt;
&lt;br /&gt;
Поняв вышесказанное, а также то, что мы стараемся изо всех сил, так как такое использование в качестве &amp;quot;полного античита&amp;quot; для форков никогда не входило в наши планы, и что было бы трудно поддерживать пользовательские модификации каждого, вы можете понять, что мы не можем помочь вам выяснить, что является несовместимым сразу после того, как вы начнёте тестировать netc &amp;quot;с полным античитом&amp;quot; в своём форке. Поэтому вы сами должны либо отключить столько обнаружений, сколько требуется (если вы не можете их исправить - где 'не можете' является показателем отсутствия инженерного опыта), либо, что ещё лучше, разработать исправления, которые позволят вам избежать отключения слишком многих или любых типов обнаружения, тем самым максимизируя потенциальный % античит-функций.&lt;br /&gt;
&lt;br /&gt;
Это означает, что без поддержки команды MTA вам предстоит выяснить, какие настройки/интеграции/несоблюдения MTA API/примеры проблем, описанные ранее в этой статье.. являются виновниками каждого конкретного типа обнаружения, который отправляет вам кики античита после добавления netc &amp;quot;с полным античитом&amp;quot; в ваш форк для тестирования. Мы советуем вам очистить свои интеграции, чтобы избежать необходимости много копаться вручную/выяснять виновника. Для этого обратите внимание на пункты маркированного списка из предыдущего абзаца. Однако, если же прямой виновник найден, приложив все свои усилия, вы должны без каких-либо указаний со стороны MTA придумать альтернативные (более чистые, более соответствующие рекомендациям MTA по написанию кода, API и структуре проекта.. следовательно, менее вероятно несовместимые с полным античитом и тем, что он ожидает) реализации проблемной настройки, найденной в кодовой базе вашего форка. Вы можете видеть, где возможность использовать 'полный античит для форков' становится скорее благосклонностью, чем данностью, особенно с тем состоянием кодовой базы, в котором многие форки, не начав свою разработку по сценарию 'полного античита', выросли, просто написав то, что работает для них, не учитывая такие аспекты. Общая картина того, почему мы не будем поддерживать процесс реинжиниринга, теперь должна быть ясна. Если вы не можете с этим справиться, либо наймите кого-то с большим опытом в компьютерных науках и инженерии, либо отключите больше типов обнаружения античита, и довольствуйтесь всем, что выше 15% обычного netc для форков, лучше что-то, чем ничего. '''Но мы не сможем протянуть руку помощи.''' Любое непонимание этих концепций указывает на отсутствие полноты разработчика (индивидуальных навыков, возможностей для роста) и не может быть отражено на разработчиках MTA.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= '''Давайте перейдём к делу''' =&lt;br /&gt;
&lt;br /&gt;
Если вы считаете, что поняли все концепции, описанные в этой статье, вы можете приступить к внедрению &amp;quot;полного античита для форков&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''СКАЧАЙТЕ: https://mirror-cdn.multitheftauto.com/bdata/fork-support/netc.dll''' (для использования ''вместо'' &amp;quot;bdata/netc.dll&amp;quot; из стандартного mtasa-blue buildactions/install_data.lua)&lt;br /&gt;
Обратите внимание, что версия netc.dll по указанной выше ссылке будет регулярно обновляться, чтобы предоставить форкам все античит-улучшения, поставляемые также и для официальной MTA. Поэтому рекомендуется регулярно получать обновления для вашего форка для обеспечения оптимальной безопасности &amp;amp; надёжности античита&lt;br /&gt;
&lt;br /&gt;
{{Примечание|&lt;br /&gt;
* Важно: Начиная с июня 2023 года, вы должны извлечь все коммиты (получить все изменения) mtasa-blue (обновить до 1.6) и синхронизировать кодовую базу вашего форка, чтобы использовать последнюю версию netc, представленную по ссылке выше. Существуют несовместимые изменения, которые требуют обновления с обеих сторон. Предлагаемый netc модуль подходит для форка, основанного на MTA 1.6&lt;br /&gt;
}}&lt;br /&gt;
{{Примечание|&lt;br /&gt;
* Важно: Вы сами несёте ответственность за добавление средства проверки целостности/подлинности файлов, так как очевидно, что поскольку игровые DLL собираются вами (а не нами), нет возможности внедрить такие уникальные DLL в наши внутренние контрольные списки netc, равно как и нет ничего в других модулях для проверки самого netc. Если вы не доработаете это, читер может просто заменить любой модуль или добавить читерскую полезную нагрузку (payload) с помощью редактирования PE, это самый большой фактор риска при использовании &amp;quot;полного античита для форков&amp;quot;. Как далеко вы хотели бы зайти с проверкой файлов, например, решить усилить её в пользовательском режиме (usermode) (с heartbeat'ами или около того) или использовать собственный дополнительный античит-драйвер в режиме ядра (kernelmode), зависит от вас и уровня приверженности безопасности вашего проекта. Если всё, что вас волнует, это небольшая преграда в отношении читерства, вы можете использовать базовую проверку файлов (MD5/SHA256) для всех игровых модулей&lt;br /&gt;
&lt;br /&gt;
Есть ещё много подобных узких мест, которые слишком сложны для простого объяснения, но основаны на принципе &amp;quot;ничто никогда не бывает на 100% безопасным&amp;quot;, и многие из них относятся к мосту между официальной MTA и форками, использующими 'полный античит'. Также полезно поразмыслить над всем этим в целом: Команда MTA потратила годы на создание античит-технологии и предоставляет многое форкам, если они того пожелают, бесплатно. Рассматривайте это как основной слой античита, который уже защищает многое в GTA, мы помогаем вам не создавать такое огромное количество технологий самостоятельно. Теперь о том, что ещё вы делаете, например, видите это как основной слой, а затем также создаёте свой собственный дополнительный слой античита, возможно, даже на уровне новичка, технически понятном вашим разработчикам, не имеющим серьёзного опыта разработки античитов - это полностью зависит от вашей креативности и того, насколько серьёзно вы относитесь к своему проекту. Если вы хотите дополнить основной слой, предоставляемый нами, то можете это сделать.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
- Замените netc.dll в вашем форк-проекте на вышеуказанный &amp;quot;поддерживаемый для форков&amp;quot; netc с полным античитом.&lt;br /&gt;
- Убедитесь, что тип сборки в version.h изменён на UNSTABLE, согласно рекомендациям &amp;quot;массового потребления&amp;quot; для форков в комментариях: [https://github.com/multitheftauto/mtasa-blue/blob/master/Shared/sdk/version.h Shared/sdk/version.h]. В противном случае, вы сведёте на нет все усилия по получению полной античит-защиты.&lt;br /&gt;
&lt;br /&gt;
- Убедитесь, что вы обновили кодовую базу вашего форка до активной основной версии (для которой netc.dll), '''мастер'''-коммита mtasa-blue, по крайней мере до версии &amp;quot;Default&amp;quot;, указанной на [https://nightly.mtasa.com/ver/] как &amp;quot;Auto-update default&amp;quot; для последней основной версии, затем сопоставьте указанную ревизию с SHA1-хешем коммита с помощью этого инструмента: https://buildinfo.mtasa.com/index.php - это означает, что не следует использовать начальный выпуск (версию, которая имеет метку выпуска на github), потому что MTA использует модель &amp;quot;MTA как услуга&amp;quot;, где игроки получают регулярные обновления, содержащие все основные изменения для оптимального качества и опыта использования новых функций. Последние выпуски netc.dll основаны на этом и могут требовать присутствия мастер-изменений.&lt;br /&gt;
&lt;br /&gt;
- Для ваших выделенных серверов/узлов, к которым будут подключаться игроки, используйте эти net модули:&amp;lt;br&amp;gt;&lt;br /&gt;
Linux x64: https://mirror-cdn.multitheftauto.com/bdata/net_64.so (переименуйте в &amp;quot;net.so&amp;quot;)&amp;lt;br&amp;gt;&lt;br /&gt;
Windows x64: https://mirror-cdn.multitheftauto.com/bdata/net_64.dll (переименуйте в &amp;quot;net.dll&amp;quot;)&amp;lt;br&amp;gt;&lt;br /&gt;
Никогда не используйте x86 сервер для вашего форка, это плохо по многим причинам. Такое не поощряется и не приведёт к хорошим результатам.&lt;br /&gt;
&lt;br /&gt;
Давайте продолжим с настройкой клиента и 'полного античита'.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- Столкнитесь с некоторыми киками античита в вашем форк-клиенте, этап проб и ошибок начинается здесь. Теперь используйте предыдущие части этого руководства, чтобы либо отключить типы обнаружения античита с помощью disableac в mtaserver.conf, либо, что ещё лучше, потратьте больше сил разработчиков на правильное исправление &amp;amp; очистку ваших пользовательских реализаций, как советовали ранее, чтобы сохранить как можно больше % античит-защиты. Мы советуем не опускаться ниже 85% (как в примере с 'disableac' кодами: 5, 6, 21 было упомянуто, что это относительно 85% и то, что требуется большинству российских тяжёлых модифицированных форков для немедленного запуска и возможности вам подключиться).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Заключительные слова: всегда будет лучше не быть форком в первую очередь. Используйте официальный клиент MTA и просто создайте сервер, со временем со своим пользовательским лаунчером, который будет подключать непосредственно к вашему ряду серверов. Просто внесите все настройки, которые вам нужны (причина для создания форка), взяв за основу &amp;quot;upstream&amp;quot; и создайте PR, Pull request (пул-реквест), используя официальный репозиторий MTA https://github.com/multitheftauto/mtasa-blue, чтобы все выиграли, а вы соблюдали лицензию &amp;amp; не сталкивались с препятствиями, включая античит и приток новых игроков, которые возникают при создании форка. MTA обычно имеет 30000 игроков онлайн одновременно, что также является огромным притоком новых игроков для открытия своего сообщества. Лучше просто не быть форком, но если вам действительно нужно, эта страница является нашим активным взаимодействием с форками для получения лучшего уровня античит-защиты.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Мы создали этот вариант netc.dll &amp;quot;с полным античитом для форков&amp;quot; в ноябре/декабре 2022 года и опробовали практические результаты и некоторые специфические исправления для лучшей поддержки, с 2 крупнейшими российскими MTA форками, оба из которых готовятся выпустить обновление, включающее это в ближайшие несколько месяцев. Мы также взаимодействовали с разработчиками небольших форков, которые, однако, решили злоупотребить этим (а вместе с этим и нашим доверием), немедленно став токсичными и пытаясь продать netc модуль &amp;quot;с полным античитом&amp;quot;, который мы им дали, что побудило написать и в спешке опубликовать эту вики-статью. Нехорошо, и, пожалуйста, не ведитесь на предложения от упомянутого круга токсичных разработчиков форков, пытающихся продать вам такой netc &amp;quot;с полным античитом&amp;quot;, когда вы можете получить более новую версию из официального источника, от нас в этой статье. Работа над этой статьёй в контексте упомянутого инцидента обсуждалась в MTA development discord (приглашение: https://discord.gg/GNN6PRtTnu) в этом посте: https://discord.com/channels/801330706252038164/801330706252038170/1044757943071023155 и аналогично в основном, официальном MTA discord (приглашение: https://discord.gg/mtasa) в этом посте: https://discord.com/channels/278474088903606273/278521065435824128/1044758439357849661&lt;br /&gt;
&lt;br /&gt;
[[EN:Forks_Full_AC]]&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=RU/%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BD%D1%82%D0%B8%D1%87%D0%B8%D1%82_MTA_%D0%B4%D0%BB%D1%8F_%D1%84%D0%BE%D1%80%D0%BA-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%BE%D0%B2&amp;diff=77099</id>
		<title>RU/Полный античит MTA для форк-проектов</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=RU/%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BD%D1%82%D0%B8%D1%87%D0%B8%D1%82_MTA_%D0%B4%D0%BB%D1%8F_%D1%84%D0%BE%D1%80%D0%BA-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%BE%D0%B2&amp;diff=77099"/>
		<updated>2023-06-22T18:14:16Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ {{Примечание|Информация на этой странице не относится к официальным сборкам MTA.}}&lt;br /&gt;
&lt;br /&gt;
Форки MTA, которым недостаточно использовать &amp;quot;обычный netc для форков&amp;quot; (из bdata/netc.dll), как описано на вики-странице [[Forks]], из-за того, что он предлагает очень ограниченную античит-защиту, могут изучить возможности использования нового netc варианта: &amp;quot;полного античита для форков&amp;quot;. Это, однако, имеет свои ограничения, относящиеся к особенностям вашего форк-проекта и реализации, которые нелегко объяснить, но эта страница стремится сделать это как можно точнее.&lt;br /&gt;
&lt;br /&gt;
''Эта операция превратит ваш форк в проект с &amp;quot;надлежащим античитом, основанным на методе исправлений&amp;quot;, как описано в спойлере в этой теме: https://forum.multitheftauto.com/topic/66858-bounty-for-finding-security-flaws-and-working-cheats-in-mta/, а не максимум 15% 'основанным на сигнатурах' античитом, как описано на вики-странице [[Forks]] для обычных форков.''&lt;br /&gt;
&lt;br /&gt;
Основная идея:&lt;br /&gt;
* Модуль netc &amp;quot;с полным античитом для форков&amp;quot; будет предоставлять 95% функций античита, имеющихся в официальных MTA (multitheftauto.com &amp;gt; Кнопка &amp;quot;Download&amp;quot;) сборках.&lt;br /&gt;
* Чем больше несовместимых функций/реализаций (пользовательских изменений) имеет ваш форк-проект, которые '''вы''' можете отключить (добавив их в белый список обнаружения: '''disableac''' массив в '''mtaserver.conf''', как описано на странице [https://wiki.multitheftauto.com/wiki/RU/Anti-cheat_guide#%3Cdisableac%3E%3C/disableac%3E Anti-cheat guide / Руководство по античиту: DISABLEAC]), тем ниже будет указанное число защиты в процентах.&lt;br /&gt;
** '''Например''', если вам нужно отключить 3 различных типа обнаружения (допустим, для российских форков, учитывая загрузку внешних модов вне MTA API/limit adjuster'а, наиболее распространёнными являются: 5, 6, 21), вы получите 85% оставшейся античит-защиты. Хотя это число относительно, так как это даёт разработчикам читов возможность использовать именно эти отключенные категории обнаружения для обеспечения работы их читов/хаков, и эти 3 кода уже предоставляют некоторые конкретные пути для записи в память GTA.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Понимаете, к чему всё это идёт? Ниже в этой статье появится ссылка на &amp;quot;полный античит для форков&amp;quot;, и то, что вы будете делать с ним - это метод проб и ошибок. Попытка интегрировать полную поддержку античита в ваш форк - это вопрос &amp;quot;Мы можем попробовать, и если это сработает, то будет здорово.. если нам придётся отключить некоторые обнаружения, то процент защиты будет выше, чем у обычного античита форков: 15% и это уже огромный выигрыш..&amp;quot; и во многом зависит от меры возможностей. Потому что причина, по которой мы разделили netc форков (из bdata/netc.dll) на тот, в котором отсутствует большинство античит-функций, может быть понятна любому опытному разработчику: netc модуль (античит) не рассчитан на все типы настроек, которые разработчик форка может добавить в свою кодовую базу, это было сделано в духе предоставления максимальной свободы и гибкости. Тем более, что многие форки имеют не самых лучших разработчиков, не понимающих, почему им лучше следовать рекомендациям MTA (mtasa-blue) по написанию кода, структуре проекта и максимально приближать свои пользовательские реализации так, как это обычно делает участник MTA, прошедший проверку (ревью) кода. Таким образом, здесь происходит отделение 'чистых' изменений от 'грязного моддинга', который также часто встречается в российских форках, '''использующих один или несколько следующих подходов к кодовой базе своего проекта:&lt;br /&gt;
'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Реализация моддинговых GTA: SA проектов внешним 'грязным' способом, как limit adjuster (fastman92 и т.д.)&lt;br /&gt;
* Необработанная (raw) загрузка модифицированных данных GTA: SA &amp;amp; .IMG файлов, через распространение предварительно модифицированных установочных папок GTA среди игроков форк клиента. Тем самым полностью игнорируя MTA API для замены моделей и различных игровых процессов.&lt;br /&gt;
* Различные грязные патчи, в широком смысле описанные в абзаце выше. Также включает в себя несоблюдение рекомендаций MTA по &amp;quot;Raw memory access&amp;quot; (необработанному доступу к памяти), найденных здесь: https://github.com/multitheftauto/mtasa-blue/wiki/Dev-Tips, что является значительным фактором риска для сценариев, не ожидаемых netc.dll (античитом), так как если он защищает от модификаций памяти, зная их происхождение, и вы просто поместите грязный 'writeProcessMemory' или memcpy в случайный .cpp файл, это вызовет нарушение. Это далеко не всё, и это плохой пример, но просто чтобы вы поняли, почему существуют несовместимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Получение максимального % античит-защиты ===&lt;br /&gt;
&lt;br /&gt;
Поняв вышесказанное, а также то, что мы стараемся изо всех сил, так как такое использование в качестве &amp;quot;полного античита&amp;quot; для форков никогда не входило в наши планы, и что было бы трудно поддерживать пользовательские модификации каждого, вы можете понять, что мы не можем помочь вам выяснить, что является несовместимым сразу после того, как вы начнёте тестировать netc &amp;quot;с полным античитом&amp;quot; в своём форке. Поэтому вы сами должны либо отключить столько обнаружений, сколько требуется (если вы не можете их исправить - где 'не можете' является показателем отсутствия инженерного опыта), либо, что ещё лучше, разработать исправления, которые позволят вам избежать отключения слишком многих или любых типов обнаружения, тем самым максимизируя потенциальный % античит-функций.&lt;br /&gt;
&lt;br /&gt;
Это означает, что без поддержки команды MTA вам предстоит выяснить, какие настройки/интеграции/несоблюдения MTA API/примеры проблем, описанные ранее в этой статье.. являются виновниками каждого конкретного типа обнаружения, который отправляет вам кики античита после добавления netc &amp;quot;с полным античитом&amp;quot; в ваш форк для тестирования. Мы советуем вам очистить свои интеграции, чтобы избежать необходимости много копаться вручную/выяснять виновника. Для этого обратите внимание на пункты маркированного списка из предыдущего абзаца. Однако, если же прямой виновник найден, приложив все свои усилия, вы должны без каких-либо указаний со стороны MTA придумать альтернативные (более чистые, более соответствующие рекомендациям MTA по написанию кода, API и структуре проекта.. следовательно, менее вероятно несовместимые с полным античитом и тем, что он ожидает) реализации проблемной настройки, найденной в кодовой базе вашего форка. Вы можете видеть, где возможность использовать 'полный античит для форков' становится скорее благосклонностью, чем данностью, особенно с тем состоянием кодовой базы, в котором многие форки, не начав свою разработку по сценарию 'полного античита', выросли, просто написав то, что работает для них, не учитывая такие аспекты. Общая картина того, почему мы не будем поддерживать процесс реинжиниринга, теперь должна быть ясна. Если вы не можете с этим справиться, либо наймите кого-то с большим опытом в компьютерных науках и инженерии, либо отключите больше типов обнаружения античита, и довольствуйтесь всем, что выше 15% обычного netc для форков, лучше что-то, чем ничего. '''Но мы не сможем протянуть руку помощи.''' Любое непонимание этих концепций указывает на отсутствие полноты разработчика (индивидуальных навыков, возможностей для роста) и не может быть отражено на разработчиках MTA.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= '''Давайте перейдём к делу''' =&lt;br /&gt;
&lt;br /&gt;
Если вы считаете, что поняли все концепции, описанные в этой статье, вы можете приступить к внедрению &amp;quot;полного античита для форков&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''СКАЧАЙТЕ: https://mirror-cdn.multitheftauto.com/bdata/fork-support/netc.dll''' (для использования ''вместо'' &amp;quot;bdata/netc.dll&amp;quot; из стандартного mtasa-blue buildactions/install_data.lua)&lt;br /&gt;
Обратите внимание, что версия netc.dll по указанной выше ссылке будет регулярно обновляться, чтобы предоставить форкам все античит-улучшения, поставляемые также и для официальной MTA. Поэтому рекомендуется регулярно получать обновления для вашего форка для обеспечения оптимальной безопасности &amp;amp; надёжности античита&lt;br /&gt;
&lt;br /&gt;
{{Примечание|&lt;br /&gt;
* Важно: Начиная с июня 2023 года, вы должны извлечь все коммиты (получить все изменения) mtasa-blue (обновить до 1.6) и синхронизировать кодовую базу вашего форка, чтобы использовать последнюю версию netc, представленную по ссылке выше. Существуют несовместимые изменения, которые требуют обновления с обеих сторон. Предлагаемый netc модуль подходит для форка, основанного на MTA 1.6&lt;br /&gt;
}}&lt;br /&gt;
{{Примечание|&lt;br /&gt;
* Важно: Вы сами несёте ответственность за добавление средства проверки целостности/подлинности файлов, так как очевидно, что поскольку игровые DLL собираются вами (а не нами), нет возможности внедрить такие уникальные DLL в наши внутренние контрольные списки netc, равно как и нет ничего в других модулях для проверки самого netc. Если вы не доработаете это, читер может просто заменить любой модуль или добавить читерскую полезную нагрузку (payload) с помощью редактирования PE, это самый большой фактор риска при использовании &amp;quot;полного античита для форков&amp;quot;. Как далеко вы хотели бы зайти с проверкой файлов, например, решить усилить её в пользовательском режиме (usermode) (с heartbeat'ами или около того) или использовать режим ядра (kernelmode), зависит от вас и уровня приверженности безопасности вашего проекта. Если всё, что вас волнует, это небольшая преграда в отношении читерства, вы можете использовать базовую проверку файлов (MD5/SHA256) для всех игровых модулей&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
- Замените netc.dll в вашем форк-проекте на вышеуказанный &amp;quot;поддерживаемый для форков&amp;quot; netc с полным античитом.&lt;br /&gt;
- Убедитесь, что тип сборки в version.h изменён на UNSTABLE, согласно рекомендациям &amp;quot;массового потребления&amp;quot; для форков в комментариях: [https://github.com/multitheftauto/mtasa-blue/blob/master/Shared/sdk/version.h Shared/sdk/version.h]. В противном случае, вы сведёте на нет все усилия по получению полной античит-защиты.&lt;br /&gt;
&lt;br /&gt;
- Убедитесь, что вы обновили кодовую базу вашего форка до активной основной версии (для которой netc.dll), '''мастер'''-коммита mtasa-blue, по крайней мере до версии &amp;quot;Default&amp;quot;, указанной на [https://nightly.mtasa.com/ver/] как &amp;quot;Auto-update default&amp;quot; для последней основной версии, затем сопоставьте указанную ревизию с SHA1-хешем коммита с помощью этого инструмента: https://buildinfo.mtasa.com/index.php - это означает, что не следует использовать начальный выпуск (версию, которая имеет метку выпуска на github), потому что MTA использует модель &amp;quot;MTA как услуга&amp;quot;, где игроки получают регулярные обновления, содержащие все основные изменения для оптимального качества и опыта использования новых функций. Последние выпуски netc.dll основаны на этом и могут требовать присутствия мастер-изменений.&lt;br /&gt;
&lt;br /&gt;
- Столкнитесь с некоторыми киками античита в вашем форк-клиенте, этап проб и ошибок начинается здесь. Теперь используйте предыдущие части этого руководства, чтобы либо отключить типы обнаружения античита с помощью disableac в mtaserver.conf, либо, что ещё лучше, потратьте больше сил разработчиков на правильное исправление &amp;amp; очистку ваших пользовательских реализаций, как советовали ранее, чтобы сохранить как можно больше % античит-защиты. Мы советуем не опускаться ниже 85% (как в примере с 'disableac' кодами: 5, 6, 21 было упомянуто, что это относительно 85% и то, что требуется большинству российских тяжёлых модифицированных форков для немедленного запуска и возможности вам подключиться).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Заключительные слова: всегда будет лучше не быть форком в первую очередь. Используйте официальный клиент MTA и просто создайте сервер, со временем со своим пользовательским лаунчером, который будет подключать непосредственно к вашему ряду серверов. Просто внесите все настройки, которые вам нужны (причина для создания форка), взяв за основу &amp;quot;upstream&amp;quot; и создайте PR, Pull request (пул-реквест), используя официальный репозиторий MTA https://github.com/multitheftauto/mtasa-blue, чтобы все выиграли, а вы соблюдали лицензию &amp;amp; не сталкивались с препятствиями, включая античит и приток новых игроков, которые возникают при создании форка. MTA обычно имеет 30000 игроков онлайн одновременно, что также является огромным притоком новых игроков для открытия своего сообщества. Лучше просто не быть форком, но если вам действительно нужно, эта страница является нашим активным взаимодействием с форками для получения лучшего уровня античит-защиты.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Мы создали этот вариант netc.dll &amp;quot;с полным античитом для форков&amp;quot; в ноябре/декабре 2022 года и опробовали практические результаты и некоторые специфические исправления для лучшей поддержки, с 2 крупнейшими российскими MTA форками, оба из которых готовятся выпустить обновление, включающее это в ближайшие несколько месяцев. Мы также взаимодействовали с разработчиками небольших форков, которые, однако, решили злоупотребить этим (а вместе с этим и нашим доверием), немедленно став токсичными и пытаясь продать netc модуль &amp;quot;с полным античитом&amp;quot;, который мы им дали, что побудило написать и в спешке опубликовать эту вики-статью. Нехорошо, и, пожалуйста, не ведитесь на предложения от упомянутого круга токсичных разработчиков форков, пытающихся продать вам такой netc &amp;quot;с полным античитом&amp;quot;, когда вы можете получить более новую версию из официального источника, от нас в этой статье. Работа над этой статьёй в контексте упомянутого инцидента обсуждалась в MTA development discord (приглашение: https://discord.gg/GNN6PRtTnu) в этом посте: https://discord.com/channels/801330706252038164/801330706252038170/1044757943071023155 и аналогично в основном, официальном MTA discord (приглашение: https://discord.gg/mtasa) в этом посте: https://discord.com/channels/278474088903606273/278521065435824128/1044758439357849661&lt;br /&gt;
&lt;br /&gt;
[[EN:Forks_Full_AC]]&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=RU/%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BD%D1%82%D0%B8%D1%87%D0%B8%D1%82_MTA_%D0%B4%D0%BB%D1%8F_%D1%84%D0%BE%D1%80%D0%BA-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%BE%D0%B2&amp;diff=76301</id>
		<title>RU/Полный античит MTA для форк-проектов</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=RU/%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BD%D1%82%D0%B8%D1%87%D0%B8%D1%82_MTA_%D0%B4%D0%BB%D1%8F_%D1%84%D0%BE%D1%80%D0%BA-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%BE%D0%B2&amp;diff=76301"/>
		<updated>2023-03-15T17:50:01Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ {{Примечание|Информация на этой странице не относится к официальным сборкам MTA.}}&lt;br /&gt;
&lt;br /&gt;
Форки MTA, которым недостаточно использовать &amp;quot;обычный netc для форков&amp;quot; (из bdata/netc.dll), как описано на вики-странице [[Forks]], из-за того, что он предлагает очень ограниченную античит-защиту, могут изучить возможности использования нового netc варианта: &amp;quot;полного античита для форков&amp;quot;. Это, однако, имеет свои ограничения, относящиеся к особенностям вашего форк-проекта и реализации, которые нелегко объяснить, но эта страница стремится сделать это как можно точнее.&lt;br /&gt;
&lt;br /&gt;
''Эта операция превратит ваш форк в проект с &amp;quot;надлежащим античитом, основанным на методе исправлений&amp;quot;, как описано в спойлере в этой теме: https://forum.multitheftauto.com/topic/66858-bounty-for-finding-security-flaws-and-working-cheats-in-mta/, а не максимум 15% 'основанным на сигнатурах' античитом, как описано на вики-странице [[Forks]] для обычных форков.''&lt;br /&gt;
&lt;br /&gt;
Основная идея:&lt;br /&gt;
* Модуль netc &amp;quot;с полным античитом для форков&amp;quot; будет предоставлять 95% функций античита, имеющихся в официальных MTA (multitheftauto.com &amp;gt; Кнопка &amp;quot;Download&amp;quot;) сборках.&lt;br /&gt;
* Чем больше несовместимых функций/реализаций (пользовательских изменений) имеет ваш форк-проект, которые '''вы''' можете отключить (добавив их в белый список обнаружения: '''disableac''' массив в '''mtaserver.conf''', как описано на странице [https://wiki.multitheftauto.com/wiki/RU/Anti-cheat_guide#%3Cdisableac%3E%3C/disableac%3E Anti-cheat guide / Руководство по античиту: DISABLEAC]), тем ниже будет указанное число защиты в процентах.&lt;br /&gt;
** '''Например''', если вам нужно отключить 3 различных типа обнаружения (допустим, для российских форков, учитывая загрузку внешних модов вне MTA API/limit adjuster'а, наиболее распространёнными являются: 5, 6, 21), вы получите 85% оставшейся античит-защиты. Хотя это число относительно, так как это даёт разработчикам читов возможность использовать именно эти отключенные категории обнаружения для обеспечения работы их читов/хаков, и эти 3 кода уже предоставляют некоторые конкретные пути для записи в память GTA.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Понимаете, к чему всё это идёт? Ниже в этой статье появится ссылка на &amp;quot;полный античит для форков&amp;quot;, и то, что вы будете делать с ним - это метод проб и ошибок. Попытка интегрировать полную поддержку античита в ваш форк - это вопрос &amp;quot;Мы можем попробовать, и если это сработает, то будет здорово.. если нам придётся отключить некоторые обнаружения, то процент защиты будет выше, чем у обычного античита форков: 15% и это уже огромный выигрыш..&amp;quot; и во многом зависит от меры возможностей. Потому что причина, по которой мы разделили netc форков (из bdata/netc.dll) на тот, в котором отсутствует большинство античит-функций, может быть понятна любому опытному разработчику: netc-модуль (античит) не рассчитан на все типы настроек, которые разработчик форка может добавить в свою кодовую базу, это было сделано в духе предоставления максимальной свободы и гибкости. Тем более, что многие форки имеют не самых лучших разработчиков, не понимающих, почему им лучше следовать рекомендациям MTA (mtasa-blue) по написанию кода, структуре проекта и максимально приближать свои пользовательские реализации так, как это обычно делает участник MTA, прошедший проверку (ревью) кода. Таким образом, здесь происходит отделение 'чистых' изменений от 'грязного моддинга', который также часто встречается в российских форках, '''использующих один или несколько следующих подходов к кодовой базе своего проекта:&lt;br /&gt;
'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Реализация моддинговых GTA: SA проектов внешним 'грязным' способом, как limit adjuster (fastman92 и т.д.)&lt;br /&gt;
* Необработанная (raw) загрузка модифицированных данных GTA: SA &amp;amp; .IMG файлов, через распространение предварительно модифицированных установочных папок GTA среди игроков форк клиента. Тем самым полностью игнорируя MTA API для замены моделей и различных игровых процессов.&lt;br /&gt;
* Различные грязные патчи, в широком смысле описанные в абзаце выше. Также включает в себя несоблюдение рекомендаций MTA по &amp;quot;Raw memory access&amp;quot; (необработанному доступу к памяти), найденных здесь: https://github.com/multitheftauto/mtasa-blue/wiki/Dev-Tips, что является значительным фактором риска для сценариев, не ожидаемых netc.dll (античитом), так как если он защищает от модификаций памяти, зная их происхождение, и вы просто поместите грязный 'writeProcessMemory' или memcpy в случайный .cpp файл, это вызовет нарушение. Это далеко не всё, и это плохой пример, но просто чтобы вы поняли, почему существуют несовместимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Получение максимального % античит-защиты ===&lt;br /&gt;
&lt;br /&gt;
Поняв вышесказанное, а также то, что мы стараемся изо всех сил, так как такое использование в качестве &amp;quot;полного античита&amp;quot; для форков никогда не входило в наши планы, и что было бы трудно поддерживать пользовательские модификации каждого, вы можете понять, что мы не можем помочь вам выяснить, что является несовместимым сразу после того, как вы начнёте тестировать netc &amp;quot;с полным античитом&amp;quot; в своём форке. Поэтому вы сами должны либо отключить столько обнаружений, сколько требуется (если вы не можете их исправить - где 'не можете' является показателем отсутствия инженерного опыта), либо, что ещё лучше, разработать исправления, которые позволят вам избежать отключения слишком многих или любых типов обнаружения, тем самым максимизируя потенциальный % античит-функций.&lt;br /&gt;
&lt;br /&gt;
Это означает, что без поддержки команды MTA вам предстоит выяснить, какие настройки/интеграции/несоблюдения MTA API/примеры проблем, описанные ранее в этой статье.. являются виновниками каждого конкретного типа обнаружения, который отправляет вам кики античита после добавления netc &amp;quot;с полным античитом&amp;quot; в ваш форк для тестирования. Мы советуем вам очистить свои интеграции, чтобы избежать необходимости много копаться вручную/выяснять виновника. Для этого обратите внимание на пункты маркированного списка из предыдущего абзаца. Однако, если же прямой виновник найден, приложив все свои усилия, вы должны без каких-либо указаний со стороны MTA придумать альтернативные (более чистые, более соответствующие рекомендациям MTA по написанию кода, API и структуре проекта.. следовательно, менее вероятно несовместимые с полным античитом и тем, что он ожидает) реализации проблемной настройки, найденной в кодовой базе вашего форка. Вы можете видеть, где возможность использовать 'полный античит для форков' становится скорее благосклонностью, чем данностью, особенно с тем состоянием кодовой базы, в котором многие форки, не начав свою разработку по сценарию 'полного античита', выросли, просто написав то, что работает для них, не учитывая такие аспекты. Общая картина того, почему мы не будем поддерживать процесс реинжиниринга, теперь должна быть ясна. Если вы не можете с этим справиться, либо наймите кого-то с большим опытом в компьютерных науках и инженерии, либо отключите больше типов обнаружения античита, и довольствуйтесь всем, что выше 15% обычного netc для форков, лучше что-то, чем ничего. '''Но мы не сможем протянуть руку помощи.''' Любое непонимание этих концепций указывает на отсутствие полноты разработчика (индивидуальных навыков, возможностей для роста) и не может быть отражено на разработчиках MTA.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= '''Давайте перейдём к делу''' =&lt;br /&gt;
&lt;br /&gt;
Если вы считаете, что поняли все концепции, описанные в этой статье, вы можете приступить к внедрению &amp;quot;полного античита для форков&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''СКАЧАЙТЕ: https://mirror-cdn.multitheftauto.com/bdata/fork-support/netc.dll''' (для использования ''вместо'' &amp;quot;bdata/netc.dll&amp;quot; из стандартного mtasa-blue buildactions/install_data.lua)&lt;br /&gt;
Обратите внимание, что версия netc.dll по указанной выше ссылке будет регулярно обновляться, чтобы предоставить форкам все античит-улучшения, поставляемые также и для официальной MTA. Поэтому рекомендуется регулярно получать обновления для вашего форка для обеспечения оптимальной безопасности &amp;amp; надёжности античита&lt;br /&gt;
&lt;br /&gt;
{{Примечание|&lt;br /&gt;
* Важно: Начиная с января 2023 года, вы должны извлечь все коммиты (получить все изменения) mtasa-blue и синхронизировать кодовую базу вашего форка, чтобы использовать последнюю версию netc, представленную по ссылке выше. Существуют несовместимые изменения, которые требуют обновления с обеих сторон. // '''ОБНОВЛЕНИЕ''': Это произошло снова в марте 2023 года, теперь вам необходимо получить как минимум r21618 (коммит eedbdc5fbfdd5d5bed8454728d8e224a4b94838e в mtasa-blue git'е), чтобы использовать версию модуля netc.dll, предлагаемую на данный момент.&lt;br /&gt;
}}&lt;br /&gt;
{{Примечание|&lt;br /&gt;
* Важно: Вы сами несёте ответственность за добавление средства проверки целостности/подлинности файлов, так как очевидно, что поскольку игровые DLL собираются вами (а не нами), нет возможности внедрить такие уникальные DLL в наши внутренние контрольные списки netc, равно как и нет ничего в других модулях для проверки самого netc. Если вы не доработаете это, читер может просто заменить любой модуль или добавить читерскую полезную нагрузку (payload) с помощью редактирования PE, это самый большой фактор риска при использовании &amp;quot;полного античита для форков&amp;quot;. Как далеко вы хотели бы зайти с проверкой файлов, например, решить усилить её в пользовательском режиме (usermode) (с heartbeat'ами или около того) или использовать режим ядра (kernelmode), зависит от вас и уровня приверженности безопасности вашего проекта. Если всё, что вас волнует, это небольшая преграда в отношении читерства, вы можете использовать базовую проверку файлов (MD5/SHA256) для всех игровых модулей&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
- Замените netc.dll в вашем форк-проекте на вышеуказанный &amp;quot;поддерживаемый для форков&amp;quot; netc с полным античитом.&lt;br /&gt;
- Убедитесь, что тип сборки в version.h изменён на UNSTABLE, согласно рекомендациям &amp;quot;массового потребления&amp;quot; для форков в комментариях: [https://github.com/multitheftauto/mtasa-blue/blob/master/Shared/sdk/version.h Shared/sdk/version.h]. В противном случае, вы сведёте на нет все усилия по получению полной античит-защиты.&lt;br /&gt;
&lt;br /&gt;
- Убедитесь, что вы обновили кодовую базу вашего форка до активной основной версии (для которой netc.dll), '''мастер'''-коммита mtasa-blue, по крайней мере до версии &amp;quot;Default&amp;quot;, указанной на [https://nightly.mtasa.com/ver/] как &amp;quot;Auto-update default&amp;quot; для последней основной версии, затем сопоставьте указанную ревизию с SHA1-хешем коммита с помощью этого инструмента: https://buildinfo.mtasa.com/index.php - это означает, что не следует использовать начальный выпуск (версию, которая имеет метку выпуска на github), потому что MTA использует модель &amp;quot;MTA как услуга&amp;quot;, где игроки получают регулярные обновления, содержащие все основные изменения для оптимального качества и опыта использования новых функций. Последние выпуски netc.dll основаны на этом и могут требовать присутствия мастер-изменений.&lt;br /&gt;
&lt;br /&gt;
- Столкнитесь с некоторыми киками античита в вашем форк-клиенте, этап проб и ошибок начинается здесь. Теперь используйте предыдущие части этого руководства, чтобы либо отключить типы обнаружения античита с помощью disableac в mtaserver.conf, либо, что ещё лучше, потратьте больше сил разработчиков на правильное исправление &amp;amp; очистку ваших пользовательских реализаций, как советовали ранее, чтобы сохранить как можно больше % античит-защиты. Мы советуем не опускаться ниже 85% (как в примере с 'disableac' кодами: 5, 6, 21 было упомянуто, что это относительно 85% и то, что требуется большинству российских тяжёлых модифицированных форков для немедленного запуска и возможности вам подключиться).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Заключительные слова: всегда будет лучше не быть форком в первую очередь. Используйте официальный клиент MTA и просто создайте сервер, со временем со своим пользовательским лаунчером, который будет подключать непосредственно к вашему ряду серверов. Просто внесите все настройки, которые вам нужны (причина для создания форка), взяв за основу &amp;quot;upstream&amp;quot; и создайте PR, Pull request (пул-реквест), используя официальный репозиторий MTA https://github.com/multitheftauto/mtasa-blue, чтобы все выиграли, а вы соблюдали лицензию &amp;amp; не сталкивались с препятствиями, включая античит и приток новых игроков, которые возникают при создании форка. MTA обычно имеет 30000 игроков онлайн одновременно, что также является огромным притоком новых игроков для открытия своего сообщества. Лучше просто не быть форком, но если вам действительно нужно, эта страница является нашим активным взаимодействием с форками для получения лучшего уровня античит-защиты.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Мы создали этот вариант netc.dll &amp;quot;с полным античитом для форков&amp;quot; в ноябре/декабре 2022 года и опробовали практические результаты и некоторые специфические исправления для лучшей поддержки, с 2 крупнейшими российскими MTA форками, оба из которых готовятся выпустить обновление, включающее это в ближайшие несколько месяцев. Мы также взаимодействовали с разработчиками небольших форков, которые, однако, решили злоупотребить этим (а вместе с этим и нашим доверием), немедленно став токсичными и пытаясь продать netc-модуль &amp;quot;с полным античитом&amp;quot;, который мы им дали, что побудило написать и в спешке опубликовать эту вики-статью. Нехорошо, и, пожалуйста, не ведитесь на предложения от упомянутого круга токсичных разработчиков форков, пытающихся продать вам такой netc &amp;quot;с полным античитом&amp;quot;, когда вы можете получить более новую версию из официального источника, от нас в этой статье. Работа над этой статьёй в контексте упомянутого инцидента обсуждалась в MTA development discord (приглашение: https://discord.gg/GNN6PRtTnu) в этом посте: https://discord.com/channels/801330706252038164/801330706252038170/1044757943071023155 и аналогично в основном, официальном MTA discord (приглашение: https://discord.gg/mtasa) в этом посте: https://discord.com/channels/278474088903606273/278521065435824128/1044758439357849661&lt;br /&gt;
&lt;br /&gt;
[[EN:Forks_Full_AC]]&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=RU/%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BD%D1%82%D0%B8%D1%87%D0%B8%D1%82_MTA_%D0%B4%D0%BB%D1%8F_%D1%84%D0%BE%D1%80%D0%BA-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%BE%D0%B2&amp;diff=76117</id>
		<title>RU/Полный античит MTA для форк-проектов</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=RU/%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BD%D1%82%D0%B8%D1%87%D0%B8%D1%82_MTA_%D0%B4%D0%BB%D1%8F_%D1%84%D0%BE%D1%80%D0%BA-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%BE%D0%B2&amp;diff=76117"/>
		<updated>2023-02-02T00:45:59Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ {{Примечание|Информация на этой странице не относится к официальным сборкам MTA.}}&lt;br /&gt;
__NOTOC__ {{Примечание|Это не окончательная версия этой страницы, она будет улучшаться/дополняться/переписываться.}}&lt;br /&gt;
&lt;br /&gt;
Форки MTA, которым недостаточно использовать &amp;quot;обычный netc для форков&amp;quot; (из bdata/netc.dll), как описано на вики-странице [[Forks]], из-за того, что он предлагает очень ограниченную античит-защиту, могут изучить возможности использования нового netc варианта: &amp;quot;полного античита для форков&amp;quot;. Это, однако, имеет свои ограничения, относящиеся к особенностям вашего форк-проекта и реализации, которые нелегко объяснить, но эта страница стремится сделать это как можно точнее.&lt;br /&gt;
&lt;br /&gt;
''Эта операция превратит ваш форк в проект с &amp;quot;надлежащим античитом, основанным на методе исправлений&amp;quot;, как описано в спойлере в этой теме: https://forum.multitheftauto.com/topic/66858-bounty-for-finding-security-flaws-and-working-cheats-in-mta/, а не максимум 15% 'основанным на сигнатурах' античитом, как описано на вики-странице [[Forks]] для обычных форков.''&lt;br /&gt;
&lt;br /&gt;
Основная идея:&lt;br /&gt;
* Модуль netc &amp;quot;с полным античитом для форков&amp;quot; будет предоставлять 95% функций античита, имеющихся в официальных MTA (multitheftauto.com &amp;gt; Кнопка &amp;quot;Download&amp;quot;) сборках.&lt;br /&gt;
* Чем больше несовместимых функций/реализаций (пользовательских изменений) имеет ваш форк-проект, которые '''вы''' можете отключить (добавив их в белый список обнаружения: '''disableac''' массив в '''mtaserver.conf''', как описано на странице [https://wiki.multitheftauto.com/wiki/RU/Anti-cheat_guide#%3Cdisableac%3E%3C/disableac%3E Anti-cheat guide / Руководство по античиту: DISABLEAC]), тем ниже будет указанное число защиты в процентах.&lt;br /&gt;
** '''Например''', если вам нужно отключить 3 различных типа обнаружения (допустим, для российских форков, учитывая загрузку внешних модов вне MTA API/limit adjuster'а, наиболее распространёнными являются: 5, 6, 21), вы получите 85% оставшейся античит-защиты. Хотя это число относительно, так как это даёт разработчикам читов возможность использовать именно эти отключенные категории обнаружения для обеспечения работы их читов/хаков, и эти 3 кода уже предоставляют некоторые конкретные пути для записи в память GTA.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Понимаете, к чему всё это идёт? Ниже в этой статье появится ссылка на &amp;quot;полный античит для форков&amp;quot;, и то, что вы будете делать с ним - это метод проб и ошибок. Попытка интегрировать полную поддержку античита в ваш форк - это вопрос &amp;quot;Мы можем попробовать, и если это сработает, то будет здорово.. если нам придётся отключить некоторые обнаружения, то процент защиты будет выше, чем у обычного античита форков: 15% и это уже огромный выигрыш..&amp;quot; и во многом зависит от меры возможностей. Потому что причина, по которой мы разделили netc форков (из bdata/netc.dll) на тот, в котором отсутствует большинство античит-функций, может быть понятна любому опытному разработчику: netc-модуль (античит) не рассчитан на все типы настроек, которые разработчик форка может добавить в свою кодовую базу, это было сделано в духе предоставления максимальной свободы и гибкости. Тем более, что многие форки имеют не самых лучших разработчиков, не понимающих, почему им лучше следовать рекомендациям MTA (mtasa-blue) по написанию кода, структуре проекта и максимально приближать свои пользовательские реализации так, как это обычно делает участник MTA, прошедший проверку (ревью) кода. Таким образом, здесь происходит отделение 'чистых' изменений от 'грязного моддинга', который также часто встречается в российских форках, '''использующих один или несколько следующих подходов к кодовой базе своего проекта:&lt;br /&gt;
'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Реализация моддинговых GTA: SA проектов внешним 'грязным' способом, как limit adjuster (fastman92 и т.д.)&lt;br /&gt;
* Необработанная (raw) загрузка модифицированных данных GTA: SA &amp;amp; .IMG файлов, через распространение предварительно модифицированных установочных папок GTA среди игроков форк клиента. Тем самым полностью игнорируя MTA API для замены моделей и различных игровых процессов.&lt;br /&gt;
* Различные грязные патчи, в широком смысле описанные в абзаце выше. Также включает в себя несоблюдение рекомендаций MTA по &amp;quot;Raw memory access&amp;quot; (необработанному доступу к памяти), найденных здесь: https://github.com/multitheftauto/mtasa-blue/wiki/Dev-Tips, что является значительным фактором риска для сценариев, не ожидаемых netc.dll (античитом), так как если он защищает от модификаций памяти, зная их происхождение, и вы просто поместите грязный 'writeProcessMemory' или memcpy в случайный .cpp файл, это вызовет нарушение. Это далеко не всё, и это плохой пример, но просто чтобы вы поняли, почему существуют несовместимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Получение максимального % античит-защиты ===&lt;br /&gt;
&lt;br /&gt;
Поняв вышесказанное, а также то, что мы стараемся изо всех сил, так как такое использование в качестве &amp;quot;полного античита&amp;quot; для форков никогда не входило в наши планы, и что было бы трудно поддерживать пользовательские модификации каждого, вы можете понять, что мы не можем помочь вам выяснить, что является несовместимым сразу после того, как вы начнёте тестировать netc &amp;quot;с полным античитом&amp;quot; в своём форке. Поэтому вы сами должны либо отключить столько обнаружений, сколько требуется (если вы не можете их исправить - где 'не можете' является показателем отсутствия инженерного опыта), либо, что ещё лучше, разработать исправления, которые позволят вам избежать отключения слишком многих или любых типов обнаружения, тем самым максимизируя потенциальный % античит-функций.&lt;br /&gt;
&lt;br /&gt;
Это означает, что без поддержки команды MTA вам предстоит выяснить, какие настройки/интеграции/несоблюдения MTA API/примеры проблем, описанные ранее в этой статье.. являются виновниками каждого конкретного типа обнаружения, который отправляет вам кики античита после добавления netc &amp;quot;с полным античитом&amp;quot; в ваш форк для тестирования. Мы советуем вам очистить свои интеграции, чтобы избежать необходимости много копаться вручную/выяснять виновника. Для этого обратите внимание на пункты маркированного списка из предыдущего абзаца. Однако, если же прямой виновник найден, приложив все свои усилия, вы должны без каких-либо указаний со стороны MTA придумать альтернативные (более чистые, более соответствующие рекомендациям MTA по написанию кода, API и структуре проекта.. следовательно, менее вероятно несовместимые с полным античитом и тем, что он ожидает) реализации проблемной настройки, найденной в кодовой базе вашего форка. Вы можете видеть, где возможность использовать 'полный античит для форков' становится скорее благосклонностью, чем данностью, особенно с тем состоянием кодовой базы, в котором многие форки, не начав свою разработку по сценарию 'полного античита', выросли, просто написав то, что работает для них, не учитывая такие аспекты. Общая картина того, почему мы не будем поддерживать процесс реинжиниринга, теперь должна быть ясна. Если вы не можете с этим справиться, либо наймите кого-то с большим опытом в компьютерных науках и инженерии, либо отключите больше типов обнаружения античита, и довольствуйтесь всем, что выше 15% обычного netc для форков, лучше что-то, чем ничего. '''Но мы не сможем протянуть руку помощи.''' Любое непонимание этих концепций указывает на отсутствие полноты разработчика (индивидуальных навыков, возможностей для роста) и не может быть отражено на разработчиках MTA.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= '''Давайте перейдём к делу''' =&lt;br /&gt;
&lt;br /&gt;
Если вы считаете, что поняли все концепции, описанные в этой статье, вы можете приступить к внедрению &amp;quot;полного античита для форков&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''СКАЧАЙТЕ: https://mirror-cdn.multitheftauto.com/bdata/fork-support/netc.dll''' (для использования ''вместо'' &amp;quot;bdata/netc.dll&amp;quot; из стандартного mtasa-blue buildactions/install_data.lua)&lt;br /&gt;
Обратите внимание, что версия netc.dll по указанной выше ссылке будет регулярно обновляться, чтобы предоставить форкам все античит-улучшения, поставляемые также и для официальной MTA. Поэтому рекомендуется регулярно получать обновления для вашего форка для обеспечения оптимальной безопасности &amp;amp; надёжности античита&lt;br /&gt;
&lt;br /&gt;
{{Примечание|&lt;br /&gt;
* Важно: Начиная с января 2023 года, вы должны извлечь все коммиты (получить все изменения) mtasa-blue и синхронизировать кодовую базу вашего форка, чтобы использовать последнюю версию netc, представленную по ссылке выше. Существуют несовместимые изменения, которые требуют обновления с обеих сторон&lt;br /&gt;
}}&lt;br /&gt;
{{Примечание|&lt;br /&gt;
* Важно: Вы сами несёте ответственность за добавление средства проверки целостности/подлинности файлов, так как очевидно, что поскольку игровые DLL собираются вами (а не нами), нет возможности внедрить такие уникальные DLL в наши внутренние контрольные списки netc, равно как и нет ничего в других модулях для проверки самого netc. Если вы не доработаете это, читер может просто заменить любой модуль или добавить читерскую полезную нагрузку (payload) с помощью редактирования PE, это самый большой фактор риска при использовании &amp;quot;полного античита для форков&amp;quot;. Как далеко вы хотели бы зайти с проверкой файлов, например, решить усилить её в пользовательском режиме (usermode) (с heartbeat'ами или около того) или использовать режим ядра (kernelmode), зависит от вас и уровня приверженности безопасности вашего проекта. Если всё, что вас волнует, это небольшая преграда в отношении читерства, вы можете использовать базовую проверку файлов (MD5/SHA256) для всех игровых модулей&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
- Замените netc.dll в вашем форк-проекте на вышеуказанный &amp;quot;поддерживаемый для форков&amp;quot; netc с полным античитом.&lt;br /&gt;
- Убедитесь, что тип сборки в version.h изменён на UNSTABLE, согласно рекомендациям &amp;quot;массового потребления&amp;quot; для форков в комментариях: [https://github.com/multitheftauto/mtasa-blue/blob/master/Shared/sdk/version.h Shared/sdk/version.h]. В противном случае, вы сведёте на нет все усилия по получению полной античит-защиты.&lt;br /&gt;
&lt;br /&gt;
- Убедитесь, что вы обновили кодовую базу вашего форка до активной основной версии (для которой netc.dll), '''мастер'''-коммита mtasa-blue, по крайней мере до версии &amp;quot;Default&amp;quot;, указанной на [https://nightly.mtasa.com/ver/] как &amp;quot;Auto-update default&amp;quot; для последней основной версии, затем сопоставьте указанную ревизию с SHA1-хешем коммита с помощью этого инструмента: https://buildinfo.mtasa.com/index.php - это означает, что не следует использовать начальный выпуск (версию, которая имеет метку выпуска на github), потому что MTA использует модель &amp;quot;MTA как услуга&amp;quot;, где игроки получают регулярные обновления, содержащие все основные изменения для оптимального качества и опыта использования новых функций. Последние выпуски netc.dll основаны на этом и могут требовать присутствия мастер-изменений.&lt;br /&gt;
&lt;br /&gt;
- Столкнитесь с некоторыми киками античита в вашем форк-клиенте, этап проб и ошибок начинается здесь. Теперь используйте предыдущие части этого руководства, чтобы либо отключить типы обнаружения античита с помощью disableac в mtaserver.conf, либо, что ещё лучше, потратьте больше сил разработчиков на правильное исправление &amp;amp; очистку ваших пользовательских реализаций, как советовали ранее, чтобы сохранить как можно больше % античит-защиты. Мы советуем не опускаться ниже 85% (как в примере с 'disableac' кодами: 5, 6, 21 было упомянуто, что это относительно 85% и то, что требуется большинству российских тяжёлых модифицированных форков для немедленного запуска и возможности вам подключиться).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Заключительные слова: всегда будет лучше не быть форком в первую очередь. Используйте официальный клиент MTA и просто создайте сервер, со временем со своим пользовательским лаунчером, который будет подключать непосредственно к вашему ряду серверов. Просто внесите все настройки, которые вам нужны (причина для создания форка), взяв за основу &amp;quot;upstream&amp;quot; и создайте PR, Pull request (пул-реквест), используя официальный репозиторий MTA https://github.com/multitheftauto/mtasa-blue, чтобы все выиграли, а вы соблюдали лицензию &amp;amp; не сталкивались с препятствиями, включая античит и приток новых игроков, которые возникают при создании форка. MTA обычно имеет 30000 игроков онлайн одновременно, что также является огромным притоком новых игроков для открытия своего сообщества. Лучше просто не быть форком, но если вам действительно нужно, эта страница является нашим активным взаимодействием с форками для получения лучшего уровня античит-защиты.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Мы создали этот вариант netc.dll &amp;quot;с полным античитом для форков&amp;quot; в ноябре/декабре 2022 года и опробовали практические результаты и некоторые специфические исправления для лучшей поддержки, с 2 крупнейшими российскими MTA форками, оба из которых готовятся выпустить обновление, включающее это в ближайшие несколько месяцев. Мы также взаимодействовали с разработчиками небольших форков, которые, однако, решили злоупотребить этим (а вместе с этим и нашим доверием), немедленно став токсичными и пытаясь продать netc-модуль &amp;quot;с полным античитом&amp;quot;, который мы им дали, что побудило написать и в спешке опубликовать эту вики-статью. Нехорошо, и, пожалуйста, не ведитесь на предложения от упомянутого круга токсичных разработчиков форков, пытающихся продать вам такой netc &amp;quot;с полным античитом&amp;quot;, когда вы можете получить более новую версию из официального источника, от нас в этой статье. Работа над этой статьёй в контексте упомянутого инцидента обсуждалась в MTA development discord (приглашение: https://discord.gg/GNN6PRtTnu) в этом посте: https://discord.com/channels/801330706252038164/801330706252038170/1044757943071023155 и аналогично в основном, официальном MTA discord (приглашение: https://discord.gg/mtasa) в этом посте: https://discord.com/channels/278474088903606273/278521065435824128/1044758439357849661&lt;br /&gt;
&lt;br /&gt;
[[EN:Forks_Full_AC]]&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=RU/%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BD%D1%82%D0%B8%D1%87%D0%B8%D1%82_MTA_%D0%B4%D0%BB%D1%8F_%D1%84%D0%BE%D1%80%D0%BA-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%BE%D0%B2&amp;diff=76116</id>
		<title>RU/Полный античит MTA для форк-проектов</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=RU/%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BD%D1%82%D0%B8%D1%87%D0%B8%D1%82_MTA_%D0%B4%D0%BB%D1%8F_%D1%84%D0%BE%D1%80%D0%BA-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%BE%D0%B2&amp;diff=76116"/>
		<updated>2023-02-02T00:37:50Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ {{Примечание|Информация на этой странице не относится к официальным сборкам MTA.}}&lt;br /&gt;
__NOTOC__ {{Примечание|Это не окончательная версия этой страницы, она будет улучшаться/дополняться/переписываться.}}&lt;br /&gt;
&lt;br /&gt;
Форки MTA, которым недостаточно использовать &amp;quot;обычный netc для форков&amp;quot; (из bdata/netc.dll), как описано на вики-странице [[Forks]], из-за того, что он предлагает очень ограниченную античит-защиту, могут изучить возможности использования нового netc варианта: &amp;quot;полного античита для форков&amp;quot;. Это, однако, имеет свои ограничения, относящиеся к особенностям вашего форк-проекта и реализации, которые нелегко объяснить, но эта страница стремится сделать это как можно точнее.&lt;br /&gt;
&lt;br /&gt;
''Эта операция превратит ваш форк в проект с &amp;quot;надлежащим античитом, основанным на методе исправлений&amp;quot;, как описано в спойлере в этой теме: https://forum.multitheftauto.com/topic/66858-bounty-for-finding-security-flaws-and-working-cheats-in-mta/, а не максимум 15% 'основанным на сигнатурах' античитом, как описано на вики-странице [[Forks]] для обычных форков.''&lt;br /&gt;
&lt;br /&gt;
Основная идея:&lt;br /&gt;
* Модуль netc &amp;quot;с полным античитом для форков&amp;quot; будет предоставлять 95% функций античита, имеющихся в официальных MTA (multitheftauto.com &amp;gt; Кнопка &amp;quot;Download&amp;quot;) сборках.&lt;br /&gt;
* Чем больше несовместимых функций/реализаций (пользовательских изменений) имеет ваш форк-проект, которые '''вы''' можете отключить (добавив их в белый список обнаружения: '''disableac''' массив в '''mtaserver.conf''', как описано на странице [https://wiki.multitheftauto.com/wiki/RU/Anti-cheat_guide#%3Cdisableac%3E%3C/disableac%3E Anti-cheat guide / Руководство по античиту: DISABLEAC]), тем ниже будет указанное число защиты в процентах.&lt;br /&gt;
** '''Например''', если вам нужно отключить 3 различных типа обнаружения (допустим, для российских форков, учитывая загрузку внешних модов вне MTA API/limit adjuster'а, наиболее распространёнными являются: 5, 6, 21), вы получите 85% оставшейся античит-защиты. Хотя это число относительно, так как это даёт разработчикам читов возможность использовать именно эти отключенные категории обнаружения для обеспечения работы их читов/хаков, и эти 3 кода уже предоставляют некоторые конкретные пути для записи в память GTA.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Понимаете, к чему всё это идёт? Ниже в этой статье появится ссылка на &amp;quot;полный античит для форков&amp;quot;, и то, что вы будете делать с ним - это метод проб и ошибок. Попытка интегрировать полную поддержку античита в ваш форк - это вопрос &amp;quot;Мы можем попробовать, и если это сработает, то будет здорово.. если нам придётся отключить некоторые обнаружения, то процент защиты будет выше, чем у обычного античита форков: 15% и это уже огромный выигрыш..&amp;quot; и во многом зависит от меры возможностей. Потому что причина, по которой мы разделили netc форков (из bdata/netc.dll) на тот, в котором отсутствует большинство античит-функций, может быть понятна любому опытному разработчику: netc-модуль (античит) не рассчитан на все типы настроек, которые разработчик форка может добавить в свою кодовую базу, это было сделано в духе предоставления максимальной свободы и гибкости. Тем более, что многие форки имеют не самых лучших разработчиков, не понимающих, почему им лучше следовать рекомендациям MTA (mtasa-blue) по написанию кода, структуре проекта и максимально приближать свои пользовательские реализации так, как это обычно делает участник MTA, прошедший проверку (ревью) кода. Таким образом, здесь происходит отделение 'чистых' изменений от 'грязного моддинга', который также часто встречается в российских форках, '''использующих один или несколько следующих подходов к кодовой базе своего проекта:&lt;br /&gt;
'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Реализация моддинговых GTA: SA проектов внешним 'грязным' способом, как limit adjuster (fastman92 и т.д.)&lt;br /&gt;
* Необработанная (raw) загрузка модифицированных данных GTA: SA &amp;amp; .IMG файлов, через распространение предварительно модифицированных установочных папок GTA среди игроков форк клиента. Тем самым полностью игнорируя MTA API для замены моделей и различных игровых процессов.&lt;br /&gt;
* Различные грязные патчи, в широком смысле описанные в абзаце выше. Также включает в себя несоблюдение рекомендаций MTA по &amp;quot;Raw memory access&amp;quot; (необработанному доступу к памяти), найденных здесь: https://github.com/multitheftauto/mtasa-blue/wiki/Dev-Tips, что является значительным фактором риска для сценариев, не ожидаемых netc.dll (античитом), так как если он защищает от модификаций памяти, зная их происхождение, и вы просто поместите грязный 'writeProcessMemory' или memcpy в случайный .cpp файл, это вызовет нарушение. Это далеко не всё, и это плохой пример, но просто чтобы вы поняли, почему существуют несовместимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Получение максимального % античит-защиты ===&lt;br /&gt;
&lt;br /&gt;
Поняв вышесказанное, а также то, что мы стараемся изо всех сил, так как такое использование в качестве &amp;quot;полного античита&amp;quot; для форков никогда не входило в наши планы, и что было бы трудно поддерживать пользовательские модификации каждого, вы можете понять, что мы не можем помочь вам выяснить, что является несовместимым сразу после того, как вы начнёте тестировать netc &amp;quot;с полным античитом&amp;quot; в своём форке. Поэтому вы сами должны либо отключить столько обнаружений, сколько требуется (если вы не можете их исправить - где 'не можете' является показателем отсутствия инженерного опыта), либо, что ещё лучше, разработать исправления, которые позволят вам избежать отключения слишком многих или любых типов обнаружения, тем самым максимизируя потенциальный % античит-функций.&lt;br /&gt;
&lt;br /&gt;
Это означает, что без поддержки команды MTA вам предстоит выяснить, какие настройки/интеграции/несоблюдения MTA API/примеры проблем, описанные ранее в этой статье.. являются виновниками каждого конкретного типа обнаружения, который отправляет вам кики античита после добавления netc &amp;quot;с полным античитом&amp;quot; в ваш форк для тестирования. Мы советуем вам очистить свои интеграции, чтобы избежать необходимости много копаться вручную/выяснять виновника. Для этого обратите внимание на пункты маркированного списка из предыдущего абзаца. Однако, если же прямой виновник найден, приложив все свои усилия, вы должны без каких-либо указаний со стороны MTA придумать альтернативные (более чистые, более соответствующие рекомендациям MTA по написанию кода, API и структуре проекта.. следовательно, менее вероятно несовместимые с полным античитом и тем, что он ожидает) реализации проблемной настройки, найденной в кодовой базе вашего форка. Вы можете видеть, где возможность использовать 'полный античит для форков' становится скорее благосклонностью, чем данностью, особенно с тем состоянием кодовой базы, в котором многие форки, не начав свою разработку по сценарию 'полного античита', выросли, просто написав то, что работает для них, не учитывая такие аспекты. Общая картина того, почему мы не будем поддерживать процесс реинжиниринга, теперь должна быть ясна. Если вы не можете с этим справиться, либо наймите кого-то с большим опытом в компьютерных науках и инженерии, либо отключите больше типов обнаружения античита, и довольствуйтесь всем, что выше 15% обычного netc для форков, лучше что-то, чем ничего. '''Но мы не сможем протянуть руку помощи.''' Любое непонимание этих концепций указывает на отсутствие полноты разработчика (индивидуальных навыков, возможностей для роста) и не может быть отражено на разработчиках MTA.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= '''Давайте перейдём к делу''' =&lt;br /&gt;
&lt;br /&gt;
Если вы считаете, что поняли все концепции, описанные в этой статье, вы можете приступить к внедрению &amp;quot;полного античита для форков&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''СКАЧАЙТЕ: https://mirror-cdn.multitheftauto.com/bdata/fork-support/netc.dll''' (для использования ''вместо'' &amp;quot;bdata/netc.dll&amp;quot; из стандартного mtasa-blue buildactions/install_data.lua)&lt;br /&gt;
Обратите внимание, что версия netc.dll по указанной выше ссылке будет регулярно обновляться, чтобы предоставить форкам все античит-улучшения, поставляемые также и для официальной MTA. Поэтому рекомендуется регулярно получать обновления для вашего форка для обеспечения оптимальной безопасности &amp;amp; надёжности античита&lt;br /&gt;
&lt;br /&gt;
{{Примечание|&lt;br /&gt;
* Важно: Начиная с января 2023 года, вы должны извлечь все коммиты (получить все изменения) mtasa-blue и синхронизировать кодовую базу вашего форка, чтобы использовать последнюю версию netc, представленную по ссылке выше. Существуют несовместимые изменения, которые требуют обновления с обеих сторон&lt;br /&gt;
}}&lt;br /&gt;
{{Примечание|&lt;br /&gt;
* Важно: Вы сами несёте ответственность за добавление средства проверки целостности/подлинности файлов, так как очевидно, что поскольку игровые DLL собираются вами (а не нами), нет возможности внедрить такие уникальные DLL в наши внутренние контрольные списки netc, равно как и нет ничего в других модулях для проверки самого netc. Если вы не доработаете это, читер может просто заменить любой модуль или добавить в чит полезную нагрузку (payload) с помощью редактирования PE, это самый большой фактор риска при использовании &amp;quot;полного античита для форков&amp;quot;. Как далеко вы хотели бы зайти с проверкой файлов, например, решить усилить её в пользовательском режиме (usermode) (с heartbeat'ами или около того) или использовать режим ядра (kernelmode), зависит от вас и уровня приверженности безопасности вашего проекта. Если всё, что вас волнует, это небольшая преграда в отношении читерства, вы можете использовать базовую проверку файлов (MD5/SHA256) для всех игровых модулей&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
- Замените netc.dll в вашем форк-проекте на вышеуказанный &amp;quot;поддерживаемый для форков&amp;quot; netc с полным античитом.&lt;br /&gt;
- Убедитесь, что тип сборки в version.h изменён на UNSTABLE, согласно рекомендациям &amp;quot;массового потребления&amp;quot; для форков в комментариях: [https://github.com/multitheftauto/mtasa-blue/blob/master/Shared/sdk/version.h Shared/sdk/version.h]. В противном случае, вы сведёте на нет все усилия по получению полной античит-защиты.&lt;br /&gt;
&lt;br /&gt;
- Убедитесь, что вы обновили кодовую базу вашего форка до активной основной версии (для которой netc.dll), '''мастер'''-коммита mtasa-blue, по крайней мере до версии &amp;quot;Default&amp;quot;, указанной на [https://nightly.mtasa.com/ver/] как &amp;quot;Auto-update default&amp;quot; для последней основной версии, затем сопоставьте указанную ревизию с SHA1-хешем коммита с помощью этого инструмента: https://buildinfo.mtasa.com/index.php - это означает, что не следует использовать начальный выпуск (версию, которая имеет метку выпуска на github), потому что MTA использует модель &amp;quot;MTA как услуга&amp;quot;, где игроки получают регулярные обновления, содержащие все основные изменения для оптимального качества и опыта использования новых функций. Последние выпуски netc.dll основаны на этом и могут требовать присутствия мастер-изменений.&lt;br /&gt;
&lt;br /&gt;
- Столкнитесь с некоторыми киками античита в вашем форк-клиенте, этап проб и ошибок начинается здесь. Теперь используйте предыдущие части этого руководства, чтобы либо отключить типы обнаружения античита с помощью disableac в mtaserver.conf, либо, что ещё лучше, потратьте больше сил разработчиков на правильное исправление &amp;amp; очистку ваших пользовательских реализаций, как советовали ранее, чтобы сохранить как можно больше % античит-защиты. Мы советуем не опускаться ниже 85% (как в примере с 'disableac' кодами: 5, 6, 21 было упомянуто, что это относительно 85% и то, что требуется большинству российских тяжёлых модифицированных форков для немедленного запуска и возможности вам подключиться).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Заключительные слова: всегда будет лучше не быть форком в первую очередь. Используйте официальный клиент MTA и просто создайте сервер, со временем со своим пользовательским лаунчером, который будет подключать непосредственно к вашему ряду серверов. Просто внесите все настройки, которые вам нужны (причина для создания форка), взяв за основу &amp;quot;upstream&amp;quot; и создайте PR, Pull request (пул-реквест), используя официальный репозиторий MTA https://github.com/multitheftauto/mtasa-blue, чтобы все выиграли, а вы соблюдали лицензию &amp;amp; не сталкивались с препятствиями, включая античит и приток новых игроков, которые возникают при создании форка. MTA обычно имеет 30000 игроков онлайн одновременно, что также является огромным притоком новых игроков для открытия своего сообщества. Лучше просто не быть форком, но если вам действительно нужно, эта страница является нашим активным взаимодействием с форками для получения лучшего уровня античит-защиты.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Мы создали этот вариант netc.dll &amp;quot;с полным античитом для форков&amp;quot; в ноябре/декабре 2022 года и опробовали практические результаты и некоторые специфические исправления для лучшей поддержки, с 2 крупнейшими российскими MTA форками, оба из которых готовятся выпустить обновление, включающее это в ближайшие несколько месяцев. Мы также взаимодействовали с разработчиками небольших форков, которые, однако, решили злоупотребить этим (а вместе с этим и нашим доверием), немедленно став токсичными и пытаясь продать netc-модуль &amp;quot;с полным античитом&amp;quot;, который мы им дали, что побудило написать и в спешке опубликовать эту вики-статью. Нехорошо, и, пожалуйста, не ведитесь на предложения от упомянутого круга токсичных разработчиков форков, пытающихся продать вам такой netc &amp;quot;с полным античитом&amp;quot;, когда вы можете получить более новую версию из официального источника, от нас в этой статье. Работа над этой статьёй в контексте упомянутого инцидента обсуждалась в MTA development discord (приглашение: https://discord.gg/GNN6PRtTnu) в этом посте: https://discord.com/channels/801330706252038164/801330706252038170/1044757943071023155 и аналогично в основном, официальном MTA discord (приглашение: https://discord.gg/mtasa) в этом посте: https://discord.com/channels/278474088903606273/278521065435824128/1044758439357849661&lt;br /&gt;
&lt;br /&gt;
[[EN:Forks_Full_AC]]&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=RU/How_to_repair_the_database_files&amp;diff=75861</id>
		<title>RU/How to repair the database files</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=RU/How_to_repair_the_database_files&amp;diff=75861"/>
		<updated>2022-12-26T23:36:24Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Может быть, все в порядке=&lt;br /&gt;
Бывают ситуации, когда не о чем беспокоиться. Ответьте на следующие вопросы:&lt;br /&gt;
* Пришли ли вы на эту страницу из-за увиденного сообщения в консоли сервера или логах?&lt;br /&gt;
* Есть ли следующий текст в начале блока сообщений-ошибок?&lt;br /&gt;
    ERROR: near &amp;quot;3&amp;quot;: syntax error&lt;br /&gt;
* Если  это так, то все OK. Вам не нужно делать ничего из описанного ниже, а ошибку можно смело проигнорировать.&lt;br /&gt;
&lt;br /&gt;
=Предупреждения=&lt;br /&gt;
'''Сделайте резервные копии всех файлов перед попыткой восстановления!'''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Выключите сервер перед восстановлением!'''&lt;br /&gt;
&lt;br /&gt;
=Windows=&lt;br /&gt;
&lt;br /&gt;
==Простой способ==&lt;br /&gt;
*Скачайте [https://mirror-cdn.multitheftauto.com/files/mtasa-db-repair-win.zip это]&lt;br /&gt;
*Распакуйте архив и положите файлы по пути ''server/mods/deathmatch/''&lt;br /&gt;
*Дважды кликните по ''sqlite_repair_internal_db.bat'', чтобы восстановить internal.db&lt;br /&gt;
*Дважды кликните по ''sqlite_repair_registry_db.bat'', чтобы восстановить registry.db&lt;br /&gt;
&lt;br /&gt;
==Сложный способ==&lt;br /&gt;
&lt;br /&gt;
*Скачайте sqlite-tools-win32 [https://www.sqlite.org/2022/sqlite-tools-win32-x86-3400000.zip отсюда]. Если ссылка не сработает, главная страница закачки [https://www.sqlite.org/download.html здесь].&lt;br /&gt;
*Распакуйте архив и поместите sqlite3.exe в ''server/mods/deathmatch/''&lt;br /&gt;
*Откройте командную строку и перейдите в папку ''server/mods/deathmatch/''&lt;br /&gt;
*Чтобы восстановить internal.db:&lt;br /&gt;
**Скопируйте '''internal.db''', переименовав в '''internal_original.db'''&lt;br /&gt;
**Пропишите следующую команду: '''sqlite3.exe internal_original.db .dump | sqlite3.exe internal_repaired.db'''&lt;br /&gt;
**Скопируйте '''internal_repaired.db''', переименовав в '''internal.db'''&lt;br /&gt;
&lt;br /&gt;
*Чтобы восстановить registry.db:&lt;br /&gt;
**Скопируйте '''registry.db''', переименовав в '''registry_original.db'''&lt;br /&gt;
**Пропишите следующую команду: '''sqlite3.exe registry_original.db .dump | sqlite3.exe registry_repaired.db'''&lt;br /&gt;
**Скопируйте '''registry_repaired.db''', переименовав в '''registry.db'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Linux=&lt;br /&gt;
&lt;br /&gt;
==Единственный способ==&lt;br /&gt;
(Вы можете воспользоваться простым способом, скопировав БД из linux в windows, а затем воспользовавшись методами для компьютеров с windows)&lt;br /&gt;
*Скачайте sqlite-tools-linux-x86 [https://www.sqlite.org/2022/sqlite-tools-linux-x86-3400000.zip отсюда]. Если ссылка не сработает, главная страница закачки [https://www.sqlite.org/download.html здесь].&lt;br /&gt;
*Распакуйте архив и поместите sqlite3 в ''server/mods/deathmatch/''&lt;br /&gt;
*Чтобы восстановить internal.db:&lt;br /&gt;
**Скопируйте '''internal.db''', переименовав в '''internal_original.db'''&lt;br /&gt;
**Пропишите следующую команду: '''./sqlite3 internal_original.db .dump | ./sqlite3 internal_repaired.db'''&lt;br /&gt;
**Скопируйте '''internal_repaired.db''', переименовав в '''internal.db'''&lt;br /&gt;
&amp;lt;section name=&amp;quot;Commands&amp;quot; class=&amp;quot;server&amp;quot; show=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
cp internal.db internal_original.db&lt;br /&gt;
./sqlite3 internal_original.db .dump | ./sqlite3 internal_repaired.db&lt;br /&gt;
cp internal_repaired.db internal.db&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Чтобы восстановить registry.db:&lt;br /&gt;
**Скопируйте '''registry.db''', переименовав в '''registry_original.db'''&lt;br /&gt;
**Пропишите следующую команду: '''./sqlite3 registry_original.db .dump | ./sqlite3 registry_repaired.db'''&lt;br /&gt;
**Скопируйте '''registry_repaired.db''', переименовав в '''registry.db'''&lt;br /&gt;
&amp;lt;section name=&amp;quot;Commands&amp;quot; class=&amp;quot;server&amp;quot; show=&amp;quot;false&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
cp registry.db registry_original.db&lt;br /&gt;
./sqlite3 registry_original.db .dump | ./sqlite3 registry_repaired.db&lt;br /&gt;
cp registry_repaired.db registry.db&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Поддержка]]&lt;br /&gt;
[[en:How to repair the database files]]&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=RU/%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BD%D1%82%D0%B8%D1%87%D0%B8%D1%82_MTA_%D0%B4%D0%BB%D1%8F_%D1%84%D0%BE%D1%80%D0%BA-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%BE%D0%B2&amp;diff=75733</id>
		<title>RU/Полный античит MTA для форк-проектов</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=RU/%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BD%D1%82%D0%B8%D1%87%D0%B8%D1%82_MTA_%D0%B4%D0%BB%D1%8F_%D1%84%D0%BE%D1%80%D0%BA-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%BE%D0%B2&amp;diff=75733"/>
		<updated>2022-12-19T08:03:08Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ {{Примечание|Информация на этой странице не относится к официальным сборкам MTA.}}&lt;br /&gt;
__NOTOC__ {{Примечание|Это не окончательная версия этой страницы, она будет улучшаться/дополняться/переписываться.}}&lt;br /&gt;
&lt;br /&gt;
Форки MTA, которым недостаточно использовать &amp;quot;обычный netc для форков&amp;quot; (из bdata/netc.dll), как описано на вики-странице [[Forks]], из-за того, что он предлагает очень ограниченную античит-защиту, могут изучить возможности использования нового netc варианта: &amp;quot;полного античита для форков&amp;quot;. Это, однако, имеет свои ограничения, относящиеся к особенностям вашего форк-проекта и реализации, которые нелегко объяснить, но эта страница стремится сделать это как можно точнее.&lt;br /&gt;
&lt;br /&gt;
''Эта операция превратит ваш форк в проект с &amp;quot;надлежащим античитом, основанным на методе исправлений&amp;quot;, как описано в спойлере в этой теме: https://forum.multitheftauto.com/topic/66858-bounty-for-finding-security-flaws-and-working-cheats-in-mta/, а не максимум 15% 'основанным на сигнатурах' античитом, как описано на вики-странице [[Forks]] для обычных форков.''&lt;br /&gt;
&lt;br /&gt;
Основная идея:&lt;br /&gt;
* Модуль netc &amp;quot;с полным античитом для форков&amp;quot; будет предоставлять 95% функций античита, имеющихся в официальных MTA (multitheftauto.com &amp;gt; Кнопка &amp;quot;Download&amp;quot;) сборках.&lt;br /&gt;
* Чем больше несовместимых функций/реализаций (пользовательских изменений) имеет ваш форк-проект, которые '''вы''' можете отключить (добавив их в белый список обнаружения: '''disableac''' массив в '''mtaserver.conf''', как описано на странице [https://wiki.multitheftauto.com/wiki/RU/Anti-cheat_guide#%3Cdisableac%3E%3C/disableac%3E Anti-cheat guide / Руководство по античиту: DISABLEAC]), тем ниже будет указанное число защиты в процентах.&lt;br /&gt;
** '''Например''', если вам нужно отключить 3 различных типа обнаружения (допустим, для российских форков, учитывая загрузку внешних модов вне MTA API/limit adjuster'а, наиболее распространёнными являются: 5, 6, 21), вы получите 85% оставшейся античит-защиты. Хотя это число относительно, так как это даёт разработчикам читов возможность использовать именно эти отключенные категории обнаружения для обеспечения работы их читов/хаков, и эти 3 кода уже предоставляют некоторые конкретные пути для записи в память GTA.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Понимаете, к чему всё это идёт? Ниже в этой статье появится ссылка на &amp;quot;полный античит для форков&amp;quot;, и то, что вы будете делать с ним - это метод проб и ошибок. Попытка интегрировать полную поддержку античита в ваш форк - это вопрос &amp;quot;Мы можем попробовать, и если это сработает, то будет здорово.. если нам придётся отключить некоторые обнаружения, то процент защиты будет выше, чем у обычного античита форков: 15% и это уже огромный выигрыш..&amp;quot; и во многом зависит от меры возможностей. Потому что причина, по которой мы разделили netc форков (из bdata/netc.dll) на тот, в котором отсутствует большинство античит-функций, может быть понятна любому опытному разработчику: netc-модуль (античит) не рассчитан на все типы настроек, которые разработчик форка может добавить в свою кодовую базу, это было сделано в духе предоставления максимальной свободы и гибкости. Тем более, что многие форки имеют не самых лучших разработчиков, не понимающих, почему им лучше следовать рекомендациям MTA (mtasa-blue) по написанию кода, структуре проекта и максимально приближать свои пользовательские реализации так, как это обычно делает участник MTA, прошедший проверку (ревью) кода. Таким образом, здесь происходит отделение 'чистых' изменений от 'грязного моддинга', который также часто встречается в российских форках, '''использующих один или несколько следующих подходов к кодовой базе своего проекта:&lt;br /&gt;
'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Реализация моддинговых GTA: SA проектов внешним 'грязным' способом, как limit adjuster (fastman92 и т.д.)&lt;br /&gt;
* Необработанная (raw) загрузка модифицированных данных GTA: SA &amp;amp; .IMG файлов, через распространение предварительно модифицированных установочных папок GTA среди игроков форк клиента. Тем самым полностью игнорируя MTA API для замены моделей и различных игровых процессов.&lt;br /&gt;
* Различные грязные патчи, в широком смысле описанные в абзаце выше. Также включает в себя несоблюдение рекомендаций MTA по &amp;quot;Raw memory access&amp;quot; (необработанному доступу к памяти), найденных здесь: https://github.com/multitheftauto/mtasa-blue/wiki/Dev-Tips, что является значительным фактором риска для сценариев, не ожидаемых netc.dll (античитом), так как если он защищает от модификаций памяти, зная их происхождение, и вы просто поместите грязный 'writeProcessMemory' или memcpy в случайный .cpp файл, это вызовет нарушение. Это далеко не всё, и это плохой пример, но просто чтобы вы поняли, почему существуют несовместимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Получение максимального % античит-защиты ===&lt;br /&gt;
&lt;br /&gt;
Поняв вышесказанное, а также то, что мы стараемся изо всех сил, так как такое использование в качестве &amp;quot;полного античита&amp;quot; для форков никогда не входило в наши планы, и что было бы трудно поддерживать пользовательские модификации каждого, вы можете понять, что мы не можем помочь вам выяснить, что является несовместимым сразу после того, как вы начнёте тестировать netc &amp;quot;с полным античитом&amp;quot; в своём форке. Поэтому вы сами должны либо отключить столько обнаружений, сколько требуется (если вы не можете их исправить - где 'не можете' является показателем отсутствия инженерного опыта), либо, что ещё лучше, разработать исправления, которые позволят вам избежать отключения слишком многих или любых типов обнаружения, тем самым максимизируя потенциальный % античит-функций.&lt;br /&gt;
&lt;br /&gt;
Это означает, что без поддержки команды MTA вам предстоит выяснить, какие настройки/интеграции/несоблюдения MTA API/примеры проблем, описанные ранее в этой статье.. являются виновниками каждого конкретного типа обнаружения, который отправляет вам кики античита после добавления netc &amp;quot;с полным античитом&amp;quot; в ваш форк для тестирования. Мы советуем вам очистить свои интеграции, чтобы избежать необходимости много копаться вручную/выяснять виновника. Для этого обратите внимание на пункты маркированного списка из предыдущего абзаца. Однако, если же прямой виновник найден, приложив все свои усилия, вы должны без каких-либо указаний со стороны MTA придумать альтернативные (более чистые, более соответствующие рекомендациям MTA по написанию кода, API и структуре проекта.. следовательно, менее вероятно несовместимые с полным античитом и тем, что он ожидает) реализации проблемной настройки, найденной в кодовой базе вашего форка. Вы можете видеть, где возможность использовать 'полный античит для форков' становится скорее благосклонностью, чем данностью, особенно с тем состоянием кодовой базы, в котором многие форки, не начав свою разработку по сценарию 'полного античита', выросли, просто написав то, что работает для них, не учитывая такие аспекты. Общая картина того, почему мы не будем поддерживать процесс реинжиниринга, теперь должна быть ясна. Если вы не можете с этим справиться, либо наймите кого-то с большим опытом в компьютерных науках и инженерии, либо отключите больше типов обнаружения античита, и довольствуйтесь всем, что выше 15% обычного netc для форков, лучше что-то, чем ничего. '''Но мы не сможем протянуть руку помощи.''' Любое непонимание этих концепций указывает на отсутствие полноты разработчика (индивидуальных навыков, возможностей для роста) и не может быть отражено на разработчиках MTA.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= '''Давайте перейдём к делу''' =&lt;br /&gt;
&lt;br /&gt;
Если вы считаете, что поняли все концепции, описанные в этой статье, вы можете приступить к внедрению &amp;quot;полного античита для форков&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''СКАЧАЙТЕ: https://mirror-cdn.multitheftauto.com/bdata/fork-support/netc.dll''' (для использования ''вместо'' &amp;quot;bdata/netc.dll&amp;quot; из стандартного mtasa-blue buildactions/install_data.lua)&lt;br /&gt;
Обратите внимание, что версия netc.dll по указанной выше ссылке будет регулярно обновляться, чтобы предоставить форкам все античит-улучшения, поставляемые также и для официальной MTA. Поэтому рекомендуется регулярно получать обновления для вашего форка для обеспечения оптимальной безопасности &amp;amp; надёжности античита&lt;br /&gt;
&lt;br /&gt;
- Замените netc.dll в вашем форк-проекте на вышеуказанный &amp;quot;поддерживаемый для форков&amp;quot; netc с полным античитом.&lt;br /&gt;
- Убедитесь, что тип сборки в version.h изменён на UNSTABLE, согласно рекомендациям &amp;quot;массового потребления&amp;quot; для форков в комментариях: [https://github.com/multitheftauto/mtasa-blue/blob/master/Shared/sdk/version.h Shared/sdk/version.h]. В противном случае, вы сведёте на нет все усилия по получению полной античит-защиты.&lt;br /&gt;
&lt;br /&gt;
- Убедитесь, что вы обновили кодовую базу вашего форка до активной основной версии (для которой netc.dll), '''мастер'''-коммита mtasa-blue, по крайней мере до версии &amp;quot;Default&amp;quot;, указанной на [https://nightly.mtasa.com/ver/] как &amp;quot;Auto-update default&amp;quot; для последней основной версии, затем сопоставьте указанную ревизию с SHA1-хешем коммита с помощью этого инструмента: https://buildinfo.mtasa.com/index.php - это означает, что не следует использовать начальный выпуск (версию, которая имеет метку выпуска на github), потому что MTA использует модель &amp;quot;MTA как услуга&amp;quot;, где игроки получают регулярные обновления, содержащие все основные изменения для оптимального качества и опыта использования новых функций. Последние выпуски netc.dll основаны на этом и могут требовать присутствия мастер-изменений.&lt;br /&gt;
&lt;br /&gt;
- Столкнитесь с некоторыми киками античита в вашем форк-клиенте, этап проб и ошибок начинается здесь. Теперь используйте предыдущие части этого руководства, чтобы либо отключить типы обнаружения античита с помощью disableac в mtaserver.conf, либо, что ещё лучше, потратьте больше сил разработчиков на правильное исправление &amp;amp; очистку ваших пользовательских реализаций, как советовали ранее, чтобы сохранить как можно больше % античит-защиты. Мы советуем не опускаться ниже 85% (как в примере с 'disableac' кодами: 5, 6, 21 было упомянуто, что это относительно 85% и то, что требуется большинству российских тяжёлых модифицированных форков для немедленного запуска и возможности вам подключиться).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Заключительные слова: всегда будет лучше не быть форком в первую очередь. Используйте официальный клиент MTA и просто создайте сервер, со временем со своим пользовательским лаунчером, который будет подключать непосредственно к вашему ряду серверов. Просто внесите все настройки, которые вам нужны (причина для создания форка), взяв за основу &amp;quot;upstream&amp;quot; и создайте PR, Pull request (пул-реквест), используя официальный репозиторий MTA https://github.com/multitheftauto/mtasa-blue, чтобы все выиграли, а вы соблюдали лицензию &amp;amp; не сталкивались с препятствиями, включая античит и приток новых игроков, которые возникают при создании форка. MTA обычно имеет 30000 игроков онлайн одновременно, что также является огромным притоком новых игроков для открытия своего сообщества. Лучше просто не быть форком, но если вам действительно нужно, эта страница является нашим активным взаимодействием с форками для получения лучшего уровня античит-защиты.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Мы создали этот вариант netc.dll &amp;quot;с полным античитом для форков&amp;quot; в ноябре/декабре 2022 года и опробовали практические результаты и некоторые специфические исправления для лучшей поддержки, с 2 крупнейшими российскими MTA форками, оба из которых готовятся выпустить обновление, включающее это в ближайшие несколько месяцев. Мы также взаимодействовали с разработчиками небольших форков, которые, однако, решили злоупотребить этим (а вместе с этим и нашим доверием), немедленно став токсичными и пытаясь продать netc-модуль &amp;quot;с полным античитом&amp;quot;, который мы им дали, что побудило написать и в спешке опубликовать эту вики-статью. Нехорошо, и, пожалуйста, не ведитесь на предложения от упомянутого круга токсичных разработчиков форков, пытающихся продать вам такой netc &amp;quot;с полным античитом&amp;quot;, когда вы можете получить более новую версию из официального источника, от нас в этой статье. Работа над этой статьёй в контексте упомянутого инцидента обсуждалась в MTA development discord (приглашение: https://discord.gg/GNN6PRtTnu) в этом посте: https://discord.com/channels/801330706252038164/801330706252038170/1044757943071023155 и аналогично в основном, официальном MTA discord (приглашение: https://discord.gg/mtasa) в этом посте: https://discord.com/channels/278474088903606273/278521065435824128/1044758439357849661&lt;br /&gt;
&lt;br /&gt;
[[EN:Forks_Full_AC]]&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=RU/%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BD%D1%82%D0%B8%D1%87%D0%B8%D1%82_MTA_%D0%B4%D0%BB%D1%8F_%D1%84%D0%BE%D1%80%D0%BA-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%BE%D0%B2&amp;diff=75731</id>
		<title>RU/Полный античит MTA для форк-проектов</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=RU/%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_%D0%B0%D0%BD%D1%82%D0%B8%D1%87%D0%B8%D1%82_MTA_%D0%B4%D0%BB%D1%8F_%D1%84%D0%BE%D1%80%D0%BA-%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%BE%D0%B2&amp;diff=75731"/>
		<updated>2022-12-13T18:10:42Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ {{Примечание|Информация на этой странице не относится к официальным сборкам MTA.}}&lt;br /&gt;
__NOTOC__ {{Примечание|Это не окончательная версия этой страницы, она будет улучшаться/дополняться/переписываться.}}&lt;br /&gt;
&lt;br /&gt;
Форки MTA, которым недостаточно использовать &amp;quot;обычный netc для форков&amp;quot; (из bdata/netc.dll), как описано на вики-странице [[Forks]], из-за того, что он предлагает очень ограниченную античит-защиту, могут изучить возможности использования нового netc варианта: &amp;quot;полного античита для форков&amp;quot;. Это, однако, имеет свои ограничения, относящиеся к особенностям вашего форк-проекта и реализации, которые нелегко объяснить, но эта страница стремится сделать это как можно точнее.&lt;br /&gt;
&lt;br /&gt;
''Эта операция превратит ваш форк в проект с &amp;quot;надлежащим античитом, основанным на методе исправлений&amp;quot;, как описано в спойлере в этой теме: https://forum.multitheftauto.com/topic/66858-bounty-for-finding-security-flaws-and-working-cheats-in-mta/, а не максимум 15% 'основанным на сигнатурах' античитом, как описано на вики-странице [[Forks]] для обычных форков.''&lt;br /&gt;
&lt;br /&gt;
Основная идея:&lt;br /&gt;
* Модуль netc &amp;quot;с полным античитом для форков&amp;quot; будет предоставлять 95% функций античита, имеющихся в официальных MTA (multitheftauto.com &amp;gt; Кнопка &amp;quot;Download&amp;quot;) сборках.&lt;br /&gt;
* Чем больше несовместимых функций/реализаций (пользовательских изменений) имеет ваш форк-проект, которые '''вы''' можете отключить (добавив их в белый список обнаружения: '''disableac''' массив в '''mtaserver.conf''', как описано на странице [https://wiki.multitheftauto.com/wiki/RU/Anti-cheat_guide#%3Cdisableac%3E%3C/disableac%3E Anti-cheat guide / Руководство по античиту: DISABLEAC]), тем ниже будет указанное число защиты в процентах.&lt;br /&gt;
** '''Например''', если вам нужно отключить 3 различных типа обнаружения (допустим, для российских форков, учитывая загрузку внешних модов вне MTA API/limit adjuster'а, наиболее распространёнными являются: 5, 6, 21), вы получите 85% оставшейся античит-защиты. Хотя это число относительно, так как это даёт разработчикам читов возможность использовать именно эти отключенные категории обнаружения для обеспечения работы их читов/хаков, и эти 3 кода уже предоставляют некоторые конкретные пути для записи в память GTA.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Понимаете, к чему всё это идёт? Ниже в этой статье появится ссылка на &amp;quot;полный античит для форков&amp;quot;, и то, что вы будете делать с ним - это метод проб и ошибок. Попытка интегрировать полную поддержку античита в ваш форк - это вопрос &amp;quot;Мы можем попробовать, и если это сработает, то будет здорово.. если нам придётся отключить некоторые обнаружения, то процент защиты будет выше, чем у обычного античита форков: 15% и это уже огромный выигрыш..&amp;quot; и во многом зависит от меры возможностей. Потому что причина, по которой мы разделили netc форков (из bdata/netc.dll) на тот, в котором отсутствует большинство античит-функций, может быть понятна любому опытному разработчику: netc-модуль (античит) не рассчитан на все типы настроек, которые разработчик форка может добавить в свою кодовую базу, это было сделано в духе предоставления максимальной свободы и гибкости. Тем более, что многие форки имеют не самых лучших разработчиков, не понимающих, почему им лучше следовать рекомендациям MTA (mtasa-blue) по написанию кода, структуре проекта и согласовывать свои пользовательские дополнения с тем, как это обычно делает участник MTA, прошедший проверку (ревью) кода. Таким образом, здесь происходит отделение 'чистых' изменений от 'грязного моддинга', который также часто встречается в российских форках, '''использующих один или несколько следующих подходов к кодовой базе своего проекта:&lt;br /&gt;
'''&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Реализация моддинговых GTA: SA проектов внешним 'грязным' способом, как limit adjuster (fastman92 и т.д.)&lt;br /&gt;
* Необработанная (raw) загрузка модифицированных данных GTA: SA &amp;amp; .IMG файлов, через распространение предварительно модифицированных установочных папок GTA среди игроков форк клиента. Тем самым полностью игнорируя MTA API для замены моделей и различных игровых процессов.&lt;br /&gt;
* Различные грязные патчи, в широком смысле описанные в абзаце выше. Также включает в себя несоблюдение рекомендаций MTA по &amp;quot;Raw memory access&amp;quot; (необработанному доступу к памяти), найденных здесь: https://github.com/multitheftauto/mtasa-blue/wiki/Dev-Tips, что является значительным фактором риска для сценариев, не ожидаемых netc.dll (античитом), так как если он защищает от модификаций памяти, зная их происхождение, и вы просто поместите грязный 'writeProcessMemory' или memcpy в случайный .cpp файл, это вызовет нарушение. Это далеко не всё, и это плохой пример, но просто чтобы вы поняли, почему существуют несовместимости.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Получение максимального % античит-защиты ===&lt;br /&gt;
&lt;br /&gt;
Поняв вышесказанное, а также то, что мы стараемся изо всех сил, так как такое использование в качестве &amp;quot;полного античита&amp;quot; для форков никогда не входило в наши планы, и что было бы трудно поддерживать пользовательские модификации каждого, вы можете понять, что мы не можем помочь вам выяснить, что является несовместимым сразу после того, как вы начнёте тестировать netc &amp;quot;с полным античитом&amp;quot; в своём форке. Поэтому вы сами должны либо отключить столько обнаружений, сколько требуется (если вы не можете их исправить - где 'не можете' является показателем отсутствия инженерного опыта), либо, что ещё лучше, разработать исправления, которые позволят вам избежать отключения слишком многих или любых типов обнаружения, тем самым максимизируя потенциальный % античит-функций.&lt;br /&gt;
&lt;br /&gt;
Это означает, что без поддержки команды MTA вам предстоит выяснить, какие настройки/интеграции/несоблюдения MTA API/примеры проблем, описанные ранее в этой статье.. являются виновниками каждого конкретного типа обнаружения, который отправляет вам кики античита после добавления netc &amp;quot;с полным античитом&amp;quot; в ваш форк для тестирования. Мы советуем вам очистить свои интеграции, чтобы избежать необходимости много копаться вручную/выяснять виновника. Для этого обратите внимание на пункты маркированного списка из предыдущего абзаца. Однако, если же прямой виновник найден, приложив все свои усилия, вы должны без каких-либо указаний со стороны MTA придумать альтернативные (более чистые, более соответствующие рекомендациям MTA по написанию кода, API и структуре проекта.. следовательно, менее вероятно несовместимые с полным античитом и тем, что он ожидает) реализации проблемной настройки, найденной в кодовой базе вашего форка. Вы можете видеть, где возможность использовать 'полный античит для форков' становится скорее благосклонностью, чем данностью, особенно с тем состоянием кодовой базы, в котором многие форки, не начав свою разработку по сценарию 'полного античита', выросли, просто написав то, что работает для них, не учитывая такие аспекты. Общая картина того, почему мы не будем поддерживать процесс реинжиниринга, теперь должна быть ясна. Если вы не можете с этим справиться, либо наймите кого-то с большим опытом в компьютерных науках и инженерии, либо отключите больше типов обнаружения античита, и довольствуйтесь всем, что выше 15% обычного netc для форков, лучше что-то, чем ничего. '''Но мы не сможем протянуть руку помощи.''' Любое непонимание этих концепций указывает на отсутствие полноты разработчика (индивидуальных навыков, возможностей для роста) и не может быть отражено на разработчиках MTA.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= '''Давайте перейдём к делу''' =&lt;br /&gt;
&lt;br /&gt;
Если вы считаете, что поняли все концепции, описанные в этой статье, вы можете приступить к внедрению &amp;quot;полного античита для форков&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
'''СКАЧАЙТЕ: https://mirror-cdn.multitheftauto.com/bdata/fork-support/netc.dll''' (для использования ''вместо'' &amp;quot;bdata/netc.dll&amp;quot; из стандартного mtasa-blue buildactions/install_data.lua)&lt;br /&gt;
Обратите внимание, что версия netc.dll по указанной выше ссылке будет регулярно обновляться, чтобы предоставить форкам все античит-улучшения, поставляемыми также и для официальной MTA. Поэтому рекомендуется регулярно получать обновления для вашего форка для обеспечения оптимальной безопасности &amp;amp; надёжности античита&lt;br /&gt;
&lt;br /&gt;
- Замените netc.dll в вашем форк-проекте на вышеуказанный &amp;quot;поддерживаемый для форков&amp;quot; netc с полным античитом.&lt;br /&gt;
- Убедитесь, что тип сборки в version.h изменён на UNSTABLE, согласно рекомендациям &amp;quot;массового потребления&amp;quot; для форков в комментариях: [https://github.com/multitheftauto/mtasa-blue/blob/master/Shared/sdk/version.h Shared/sdk/version.h]. В противном случае, вы сведёте на нет все усилия по получению полной античит-защиты.&lt;br /&gt;
&lt;br /&gt;
- Убедитесь, что вы обновили кодовую базу вашего форка до активной основной версии (для которой netc.dll), '''мастер'''-коммита mtasa-blue, по крайней мере до версии &amp;quot;Default&amp;quot;, указанной на [https://nightly.mtasa.com/ver/] как &amp;quot;Auto-update default&amp;quot; для последней основной версии, затем сопоставьте указанную ревизию с SHA1-хешем коммита с помощью этого инструмента: https://buildinfo.mtasa.com/index.php - это означает, что не следует использовать начальный выпуск (версию, которая имеет метку выпуска на github), потому что MTA использует модель &amp;quot;MTA как услуга&amp;quot;, где игроки получают регулярные обновления, содержащие все основные изменения для оптимального качества и опыта использования новых функций. Последние выпуски netc.dll основаны на этом и могут требовать присутствия мастер-изменений.&lt;br /&gt;
&lt;br /&gt;
- Столкнитесь с некоторыми киками античита в вашем форк-клиенте, этап проб и ошибок начинается здесь. Теперь используйте предыдущие части этого руководства, чтобы либо отключить типы обнаружения античита с помощью disableac в mtaserver.conf, либо, что ещё лучше, потратьте больше сил разработчиков на правильное исправление &amp;amp; очистку ваших пользовательских реализаций, как советовали ранее, чтобы сохранить как можно больше % античит-защиты. Мы советуем не опускаться ниже 85% (как в примере с 'disableac' кодами: 5, 6, 21 было упомянуто, что это относительно 85% и то, что требуется большинству российских тяжёлых модифицированных форков для немедленного запуска и возможности вам подключиться).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Заключительные слова: всегда будет лучше не быть форком в первую очередь. Используйте официальный клиент MTA и просто создайте сервер, со временем со своим пользовательским лаунчером, который будет подключать непосредственно к вашему ряду серверов. Просто внесите все настройки, которые вам нужны (причина для создания форка), взяв за основу &amp;quot;upstream&amp;quot; и создайте PR, Pull request (пул-реквест), используя официальный репозиторий MTA https://github.com/multitheftauto/mtasa-blue, чтобы все выиграли, а вы соблюдали лицензию &amp;amp; не сталкивались с препятствиями, включая античит и приток новых игроков, которые возникают при создании форка. MTA обычно имеет 30000 игроков онлайн одновременно, что также является огромным притоком новых игроков для открытия своего сообщества. Лучше просто не быть форком, но если вам действительно нужно, эта страница является нашим активным взаимодействием с форками для получения лучшего уровня античит-защиты.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Мы создали этот вариант netc.dll &amp;quot;с полным античитом для форков&amp;quot; в ноябре/декабре 2022 года и опробовали практические результаты и некоторые специфические исправления для лучшей поддержки, с 2 крупнейшими российскими MTA форками, оба из которых готовятся выпустить обновление, включающее это в ближайшие несколько месяцев. Мы также взаимодействовали с разработчиками небольших форков, которые, однако, решили злоупотребить этим (а вместе с этим и нашим доверием), немедленно став токсичными и пытаясь продать netc-модуль &amp;quot;с полным античитом&amp;quot;, который мы им дали, что побудило написать и в спешке опубликовать эту вики-статью. Нехорошо, и, пожалуйста, не ведитесь на предложения от упомянутого круга токсичных разработчиков форков, пытающихся продать вам такой netc &amp;quot;с полным античитом&amp;quot;, когда вы можете получить более новую версию из официального источника, от нас в этой статье. Работа над этой статьёй в контексте упомянутого инцидента обсуждалась в MTA development discord (приглашение: https://discord.gg/GNN6PRtTnu) в этом посте: https://discord.com/channels/801330706252038164/801330706252038170/1044757943071023155 и аналогично в основном, официальном MTA discord (приглашение: https://discord.gg/mtasa) в этом посте: https://discord.com/channels/278474088903606273/278521065435824128/1044758439357849661&lt;br /&gt;
&lt;br /&gt;
[[EN:Forks_Full_AC]]&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=FileGetPath&amp;diff=74695</id>
		<title>FileGetPath</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=FileGetPath&amp;diff=74695"/>
		<updated>2022-05-31T21:20:53Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: Add OOP syntax&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Server client function}}&lt;br /&gt;
{{New feature/item|3.0153|1.5.3|7446|&lt;br /&gt;
This function retrieves the path of the given file.&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;
string fileGetPath ( file theFile )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{OOP||[[file]]:getPath|path}}&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
*'''theFile:''' The file you want to get the path.&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns a ''string'' representing the file path, ''false'' if invalid file was provided.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Server Example 1&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;
local newFile = fileCreate(&amp;quot;test.txt&amp;quot;)                -- attempt to create a new file&lt;br /&gt;
if (newFile) then                                       -- check if the creation succeeded&lt;br /&gt;
    local path = fileGetPath(newFile)&lt;br /&gt;
    outputChatBox(&amp;quot;New file created at: &amp;quot;..path, root, 0, 255, 0)&lt;br /&gt;
    fileClose(newFile)                                -- close the file once you're done with it&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{File functions}}&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetChatboxLayout&amp;diff=74462</id>
		<title>GetChatboxLayout</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetChatboxLayout&amp;diff=74462"/>
		<updated>2022-04-12T19:15:23Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: Add 'chat_text_outline'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Client function}}&lt;br /&gt;
Returns information about how the chatbox looks.&lt;br /&gt;
&lt;br /&gt;
These values come from the file called: [[Chatboxpresets.xml]] but it depends on what type of preset you currently have, which is chosen from your settings in the 'Interface' tab.&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;bool|int|table getChatboxLayout ( [ string CVar ] )&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Optional Arguments===&lt;br /&gt;
*'''CVar:''' the name of the property you want returned. Can be the following values:&lt;br /&gt;
**'''chat_font''' - Returns the chatbox font&lt;br /&gt;
**'''chat_lines''' - Returns how many lines the chatbox has&lt;br /&gt;
**'''chat_color''' - Returns the background color of the chatbox&lt;br /&gt;
**'''chat_text_color''' - Returns the chatbox text color&lt;br /&gt;
**'''chat_input_color''' - Returns the background color of the chatbox input&lt;br /&gt;
**'''chat_input_prefix_color''' - Returns the color of the input prefix text&lt;br /&gt;
**'''chat_input_text_color''' - Returns the color of the text in the chatbox input&lt;br /&gt;
**'''chat_scale''' - Returns the scale of the text in the chatbox&lt;br /&gt;
**'''chat_position_offset_x''' - Returns the x position offset setting&lt;br /&gt;
**'''chat_position_offset_y''' - Returns the y position offset setting&lt;br /&gt;
**'''chat_position_horizontal''' - Returns the horizontal alignment setting&lt;br /&gt;
**'''chat_position_vertical''' - Returns the vertical alignment setting&lt;br /&gt;
**'''chat_text_alignment''' - Returns the text alignment setting&lt;br /&gt;
**'''chat_width''' - Returns the scale of the background width&lt;br /&gt;
**'''chat_css_style_text''' - Returns whether text fades out over time&lt;br /&gt;
**'''chat_css_style_background''' - Returns whether the background fades out over time&lt;br /&gt;
**'''chat_line_life''' - Returns how long it takes for text to start fading out&lt;br /&gt;
**'''chat_line_fade_out''' - Returns how long takes for text to fade out&lt;br /&gt;
**'''chat_use_cegui''' - Returns whether CEGUI is used to render the chatbox&lt;br /&gt;
**'''text_scale''' - Returns text scale&lt;br /&gt;
**{{Added feature/item|1.6.0|1.5.9|21160|'''chat_text_outline''' - Returns whether text black/white outline is used}}&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
*4 numbers if the CVar contains &amp;quot;color&amp;quot;&lt;br /&gt;
*2 numbers if '''chat_scale''' was entered&lt;br /&gt;
*1 number if any other CVar was specified&lt;br /&gt;
*a table of all CVar values, if CVar was not specified&lt;br /&gt;
*''false'' if an invalid CVar was specified&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
This code makes the chatbox empty when you type /clear &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot; category=&amp;quot;client&amp;quot;&amp;gt;&lt;br /&gt;
addCommandHandler(&amp;quot;clear&amp;quot;,&lt;br /&gt;
    function ()&lt;br /&gt;
        local lines = getChatboxLayout()[&amp;quot;chat_lines&amp;quot;]&lt;br /&gt;
        for i = 1, lines do&lt;br /&gt;
            outputChatBox(&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;
This code makes the chatbox empty when you type /clear, but with a cleaner code &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;  category=&amp;quot;client&amp;quot;&amp;gt;&lt;br /&gt;
addCommandHandler(&amp;quot;clear&amp;quot;,&lt;br /&gt;
    function ()&lt;br /&gt;
        outputChatbox(('\n'):rep(getChatboxLayout(&amp;quot;chat_lines&amp;quot;)));&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;
{{GUI_functions}}&lt;br /&gt;
{{GUI_events}}&lt;br /&gt;
&lt;br /&gt;
[[en:getChatboxLayout]]&lt;br /&gt;
[[ru:getChatboxLayout]]&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=RU/Places_To_Chat&amp;diff=73844</id>
		<title>RU/Places To Chat</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=RU/Places_To_Chat&amp;diff=73844"/>
		<updated>2022-01-23T23:29:35Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Есть масса способов пообщаться с другими игроками MTA. Вне зависимости от того, хотите ли вы обсудить ваши игровые тактики, устроить клановые матчи или даже вступить в клан, всегда есть куда пойти.&lt;br /&gt;
Конечно, с некоторыми людьми вы можете пообщаться во время игры через внутриигровой чат. Но есть много мест, которые часто посещает значительная часть MTA сообщества. Некоторые из них описаны ниже.&lt;br /&gt;
&lt;br /&gt;
== Форум ==&lt;br /&gt;
Первым местом, на которое вы скорее всего наткнётесь, будет официальный форум MTA сообщества. Его можно найти по адресу [https://forum.mtasa.com https://forum.mtasa.com]. Вы можете свободно просматривать и читать, что говорят другие люди, но чтобы изложить свою точку зрения и начать собственные обсуждения, вам понадобится зарегистрироваться на форуме. Это бесплатно и делается посредством нажатия кнопки Sign Up в верхней части страницы.&lt;br /&gt;
&lt;br /&gt;
Форум разделён на ряд категорий и подфорумов. Они упорядочивают все темы, и перед созданием своей собственной темы вам следует убедиться, что вы находитесь в правильном подфоруме. Кроме того, прежде чем писать какие-либо сообщения, удостоверьтесь, что вы прочитали [https://forum.mtasa.com/topic/12275-forum-rules/ правила].&lt;br /&gt;
&lt;br /&gt;
Для русскоязычных пользователей имеется свой собственный [https://forum.mtasa.com/forum/100-russian-русский/ раздел].&lt;br /&gt;
&lt;br /&gt;
== Discord ==&lt;br /&gt;
Для получения моментального ответа на что-либо вами сказанное лучше всего подойдёт Discord. По сравнению с IRC, он предлагает встроенную историю чатов, так что даже если вы не в сети, вы всё равно сможете узнать, что произошло в каналах. IRC также предлагает это, но только через IRC Bouncer, за который вам нужно либо заплатить, либо попросить кого-то разместить его для вас.&lt;br /&gt;
Он также имеет современный внешний вид и такие возможности, как встраивание ссылок (обычные веб-сайты, а также изображения и видео), удобная подсветка синтаксиса для вставленных фрагментов кода, эмодзи (также пользовательские), реакции на сообщения в чате, [https://store.steampowered.com/about/ Steam] интеграцию и многое другое.&lt;br /&gt;
В настоящее время у нас есть некоторые каналы, такие как:&lt;br /&gt;
#general - для общения по MTA и оффтопа&lt;br /&gt;
#ru-основной - для общения на русском языке&lt;br /&gt;
#scripting-help - для вопросов, связанных с Lua скриптами&lt;br /&gt;
#help-support - для любых проблем, связанных с MTA:SA клиентом или сервером&lt;br /&gt;
#announcements - для всех важных сообщений от нас&lt;br /&gt;
...и многие другие.&lt;br /&gt;
Ссылка на приглашение [https://discord.com/invite/mtasa здесь]. Всё, что вам нужно, это учётная запись [https://discordapp.com/ Discord]. Вы можете использовать Discord через веб-браузер или загрузить клиент.&lt;br /&gt;
Вы можете найти официальное сообщение на форуме [https://forum.mtasa.com/topic/95226-multi-theft-autos-official-discord-server/ здесь].&lt;br /&gt;
&lt;br /&gt;
=== Помощь по скриптингу ===&lt;br /&gt;
Существуют Discord каналы для помощи с MTA скриптингом. Вы можете найти их в категории MTA:SA Help на нашем Discord.&lt;br /&gt;
&lt;br /&gt;
==== Как получить помощь ====&lt;br /&gt;
* Попробуйте найти ответ на свой вопрос на [[Главная страница|главной странице]], особое внимание на два верхних блока&lt;br /&gt;
* Задайте свой вопрос один раз и повторите его только через разумное количество времени, сделав скидку на занятость канала и людей (например, через 10 минут). НЕ через 10 секунд.&lt;br /&gt;
* Вопрос, как минимум, должен содержать:&lt;br /&gt;
** Что вы пытаетесь сделать.&lt;br /&gt;
** Что вы уже смогли сделать.&lt;br /&gt;
** Что конкретно не работает, является проблемой. Какие возникают ошибки.&lt;br /&gt;
** Возможно, отрывок кода с пояснениями, загруженный на [https://pastebin.mtasa.com pastebin.mtasa.com] или [https://support.discord.com/hc/ru/articles/210298617-Разметка-текста-101-Форматирование-в-чате-Жирный-Курсив-Подчеркнутый- блок кода] для Discord. (''отрывок кода подразумевает относящуюся к делу часть, а НЕ весь скрипт'')&lt;br /&gt;
&lt;br /&gt;
== IRC (Internet Relay Chat) ==&lt;br /&gt;
Несмотря на то, что в наши дни IRC используют не так много людей (по сравнению со старыми временами), IRC - сеть чатов, подобная любым другим чат-комнатам, которые можно найти в интернете. Лучший IRC-клиент для Windows - это mIRC, который можно найти [http://www.mirc.com здесь]. Скачайте, установите, настройте, и вы будете готовы. Язык - английский, но существует некоторая вероятность того, что в канале будут и русскоязычные пользователи.&lt;br /&gt;
Нужная вам для подключения информация:&amp;lt;br&amp;gt;&lt;br /&gt;
'''Server (сервер) -''' [irc://irc.gtanet.com/mta irc.gtanet.com/mta]&amp;lt;br&amp;gt;&lt;br /&gt;
'''Port (порт) -''' 6667&amp;lt;br&amp;gt;&lt;br /&gt;
Как только вы подключились и получили MOTD (message of the day, &amp;quot;сообщение дня&amp;quot;), чтобы присоединиться к дискуссии MTA, введите /join #mta&lt;br /&gt;
Это перенесёт вас в ''канал'' MTA, который в других чат-сетях назывался бы комнатой.&lt;br /&gt;
Если вы затрудняетесь, обязательно прочитайте справочные файлы mIRC.&lt;br /&gt;
Для получения более детальной помощи по командам сервера, перейдите в окно, которое первым появилось при подключении, и введите /helpop для получения списка категорий помощи.&lt;br /&gt;
&lt;br /&gt;
== Другое ==&lt;br /&gt;
Это не все места/способы общения с другими членами MTA сообщества. Имеется много форумов, отличных от официального MTA, например, [http://www.gtaforums.com GTAForums], являющийся наиболее популярным неофициальным форумом GTA сообщества. Хоть там обсуждают и не только MTA, но игра по сети является довольно популярной темой общения.&lt;br /&gt;
&lt;br /&gt;
Пожалуйста, не стесняйтесь редактировать эту страницу, если вам есть, что добавить.&lt;br /&gt;
&lt;br /&gt;
[[en:Places To Chat]]&lt;br /&gt;
[[uk:Places To Chat]]&lt;br /&gt;
[[es:Places_To_Chat_ES]]&lt;br /&gt;
[[hu:Places To Chat]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Поддержка]]&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=Undocumented_Items&amp;diff=72443</id>
		<title>Undocumented Items</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=Undocumented_Items&amp;diff=72443"/>
		<updated>2021-09-23T04:34:59Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: Remove documented pages&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page lists all MTA SA functions and events which don't have the necessary documentation for scripters to allow them to use the functions or events. Documenting these will require looking through the source code, which is available in the [https://github.com/multitheftauto/mtasa-blue MTA SA GitHub repository], to get the necessary parameters.&lt;br /&gt;
__NOTOC__&lt;br /&gt;
== Client functions that need documenting ==&lt;br /&gt;
(None)&lt;br /&gt;
&lt;br /&gt;
== Server functions that need documenting ==&lt;br /&gt;
(None)&lt;br /&gt;
&lt;br /&gt;
== Client events that need documenting ==&lt;br /&gt;
(None)&lt;br /&gt;
&lt;br /&gt;
== Server events that need documenting ==&lt;br /&gt;
(None)&lt;br /&gt;
&lt;br /&gt;
== Other undocumented pages ==&lt;br /&gt;
(None)&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=Template:Client_player_functions&amp;diff=72045</id>
		<title>Template:Client player functions</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=Template:Client_player_functions&amp;diff=72045"/>
		<updated>2021-09-11T16:24:17Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: Add getPlayerMapOpacity&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[forcePlayerMap]]&lt;br /&gt;
* [[getLocalPlayer]]&lt;br /&gt;
* [[getPlayerBlurLevel]]&lt;br /&gt;
* [[getPlayerFromName]]&lt;br /&gt;
* [[getPlayerMapBoundingBox]]&lt;br /&gt;
{{New items|3.0159|1.5.8|&lt;br /&gt;
* [[getPlayerMapOpacity]]&lt;br /&gt;
|20945}}&lt;br /&gt;
* [[getPlayerMoney]]&lt;br /&gt;
* [[getPlayerName]]&lt;br /&gt;
* [[getPlayerNametagColor]]&lt;br /&gt;
* [[getPlayerNametagText]]&lt;br /&gt;
* [[getPlayerPing]]&lt;br /&gt;
&amp;lt;!--* [[getPlayerSerial]]--&amp;gt;&lt;br /&gt;
* [[getPlayerTeam]]&lt;br /&gt;
* [[getPlayerWantedLevel]]&lt;br /&gt;
* [[givePlayerMoney]]&lt;br /&gt;
* [[isPlayerHudComponentVisible]]&lt;br /&gt;
* [[isPlayerMapForced]]&lt;br /&gt;
* [[isPlayerMapVisible]]&lt;br /&gt;
* [[isPlayerNametagShowing]]&lt;br /&gt;
* [[isVoiceEnabled]]&lt;br /&gt;
{{New items|3.0158|1.5.7|&lt;br /&gt;
* [[resetBlurLevel]]&lt;br /&gt;
|20450}}&lt;br /&gt;
* [[setPlayerBlurLevel]]&lt;br /&gt;
* [[setPlayerHudComponentVisible]]&lt;br /&gt;
* [[setPlayerMoney]]&lt;br /&gt;
* [[setPlayerNametagColor]]&lt;br /&gt;
* [[setPlayerNametagShowing]]&lt;br /&gt;
* [[setPlayerNametagText]]&lt;br /&gt;
* [[takePlayerMoney]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Functions templates]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetPlayerMapOpacity&amp;diff=72044</id>
		<title>GetPlayerMapOpacity</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetPlayerMapOpacity&amp;diff=72044"/>
		<updated>2021-09-11T16:23:54Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: Created page with &amp;quot;__NOTOC__ {{Client function}} {{New feature/item|3.0159|1.5.8|20945|This function allows to get the opacity of the radar map (F11).}}  ==Syntax== &amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{New feature/item|3.0159|1.5.8|20945|This function allows to get the opacity of the radar map (F11).}}&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 getPlayerMapOpacity ( )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{OOP||[[Player]].getMapOpacity}}&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns an [[integer]] value from 0 to 255, where 0 is fully transparent and 255 is fully opaque.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
{{Example}}&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
{{Requirements|n/a|1.5.8-9.20945}}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Client_player_functions}}&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=Undocumented_Items&amp;diff=71859</id>
		<title>Undocumented Items</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=Undocumented_Items&amp;diff=71859"/>
		<updated>2021-08-18T10:21:30Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page lists all MTA SA functions and events which don't have the necessary documentation for scripters to allow them to use the functions or events. Documenting these will require looking through the source code, which is available in the [https://github.com/multitheftauto/mtasa-blue MTA SA GitHub repository], to get the necessary parameters.&lt;br /&gt;
__NOTOC__&lt;br /&gt;
== Client functions that need documenting ==&lt;br /&gt;
*[[engineStreamingFreeUpMemory]]&lt;br /&gt;
*[[engineStreamingGetUsedMemory]]&lt;br /&gt;
*[[isChatInputBlocked]]&lt;br /&gt;
*[[isShowCollisionsEnabled]]&lt;br /&gt;
*[[showSound]]&lt;br /&gt;
*[[isShowSoundEnabled]]&lt;br /&gt;
&lt;br /&gt;
== Server functions that need documenting ==&lt;br /&gt;
(None)&lt;br /&gt;
&lt;br /&gt;
== Client events that need documenting ==&lt;br /&gt;
(None)&lt;br /&gt;
&lt;br /&gt;
== Server events that need documenting ==&lt;br /&gt;
(None)&lt;br /&gt;
&lt;br /&gt;
== Other undocumented pages ==&lt;br /&gt;
(None)&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=Template:Client_output_functions&amp;diff=71858</id>
		<title>Template:Client output functions</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=Template:Client_output_functions&amp;diff=71858"/>
		<updated>2021-08-18T10:18:53Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: Add clearDebugBox&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{New items|3.0156|1.5.5|&lt;br /&gt;
* [[clearChatBox]]&lt;br /&gt;
|14165}}&lt;br /&gt;
{{New items|3.0159|1.5.8|&lt;br /&gt;
* [[clearDebugBox]]&lt;br /&gt;
|20854}}&lt;br /&gt;
* [[isChatVisible]]&lt;br /&gt;
* [[outputChatBox]]&lt;br /&gt;
* [[outputConsole]]&lt;br /&gt;
* [[outputDebugString]]&lt;br /&gt;
* [[showChat]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Functions templates]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=ClearDebugBox&amp;diff=71857</id>
		<title>ClearDebugBox</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=ClearDebugBox&amp;diff=71857"/>
		<updated>2021-08-18T10:18:23Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: Created page with &amp;quot;__NOTOC__ {{Client function}} {{New feature/item|3.0159|1.5.8|20854|This function clears the debug box.}}  ==Syntax== &amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt; bool clearDebugBox ( ) &amp;lt;/syn...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{New feature/item|3.0159|1.5.8|20854|This function clears the debug box.}}&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 clearDebugBox ( )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Always returns ''true''.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
This example clears the debug window when any new debug message is displayed.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
addEventHandler ( &amp;quot;onClientDebugMessage&amp;quot;, root,&lt;br /&gt;
	function ( )&lt;br /&gt;
		clearDebugBox ( )&lt;br /&gt;
	end&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
{{Requirements|n/a|1.5.8-9.20854|}}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Client_output_functions}}&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=Undocumented_Items&amp;diff=71656</id>
		<title>Undocumented Items</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=Undocumented_Items&amp;diff=71656"/>
		<updated>2021-08-12T18:42:59Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: New functions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page lists all MTA SA functions and events which don't have the necessary documentation for scripters to allow them to use the functions or events. Documenting these will require looking through the source code, which is available in the [https://github.com/multitheftauto/mtasa-blue MTA SA GitHub repository], to get the necessary parameters.&lt;br /&gt;
__NOTOC__&lt;br /&gt;
== Client functions that need documenting ==&lt;br /&gt;
*[[engineStreamingFreeUpMemory]]&lt;br /&gt;
*[[engineStreamingGetUsedMemory]]&lt;br /&gt;
*[[clearDebugBox]]&lt;br /&gt;
*[[isShowCollisionsEnabled]]&lt;br /&gt;
*[[showSound]]&lt;br /&gt;
*[[isShowSoundEnabled]]&lt;br /&gt;
&lt;br /&gt;
== Server functions that need documenting ==&lt;br /&gt;
(None)&lt;br /&gt;
&lt;br /&gt;
== Client events that need documenting ==&lt;br /&gt;
(None)&lt;br /&gt;
&lt;br /&gt;
== Server events that need documenting ==&lt;br /&gt;
(None)&lt;br /&gt;
&lt;br /&gt;
== Other undocumented pages ==&lt;br /&gt;
(None)&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=DxGetStatus&amp;diff=71575</id>
		<title>DxGetStatus</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=DxGetStatus&amp;diff=71575"/>
		<updated>2021-08-06T14:22:21Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Client function}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
This function gets information about various internal datum&lt;br /&gt;
&lt;br /&gt;
==Syntax== &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
table dxGetStatus ( )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns a table with the following entries:&lt;br /&gt;
*'''TestMode:''' The current dx test mode. See [[dxSetTestMode]].&lt;br /&gt;
*'''VideoCardName:''' The name of the graphics card.&lt;br /&gt;
*'''VideoCardRAM:''' The installed memory in MB of the graphics card.&lt;br /&gt;
*'''VideoCardPSVersion:''' The maximum pixel shader version of the graphics card.&lt;br /&gt;
*'''VideoCardMaxAnisotropy:''' The maximum anisotropic filtering available. (0-4 which respectively mean: off,2x,4x,8x,16x)&lt;br /&gt;
*'''VideoCardNumRenderTargets:''' The maximum number of simultaneous render targets a shader can use.&lt;br /&gt;
*'''VideoMemoryFreeForMTA:''' The amount of memory in MB available for MTA to use. '''When this gets to zero, [[guiCreateFont]], [[dxCreateFont]] and [[dxCreateRenderTarget]] will fail.'''&lt;br /&gt;
*'''VideoMemoryUsedByFonts:''' The amount of graphic memory in MB used by custom fonts.&lt;br /&gt;
*'''VideoMemoryUsedByTextures:''' The amount of graphic memory in MB used by textures.&lt;br /&gt;
*'''VideoMemoryUsedByRenderTargets:''' The amount of graphic memory in MB used by render targets.&lt;br /&gt;
*'''SettingWindowed:''' The windowed setting. (true/false)&lt;br /&gt;
*'''SettingFullScreenStyle:''' Display style when in full screen mode. (0-2 which respectively mean: Standard, Borderless window, Borderless keep res)&lt;br /&gt;
*'''SettingFXQuality:''' The FX Quality. (0-3)&lt;br /&gt;
*'''SettingDrawDistance:''' The draw distance setting. (0-100)&lt;br /&gt;
*'''SettingVolumetricShadows:''' The volumetric shadows setting. (true/false)&lt;br /&gt;
*'''SettingStreamingVideoMemoryForGTA:''' The usable graphics memory setting. (64-256)&lt;br /&gt;
*'''SettingAnisotropicFiltering:''' The anisotropic filtering setting. (0-4 which respectively mean: off,2x,4x,8x,16x)&lt;br /&gt;
*'''SettingAntiAliasing:''' The anti-aliasing setting. (0-3 which respectively mean: off,1x,2x,3x)&lt;br /&gt;
*'''SettingHeatHaze:''' The heat haze setting. (true/false)&lt;br /&gt;
*'''SettingGrassEffect:''' The grass effect setting. (true/false)&lt;br /&gt;
*'''Setting32BitColor:''' The color depth of the screen. (false is 16bit, true is 32bit)&lt;br /&gt;
*'''SettingHUDMatchAspectRatio:''' The hud match aspect ratio setting. (true/false)&lt;br /&gt;
*'''SettingAspectRatio:''' The aspect ratio setting. (&amp;quot;auto&amp;quot;, &amp;quot;4:3&amp;quot;, &amp;quot;16:10&amp;quot;, &amp;quot;16:9&amp;quot;)&lt;br /&gt;
*'''SettingFOV:''' The FOV setting.&lt;br /&gt;
*'''SettingHighDetailVehicles:''' High detail vehicles setting. (true/false)&lt;br /&gt;
{{New feature/item|3.0159|1.5.8|20508|&lt;br /&gt;
*'''SettingHighDetailPeds:''' High detail peds setting. (true/false)&lt;br /&gt;
}}&lt;br /&gt;
*'''AllowScreenUpload:''' The allows screen uploads setting. (true/false)&lt;br /&gt;
*'''DepthBufferFormat:''' The format of the shader readable depth buffer, or 'unknown' if not available.&lt;br /&gt;
{{New feature/item|3.0159|1.5.8|20901|&lt;br /&gt;
*'''TotalPhysicalMemory:''' The amount of total physical memory in MB.&lt;br /&gt;
}}&lt;br /&gt;
*'''UsingDepthBuffer:''' ''true'' if the depth buffer is used, ''false'' otherwise.&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
addCommandHandler( &amp;quot;getinfo&amp;quot;,&lt;br /&gt;
	function( )&lt;br /&gt;
		local info = dxGetStatus( )&lt;br /&gt;
		for k, v in pairs( info ) do&lt;br /&gt;
			outputChatBox( k .. &amp;quot; : &amp;quot; .. tostring( v ) )&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;
==Changelog==&lt;br /&gt;
{{ChangelogHeader}}&lt;br /&gt;
{{ChangelogItem|1.3.0-9.04715|Added DepthBufferFormat argument}}&lt;br /&gt;
{{ChangelogItem|1.3.0-9.04811|Added VideoCardMaxAnisotropy, SettingAnisotropicFiltering, SettingAntiAliasing,&amp;lt;br/&amp;gt; SettingHeatHaze, SettingGrassEffect and Setting32BitColor arguments}}&lt;br /&gt;
{{ChangelogItem|1.3.4-9.05731|Added SettingHUDMatchAspectRatio and SettingAspectRatio}}&lt;br /&gt;
{{ChangelogItem|1.4.1-9.07181|Added SettingFOV}}&lt;br /&gt;
{{ChangelogItem|1.4.1-9.07310|Added VideoCardNumRenderTargets}}&lt;br /&gt;
{{ChangelogItem|1.5.2-9.07816|Added UsingDepthBuffer}}&lt;br /&gt;
{{ChangelogItem|1.5.3-9.11199|Added SettingHighDetailVehicles}}&lt;br /&gt;
{{ChangelogItem|1.5.5-9.11814|Added SettingFullScreenStyle&amp;lt;br/&amp;gt;Fixed SettingWindowed}}&lt;br /&gt;
{{ChangelogItem|1.5.8-9.20508|Added SettingHighDetailPeds}}&lt;br /&gt;
{{ChangelogItem|1.5.8-9.20901|Added TotalPhysicalMemory}}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Drawing_functions}}&lt;br /&gt;
&lt;br /&gt;
[[hu:dxGetStatus]]&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=DxGetStatus&amp;diff=71574</id>
		<title>DxGetStatus</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=DxGetStatus&amp;diff=71574"/>
		<updated>2021-08-06T14:20:41Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: Add 'TotalPhysicalMemory'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Client function}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
This function gets information about various internal datum&lt;br /&gt;
&lt;br /&gt;
==Syntax== &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
table dxGetStatus ( )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns a table with the following entries:&lt;br /&gt;
*'''TestMode:''' The current dx test mode. See [[dxSetTestMode]].&lt;br /&gt;
*'''VideoCardName:''' The name of the graphics card.&lt;br /&gt;
*'''VideoCardRAM:''' The installed memory in MB of the graphics card.&lt;br /&gt;
*'''VideoCardPSVersion:''' The maximum pixel shader version of the graphics card.&lt;br /&gt;
*'''VideoCardMaxAnisotropy:''' The maximum anisotropic filtering available. (0-4 which respectively mean: off,2x,4x,8x,16x)&lt;br /&gt;
*'''VideoCardNumRenderTargets:''' The maximum number of simultaneous render targets a shader can use.&lt;br /&gt;
*'''VideoMemoryFreeForMTA:''' The amount of memory in MB available for MTA to use. '''When this gets to zero, [[guiCreateFont]], [[dxCreateFont]] and [[dxCreateRenderTarget]] will fail.'''&lt;br /&gt;
*'''VideoMemoryUsedByFonts:''' The amount of graphic memory in MB used by custom fonts.&lt;br /&gt;
*'''VideoMemoryUsedByTextures:''' The amount of graphic memory in MB used by textures.&lt;br /&gt;
*'''VideoMemoryUsedByRenderTargets:''' The amount of graphic memory in MB used by render targets.&lt;br /&gt;
*'''SettingWindowed:''' The windowed setting. (true/false)&lt;br /&gt;
*'''SettingFullScreenStyle:''' Display style when in full screen mode. (0-2 which respectively mean: Standard, Borderless window, Borderless keep res)&lt;br /&gt;
*'''SettingFXQuality:''' The FX Quality. (0-3)&lt;br /&gt;
*'''SettingDrawDistance:''' The draw distance setting. (0-100)&lt;br /&gt;
*'''SettingVolumetricShadows:''' The volumetric shadows setting. (true/false)&lt;br /&gt;
*'''SettingStreamingVideoMemoryForGTA:''' The usable graphics memory setting. (64-256)&lt;br /&gt;
*'''SettingAnisotropicFiltering:''' The anisotropic filtering setting. (0-4 which respectively mean: off,2x,4x,8x,16x)&lt;br /&gt;
*'''SettingAntiAliasing:''' The anti-aliasing setting. (0-3 which respectively mean: off,1x,2x,3x)&lt;br /&gt;
*'''SettingHeatHaze:''' The heat haze setting. (true/false)&lt;br /&gt;
*'''SettingGrassEffect:''' The grass effect setting. (true/false)&lt;br /&gt;
*'''Setting32BitColor:''' The color depth of the screen. (false is 16bit, true is 32bit)&lt;br /&gt;
*'''SettingHUDMatchAspectRatio:''' The hud match aspect ratio setting. (true/false)&lt;br /&gt;
*'''SettingAspectRatio:''' The aspect ratio setting. (&amp;quot;auto&amp;quot;, &amp;quot;4:3&amp;quot;, &amp;quot;16:10&amp;quot;, &amp;quot;16:9&amp;quot;)&lt;br /&gt;
*'''SettingFOV:''' The FOV setting.&lt;br /&gt;
*'''SettingHighDetailVehicles:''' High detail vehicles setting (true/false).&lt;br /&gt;
{{New feature/item|3.0159|1.5.8|20508|&lt;br /&gt;
*'''SettingHighDetailPeds:''' High detail peds setting (true/false).&lt;br /&gt;
}}&lt;br /&gt;
*'''AllowScreenUpload:''' The allows screen uploads setting. (true/false)&lt;br /&gt;
*'''DepthBufferFormat:''' The format of the shader readable depth buffer, or 'unknown' if not available.&lt;br /&gt;
{{New feature/item|3.0159|1.5.8|20901|&lt;br /&gt;
*'''TotalPhysicalMemory:''' The amount of total physical memory in MB.&lt;br /&gt;
}}&lt;br /&gt;
*'''UsingDepthBuffer:''' ''true'' if the depth buffer is used, ''false'' otherwise.&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
addCommandHandler( &amp;quot;getinfo&amp;quot;,&lt;br /&gt;
	function( )&lt;br /&gt;
		local info = dxGetStatus( )&lt;br /&gt;
		for k, v in pairs( info ) do&lt;br /&gt;
			outputChatBox( k .. &amp;quot; : &amp;quot; .. tostring( v ) )&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;
==Changelog==&lt;br /&gt;
{{ChangelogHeader}}&lt;br /&gt;
{{ChangelogItem|1.3.0-9.04715|Added DepthBufferFormat argument}}&lt;br /&gt;
{{ChangelogItem|1.3.0-9.04811|Added VideoCardMaxAnisotropy, SettingAnisotropicFiltering, SettingAntiAliasing,&amp;lt;br/&amp;gt; SettingHeatHaze, SettingGrassEffect and Setting32BitColor arguments}}&lt;br /&gt;
{{ChangelogItem|1.3.4-9.05731|Added SettingHUDMatchAspectRatio and SettingAspectRatio}}&lt;br /&gt;
{{ChangelogItem|1.4.1-9.07181|Added SettingFOV}}&lt;br /&gt;
{{ChangelogItem|1.4.1-9.07310|Added VideoCardNumRenderTargets}}&lt;br /&gt;
{{ChangelogItem|1.5.2-9.07816|Added UsingDepthBuffer}}&lt;br /&gt;
{{ChangelogItem|1.5.3-9.11199|Added SettingHighDetailVehicles}}&lt;br /&gt;
{{ChangelogItem|1.5.5-9.11814|Added SettingFullScreenStyle&amp;lt;br/&amp;gt;Fixed SettingWindowed}}&lt;br /&gt;
{{ChangelogItem|1.5.8-9.20508|Added SettingHighDetailPeds}}&lt;br /&gt;
{{ChangelogItem|1.5.8-9.20901|Added TotalPhysicalMemory}}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Drawing_functions}}&lt;br /&gt;
&lt;br /&gt;
[[hu:dxGetStatus]]&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=CJ_Clothes%5CShoes_(3)&amp;diff=70950</id>
		<title>CJ Clothes\Shoes (3)</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=CJ_Clothes%5CShoes_(3)&amp;diff=70950"/>
		<updated>2021-04-29T15:44:19Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
| {{Clothes|index=0|type=3|model=feet|texture=foot}}&lt;br /&gt;
| {{Clothes|index=1|type=3|model=biker|texture=cowboyboot2}}&lt;br /&gt;
| {{Clothes|index=2|type=3|model=bask1|texture=bask2semi}}&lt;br /&gt;
| {{Clothes|index=3|type=3|model=bask1|texture=bask1eris}}&lt;br /&gt;
| {{Clothes|index=4|type=3|model=sneaker|texture=sneakerbincgang}}&lt;br /&gt;
| {{Clothes|index=5|type=3|model=sneaker|texture=sneakerbincblu}}&lt;br /&gt;
|-&lt;br /&gt;
| {{Clothes|index=6|type=3|model=sneaker|texture=sneakerbincblk}}&lt;br /&gt;
| {{Clothes|index=7|type=3|model=flipflop|texture=sandal}}&lt;br /&gt;
| {{Clothes|index=8|type=3|model=flipflop|texture=sandalsock}}&lt;br /&gt;
| {{Clothes|index=9|type=3|model=flipflop|texture=flipflop}}&lt;br /&gt;
| {{Clothes|index=10|type=3|model=bask1|texture=hitop}}&lt;br /&gt;
| {{Clothes|index=11|type=3|model=conv|texture=convproblk}}&lt;br /&gt;
|-&lt;br /&gt;
| {{Clothes|index=12|type=3|model=conv|texture=convproblu}}&lt;br /&gt;
| {{Clothes|index=13|type=3|model=conv|texture=convprogrn}}&lt;br /&gt;
| {{Clothes|index=14|type=3|model=sneaker|texture=sneakerprored}}&lt;br /&gt;
| {{Clothes|index=15|type=3|model=sneaker|texture=sneakerproblu}}&lt;br /&gt;
| {{Clothes|index=16|type=3|model=sneaker|texture=sneakerprowht}}&lt;br /&gt;
| {{Clothes|index=17|type=3|model=bask1|texture=bask1prowht}}&lt;br /&gt;
|-&lt;br /&gt;
| {{Clothes|index=18|type=3|model=bask1|texture=bask1problk}}&lt;br /&gt;
| {{Clothes|index=19|type=3|model=biker|texture=boxingshoe}}&lt;br /&gt;
| {{Clothes|index=20|type=3|model=conv|texture=convheatblk}}&lt;br /&gt;
| {{Clothes|index=21|type=3|model=conv|texture=convheatred}}&lt;br /&gt;
| {{Clothes|index=22|type=3|model=conv|texture=convheatorn}}&lt;br /&gt;
| {{Clothes|index=23|type=3|model=sneaker|texture=sneakerheatwht}}&lt;br /&gt;
|-&lt;br /&gt;
| {{Clothes|index=24|type=3|model=sneaker|texture=sneakerheatgry}}&lt;br /&gt;
| {{Clothes|index=25|type=3|model=sneaker|texture=sneakerheatblk}}&lt;br /&gt;
| {{Clothes|index=26|type=3|model=bask1|texture=bask2heatwht}}&lt;br /&gt;
| {{Clothes|index=27|type=3|model=bask1|texture=bask2heatband}}&lt;br /&gt;
| {{Clothes|index=28|type=3|model=bask1|texture=timbergrey}}&lt;br /&gt;
| {{Clothes|index=29|type=3|model=bask1|texture=timberred}}&lt;br /&gt;
|-&lt;br /&gt;
| {{Clothes|index=30|type=3|model=bask1|texture=timberfawn}}&lt;br /&gt;
| {{Clothes|index=31|type=3|model=bask1|texture=timberhike}}&lt;br /&gt;
| {{Clothes|index=32|type=3|model=biker|texture=cowboyboot}}&lt;br /&gt;
| {{Clothes|index=33|type=3|model=biker|texture=biker}}&lt;br /&gt;
| {{Clothes|index=34|type=3|model=biker|texture=snakeskin}}&lt;br /&gt;
| {{Clothes|index=35|type=3|model=shoe|texture=shoedressblk}}&lt;br /&gt;
|-&lt;br /&gt;
| {{Clothes|index=36|type=3|model=shoe|texture=shoedressbrn}}&lt;br /&gt;
| {{Clothes|index=37|type=3|model=shoe|texture=shoespatz}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[pl:CJ_Clothes%5CShoes_(3)]]&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=Shader_examples&amp;diff=69694</id>
		<title>Shader examples</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=Shader_examples&amp;diff=69694"/>
		<updated>2021-03-25T18:51:19Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: http &amp;gt; https&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains some example shader resources to try. If you are looking to make your own, please be sure to read about the [[Shader|shader element]] as well.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
__TOC__&lt;br /&gt;
==Road shine==&lt;br /&gt;
[[Image:RoadShineScreen.jpg|200px|thumb|left|Road shine]]&lt;br /&gt;
&amp;lt;table border=0&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td valign=top height=170&amp;gt;&lt;br /&gt;
[https://nightly.mtasa.com/files/shaders/shader_roadshine.zip Download shader_roadshine.zip] &amp;amp;nbsp; ''Requires Shader Model 2 graphics card''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This resource creates a light reflection effect on the ground (looks best when moving). &lt;br /&gt;
It uses a custom flag in the effect file to generate [https://en.wikipedia.org/wiki/Surface_normal surface normals] for the ground model:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
int CUSTOMFLAGS&lt;br /&gt;
&amp;lt;&lt;br /&gt;
    string createNormals = &amp;quot;yes&amp;quot;;&lt;br /&gt;
&amp;gt;;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Surface normals are not usually present in the ground and building models, but are useful for creating lighting effects such as these.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Road shine 2==&lt;br /&gt;
[[Image:RoadShine2Screen.jpg|200px|thumb|left|Road shine 2]]&lt;br /&gt;
&amp;lt;table border=0&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td valign=top height=170&amp;gt;&lt;br /&gt;
[https://nightly.mtasa.com/files/shaders/shader_roadshine2.zip Download shader_roadshine2.zip] &amp;amp;nbsp; ''Requires Shader Model 2 graphics card''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Bit more complicated than the first Road shine, as it tracks the sun or moon to calculate the position of the highlight.&lt;br /&gt;
The effect can be hard to see depending on the time of day.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Best used with the play resource as the model it modifies is near the initial spawn point.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Road shine 3 (Deluxe edition)==&lt;br /&gt;
[[Image:RoadShine3Screen.jpg|200px|thumb|left|Road shine 3]]&lt;br /&gt;
&amp;lt;table border=0&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td valign=top height=170&amp;gt;&lt;br /&gt;
[https://nightly.mtasa.com/files/shaders/shader_roadshine3.zip Download shader_roadshine3.zip] &amp;amp;nbsp; ''Requires Shader Model 2 graphics card''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This resource shows how to:&lt;br /&gt;
* Stop a wild card match shader from being applied to certain world textures.&lt;br /&gt;
* Use isLineOfSightClear to stop an effect when something is not visible (The sun in this case).&lt;br /&gt;
* Use a shader maxDrawDistance setting to avoid GPU overload.&lt;br /&gt;
&lt;br /&gt;
The final effect is a faster shader with less rendering issues than the previous two road shine examples.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==UV scroll==&lt;br /&gt;
[[Image:UVScollScreen.jpg|200px|thumb|left|UV scroll]]&lt;br /&gt;
&amp;lt;table border=0&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td valign=top height=170&amp;gt;&lt;br /&gt;
[https://nightly.mtasa.com/files/shaders/shader_uv_scroll.zip Download shader_uv_scroll.zip]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This resource scrolls a texture from left to right. It doesn't use vertex or pixels shaders, so it should work on all hardware.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==UV scripted==&lt;br /&gt;
[[Image:UVScriptedScreen.jpg|200px|thumb|left|UV scripted]]&lt;br /&gt;
&amp;lt;table border=0&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td valign=top height=170&amp;gt;&lt;br /&gt;
[https://nightly.mtasa.com/files/shaders/shader_uv_scripted.zip Download shader_uv_scripted.zip]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This resource controls a texture's UVs using Lua. It shows that anything is possible if you can imagine it.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Car paint==&lt;br /&gt;
[[Image:CarPaintScreen.jpg|200px|thumb|left|Car paint]]&lt;br /&gt;
&amp;lt;table border=0&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td valign=top height=170&amp;gt;&lt;br /&gt;
[https://nightly.mtasa.com/files/shaders/shader_car_paint.zip Download shader_car_paint.zip] &amp;amp;nbsp; ''Requires Shader Model 2 graphics card''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This resource shows you how to apply a shader to the vehicle models. The shader itself is not that great, so don't get your hopes up.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Water==&lt;br /&gt;
[[Image:WaterScreen.jpg|200px|thumb|left|Water]]&lt;br /&gt;
&amp;lt;table border=0&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td valign=top height=170&amp;gt;&lt;br /&gt;
[https://nightly.mtasa.com/files/shaders/shader_water.zip Download shader_water.zip] &amp;amp;nbsp; ''Requires Shader Model 2 graphics card''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This resource applies a shader to the GTA world water. The Lua script shows how to use a timer to transfer the conventional water color setting to the shader.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Bloom==&lt;br /&gt;
[[Image:BloomScreen.jpg|200px|thumb|left|Bloom]]&lt;br /&gt;
&amp;lt;table border=0&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td valign=top height=170&amp;gt;&lt;br /&gt;
[https://nightly.mtasa.com/files/shaders/shader_bloom.zip Download shader_bloom.zip] &amp;amp;nbsp; ''Requires Shader Model 2 graphics card''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This resource shows you how 'bounce' full screen effects using a render target pool. It uses the ''onClientHUDRender'' event to exclude the HUD from the effect.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Block world==&lt;br /&gt;
[[Image:BlockWorld.jpg|200px|thumb|left|Block world]]&lt;br /&gt;
&amp;lt;table border=0&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td valign=top height=170&amp;gt;&lt;br /&gt;
[https://nightly.mtasa.com/files/shaders/shader_block_world.zip Download shader_block_world.zip] &amp;amp;nbsp; ''Requires Shader Model 2 graphics card''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This resource makes the textures look all blocky. It also changes colors when the 'k' key is pressed.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Texture names==&lt;br /&gt;
[[Image:TexNames.jpg|200px|thumb|left|Texture names]]&lt;br /&gt;
&amp;lt;table border=0&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td valign=top height=170&amp;gt;&lt;br /&gt;
[https://nightly.mtasa.com/files/shaders/shader_tex_names.zip Download shader_tex_names.zip]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This resource is only a tool, and doesn't do anything pretty. It shows a list of the current visible texture names, and highlights the selected texture. Ideal for finding a texture name to use with [[engineApplyShaderToWorldTexture]].&lt;br /&gt;
&lt;br /&gt;
num_8 shows/hides the texture list, num_7 and num_9 step through the list, and 'k' copies the current texture name to the clipboard.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Skid marks==&lt;br /&gt;
[[Image:SkidMarks.jpg|200px|thumb|left|Skid marks]]&lt;br /&gt;
&amp;lt;table border=0&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td valign=top height=170&amp;gt;&lt;br /&gt;
[https://nightly.mtasa.com/files/shaders/shader_skidmarks.zip Download shader_skidmarks.zip] &amp;amp;nbsp; ''Requires Shader Model 2 graphics card''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This resource shows you how to do multiple passes in a shader, and input different variables to the vertex shader for each pass.&lt;br /&gt;
Use the command '''/skidmarks 1-4''' to see the different effects. (You have skid a car to see it!)&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==HDR contrast==&lt;br /&gt;
[[Image:ShaderContrast.jpg|200px|thumb|left|HDR contrast]]&lt;br /&gt;
&amp;lt;table border=0&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td valign=top height=170&amp;gt;&lt;br /&gt;
[https://nightly.mtasa.com/files/shaders/shader_contrast.zip Download shader_contrast.zip] &amp;amp;nbsp; ''Requires Shader Model 2 graphics card''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This resource applies a 'High Dynamic Range' contrast effect. It uses a 1 pixel render target to sample the whole scene, and then uses that to brighten or darken the next frame.&lt;br /&gt;
So going into somewhere dark will automatically brighten the scene, and visa versa&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tessellation==&lt;br /&gt;
[[Image:shader_flag.jpg|200px|thumb|left|Tessellation action]]&lt;br /&gt;
&amp;lt;table border=0&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td valign=top height=170&amp;gt;&lt;br /&gt;
[https://nightly.mtasa.com/files/shaders/shader_flag.zip Download shader_flag.zip] &amp;amp;nbsp; ''Requires Shader Model 2 graphics card''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This resource shows how to use shader tessellation to animate the shape of a dxDrawImage and use shader transform to give it a 3rd dimension.&lt;br /&gt;
&lt;br /&gt;
The example has a GUI (press numpad-8) so you can fiddle with the settings.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Radial blur==&lt;br /&gt;
[[Image:shader_radial_blur.jpg|200px|thumb|left|Radial blur]]&lt;br /&gt;
&amp;lt;table border=0&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td valign=top height=170&amp;gt;&lt;br /&gt;
[https://nightly.mtasa.com/files/shaders/shader_radial_blur.zip Download shader_radial_blur.zip] &amp;amp;nbsp; ''Requires Shader Model 2 graphics card''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This resource sort of looks a little bit like the GTAIV motion blur you get when you move the mouse quickly, or drive a fast car. The fast car effect is a bit more subtle than the screen shot would suggest, as it leaves the center of the screen nice and clear so you can see where you are going.&lt;br /&gt;
&lt;br /&gt;
It also has the option of suspending the effect during times of low FPS. Check the two settings at the top of '''''c_radial_blur.lua'''''.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
The file '''''c_switch.lua''''' contains information on how to toggle the effect from another resource using events.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Detail==&lt;br /&gt;
[[Image:shader_detail.jpg|200px|thumb|left|Detail]]&lt;br /&gt;
&amp;lt;table border=0&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td valign=top height=170&amp;gt;&lt;br /&gt;
[https://nightly.mtasa.com/files/shaders/shader_detail.zip Download shader_detail.zip] &amp;amp;nbsp; ''Requires Shader Model 2 graphics card''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Applies a few monochrome detail textures, at various scales, to (parts of) the world.&lt;br /&gt;
&lt;br /&gt;
(Not finished and probably never will be.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ped morph==&lt;br /&gt;
[[Image:PedMorphScreen.jpg|200px|thumb|left|Ped morph]]&lt;br /&gt;
&amp;lt;table border=0&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td valign=top height=170&amp;gt;&lt;br /&gt;
[https://nightly.mtasa.com/files/shaders/shader_ped_morph.zip Download shader_ped_morph.zip] &amp;amp;nbsp; ''Requires Shader Model 2 graphics card''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This resource uses a vertex shader to modify the geometry of a ped model as it is rendered.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
When the resource has started, use the 'k' and 'l' keys to change morph size.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ped shell==&lt;br /&gt;
[[Image:PedShellScreen.jpg|200px|thumb|left|Ped shell]]&lt;br /&gt;
&amp;lt;table border=0&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td valign=top height=170&amp;gt;&lt;br /&gt;
[https://nightly.mtasa.com/files/shaders/shader_ped_shell.zip Download shader_ped_shell.zip] &amp;amp;nbsp; ''Requires Shader Model 2 graphics card''&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This resource draws a translucent effect as a shader layer. The first pass is done by GTA, and the vertex shader is only applied in the second to add the effect 'on top' of the standard output.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
When the resource has started, use the 'm' key to see the shell effect.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hud mask==&lt;br /&gt;
[[Image:Shader_hud_mask.jpg|200px|thumb|left|Hud mask]]&lt;br /&gt;
&amp;lt;table border=0&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td valign=top height=170&amp;gt;&lt;br /&gt;
[https://nightly.mtasa.com/files/shaders/shader_hud_mask.zip Download shader_hud_mask.zip]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This resource shows how to draw a hud texture with a shape mask.&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==dxDrawCircle==&lt;br /&gt;
[[Image:dxDrawCircle.jpg|200px|thumb|left|dxDrawCircle]]&lt;br /&gt;
&amp;lt;table border=0&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td valign=top height=170&amp;gt;&lt;br /&gt;
[https://nightly.mtasa.com/files/shaders/shader_circle.zip Download shader_circle.zip]&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
This resource exports a 'dxDrawCircle' function for use in your own scripts.&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Example resource calling dxDrawCircle function from shader_circle: [https://nightly.mtasa.com/files/shaders/circle_example.zip circle_example.zip]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetRoofPosition&amp;diff=68155</id>
		<title>GetRoofPosition</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetRoofPosition&amp;diff=68155"/>
		<updated>2021-01-03T21:52:00Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{New feature/item|3.0160|1.5.8|20675|&lt;br /&gt;
This function gets the Z level of the lowest roof above a point.&lt;br /&gt;
It is required that the point is near enough to the local player so that it's within the area where collision data is loaded.}}&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 getRoofPosition ( float x, float y, float z )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
*'''x''': A [[float]]ing point number representing the X world coordinate of the point.&lt;br /&gt;
*'''y''': A [[float]]ing point number representing the Y world coordinate of the point.&lt;br /&gt;
*'''z''': A [[float]]ing point number representing the Z world coordinate of the point.&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns a [[float]] with the lowest roof-level Z coord if parameters are valid, ''false'' if the point you tried to test is outside the loaded world map.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
This example starts to shake the player's camera if there is no roof over him.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
setTimer (&lt;br /&gt;
	function ( )&lt;br /&gt;
		local playerX, playerY, playerZ = getElementPosition ( localPlayer )&lt;br /&gt;
		local roofZ = getRoofPosition ( playerX, playerY, playerZ )&lt;br /&gt;
		setCameraShakeLevel ( ( roofZ ) and 0 or 255 )&lt;br /&gt;
	end, 100, 0&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
{{Requirements|n/a|1.5.8-9.20675|}}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Client_world_functions}}&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetRoofPosition&amp;diff=68154</id>
		<title>GetRoofPosition</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetRoofPosition&amp;diff=68154"/>
		<updated>2021-01-03T21:37:17Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: Created page with &amp;quot;__NOTOC__ {{Client function}} {{New feature/item|3.0160|1.5.8|20675| This function gets the Z level of the lowest roof above a point. It is required that the point is near eno...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Client function}}&lt;br /&gt;
{{New feature/item|3.0160|1.5.8|20675|&lt;br /&gt;
This function gets the Z level of the lowest roof above a point.&lt;br /&gt;
It is required that the point is near enough to the local player so that it's within the area where collision data is loaded.}}&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 getRoofPosition ( float x, float y, float z )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
*'''x''': A [[float]]ing point number representing the X world coordinate of the point.&lt;br /&gt;
*'''y''': A [[float]]ing point number representing the Y world coordinate of the point.&lt;br /&gt;
*'''z''': A [[float]]ing point number representing the Z world coordinate of the point.&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns a [[float]] with the lowest roof-level Z coord if parameters are valid, ''false'' if the point you tried to test is outside the loaded world map.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
This example starts to shake the player's camera if there is no roof over it.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
setTimer (&lt;br /&gt;
	function ( )&lt;br /&gt;
		local playerX, playerY, playerZ = getElementPosition ( localPlayer )&lt;br /&gt;
		local roofZ = getRoofPosition ( playerX, playerY, playerZ )&lt;br /&gt;
		setCameraShakeLevel ( ( roofZ ) and 0 or 255 )&lt;br /&gt;
	end, 100, 0&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
{{Requirements|n/a|1.5.8-9.20675|}}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Client_world_functions}}&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=Template:Client_world_functions&amp;diff=68153</id>
		<title>Template:Client world functions</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=Template:Client_world_functions&amp;diff=68153"/>
		<updated>2021-01-03T21:25:33Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: Add getRoofPosition&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[areTrafficLightsLocked]]&lt;br /&gt;
* [[createSWATRope]]&lt;br /&gt;
* [[getAircraftMaxHeight]]&lt;br /&gt;
* [[getAircraftMaxVelocity]]&lt;br /&gt;
* [[getBirdsEnabled]]&lt;br /&gt;
* [[getCloudsEnabled]]&lt;br /&gt;
* [[getFarClipDistance]]&lt;br /&gt;
* [[getFogDistance]]&lt;br /&gt;
* [[getGameSpeed]]&lt;br /&gt;
* [[getGarageBoundingBox]]&lt;br /&gt;
* [[getGaragePosition]]&lt;br /&gt;
* [[getGarageSize]]&lt;br /&gt;
* [[getGravity]]&lt;br /&gt;
* [[getGroundPosition]]&lt;br /&gt;
* [[getHeatHaze]]&lt;br /&gt;
* [[getInteriorFurnitureEnabled]]&lt;br /&gt;
* [[getInteriorSoundsEnabled]]&lt;br /&gt;
* [[getJetpackMaxHeight]]&lt;br /&gt;
* [[getMinuteDuration]]&lt;br /&gt;
* [[getMoonSize]]&lt;br /&gt;
* [[getNearClipDistance]]&lt;br /&gt;
* [[resetNearClipDistance]]&lt;br /&gt;
* [[getOcclusionsEnabled]]&lt;br /&gt;
{{New items|3.0156|1.5.5|&lt;br /&gt;
*[[getPedsLODDistance]]&lt;br /&gt;
*[[setPedsLODDistance]]&lt;br /&gt;
*[[resetPedsLODDistance]]&lt;br /&gt;
|13771}}&lt;br /&gt;
* [[getPlayerBlurLevel]]&lt;br /&gt;
* [[getRainLevel]]&lt;br /&gt;
{{New items|3.0160|1.5.8|&lt;br /&gt;
*[[getRoofPosition]]&lt;br /&gt;
|20675}}&lt;br /&gt;
* [[getScreenFromWorldPosition]]&lt;br /&gt;
* [[getSunColor]]&lt;br /&gt;
* [[getSunSize]]&lt;br /&gt;
* [[getTime]]&lt;br /&gt;
* [[getTrafficLightState]]&lt;br /&gt;
* [[getVehiclesLODDistance]]&lt;br /&gt;
* [[getWeather]]&lt;br /&gt;
* [[getWindVelocity]]&lt;br /&gt;
* [[getWorldFromScreenPosition]]&lt;br /&gt;
* [[getZoneName]]&lt;br /&gt;
* [[isAmbientSoundEnabled]]&lt;br /&gt;
* [[isGarageOpen]]&lt;br /&gt;
* [[isLineOfSightClear]]&lt;br /&gt;
* [[isWorldSoundEnabled]]&lt;br /&gt;
* [[isWorldSpecialPropertyEnabled]]&lt;br /&gt;
* [[processLineOfSight]]&lt;br /&gt;
* [[removeWorldModel]]&lt;br /&gt;
* [[resetAmbientSounds]]&lt;br /&gt;
{{New items|3.0158|1.5.7|&lt;br /&gt;
*[[resetBlurLevel]]&lt;br /&gt;
|20450}}&lt;br /&gt;
* [[resetFarClipDistance]]&lt;br /&gt;
* [[resetFogDistance]]&lt;br /&gt;
* [[resetHeatHaze]]&lt;br /&gt;
* [[resetMoonSize]]&lt;br /&gt;
* [[resetRainLevel]]&lt;br /&gt;
* [[resetSkyGradient]]&lt;br /&gt;
* [[resetSunColor]]&lt;br /&gt;
* [[resetSunSize]]&lt;br /&gt;
* [[resetVehiclesLODDistance]]&lt;br /&gt;
* [[resetWindVelocity]]&lt;br /&gt;
* [[resetWorldSounds]]&lt;br /&gt;
{{New items|3.0160|1.5.8|&lt;br /&gt;
*[[resetColorFilter]]&lt;br /&gt;
|20718}}&lt;br /&gt;
* [[restoreAllWorldModels]]&lt;br /&gt;
* [[restoreWorldModel]]&lt;br /&gt;
* [[setAircraftMaxHeight]]&lt;br /&gt;
* [[setAircraftMaxVelocity]]&lt;br /&gt;
* [[setAmbientSoundEnabled]]&lt;br /&gt;
* [[setBirdsEnabled]]&lt;br /&gt;
* [[setCloudsEnabled]]&lt;br /&gt;
* [[setFarClipDistance]]&lt;br /&gt;
* [[setFogDistance]]&lt;br /&gt;
* [[setGameSpeed]]&lt;br /&gt;
* [[setGarageOpen]]&lt;br /&gt;
* [[setGravity]]&lt;br /&gt;
* [[setHeatHaze]]&lt;br /&gt;
* [[setInteriorFurnitureEnabled]]&lt;br /&gt;
* [[setInteriorSoundsEnabled]]&lt;br /&gt;
* [[setJetpackMaxHeight]]&lt;br /&gt;
* [[setMinuteDuration]]&lt;br /&gt;
* [[setMoonSize]]&lt;br /&gt;
* [[setNearClipDistance]]&lt;br /&gt;
* [[setOcclusionsEnabled]]&lt;br /&gt;
* [[setPlayerBlurLevel]]&lt;br /&gt;
* [[setRainLevel]]&lt;br /&gt;
* [[setSkyGradient]]&lt;br /&gt;
* [[setSunColor]]&lt;br /&gt;
* [[setSunSize]]&lt;br /&gt;
* [[setTime]]&lt;br /&gt;
* [[setTrafficLightState]]&lt;br /&gt;
* [[setTrafficLightsLocked]]&lt;br /&gt;
* [[setVehiclesLODDistance]]&lt;br /&gt;
* [[setWeather]]&lt;br /&gt;
* [[setWeatherBlended]]&lt;br /&gt;
* [[setWindVelocity]]&lt;br /&gt;
* [[setWorldSoundEnabled]]&lt;br /&gt;
* [[setWorldSpecialPropertyEnabled]]&lt;br /&gt;
{{New items|3.0160|1.5.8|&lt;br /&gt;
*[[setColorFilter]]&lt;br /&gt;
|20718}}&lt;br /&gt;
* [[testLineAgainstWater]]&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Functions templates]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=OnElementDimensionChange&amp;diff=68151</id>
		<title>OnElementDimensionChange</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=OnElementDimensionChange&amp;diff=68151"/>
		<updated>2021-01-03T12:41:44Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: Created page with &amp;quot;__NOTOC__ {{Client event}} {{New feature/item|3.0160|1.5.8|20724|This event is triggered when the dimension of an element is changed using setElementDimension.}}  ==Pa...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Client event}}&lt;br /&gt;
{{New feature/item|3.0160|1.5.8|20724|This event is triggered when the dimension of an [[element]] is changed using [[setElementDimension]].}}&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 oldDimension, int newDimension&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*'''oldDimension''': an [[int]] representing the dimension the [[element]] was in before.&lt;br /&gt;
*'''newDimension''': an [[int]] representing the dimension the [[element]] is in now.&lt;br /&gt;
&lt;br /&gt;
==Source==&lt;br /&gt;
The [[event system#Event source|source]] of this event is the [[element]] that changed its dimension.&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 vehicle = createVehicle ( 411, 0, 0, 3 )&lt;br /&gt;
setTimer ( setElementDimension, 1000, 1, vehicle, 10 )&lt;br /&gt;
&lt;br /&gt;
addEventHandler ( &amp;quot;onElementDimensionChange&amp;quot;, vehicle,&lt;br /&gt;
	function ( oldDimension, newDimension )&lt;br /&gt;
		outputChatBox ( inspect ( source ) .. &amp;quot;'s dimension changed from &amp;quot; .. oldDimension .. &amp;quot; to &amp;quot; .. newDimension )&lt;br /&gt;
	end&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
{{Requirements|1.5.8-9.20724|n/a|}}&lt;br /&gt;
&lt;br /&gt;
{{See also/Server event|Element events}}&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=OnClientElementDimensionChange&amp;diff=68150</id>
		<title>OnClientElementDimensionChange</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=OnClientElementDimensionChange&amp;diff=68150"/>
		<updated>2021-01-03T12:41:12Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: Created page with &amp;quot;__NOTOC__ {{Client event}} {{New feature/item|3.0160|1.5.8|20724|This event is triggered when the dimension of an element is changed using setElementDimension.}}  ==Pa...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Client event}}&lt;br /&gt;
{{New feature/item|3.0160|1.5.8|20724|This event is triggered when the dimension of an [[element]] is changed using [[setElementDimension]].}}&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 oldDimension, int newDimension&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*'''oldDimension''': an [[int]] representing the dimension the [[element]] was in before.&lt;br /&gt;
*'''newDimension''': an [[int]] representing the dimension the [[element]] is in now.&lt;br /&gt;
&lt;br /&gt;
==Source==&lt;br /&gt;
The [[event system#Event source|source]] of this event is the [[element]] that changed its dimension.&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 vehicle = createVehicle ( 411, 0, 0, 3 )&lt;br /&gt;
setTimer ( setElementDimension, 1000, 1, vehicle, 10 )&lt;br /&gt;
&lt;br /&gt;
addEventHandler ( &amp;quot;onClientElementDimensionChange&amp;quot;, vehicle,&lt;br /&gt;
	function ( oldDimension, newDimension )&lt;br /&gt;
		outputChatBox ( inspect ( source ) .. &amp;quot;'s dimension changed from &amp;quot; .. oldDimension .. &amp;quot; to &amp;quot; .. newDimension )&lt;br /&gt;
	end&lt;br /&gt;
)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
{{Requirements|n/a|1.5.8-9.20724|}}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
===Client element events===&lt;br /&gt;
{{Client_element_events}}&lt;br /&gt;
===Client event functions===&lt;br /&gt;
{{Client_event_functions}}&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetSoundLevelData&amp;diff=67084</id>
		<title>GetSoundLevelData</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetSoundLevelData&amp;diff=67084"/>
		<updated>2020-07-25T05:53:08Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
{{Client function}}&lt;br /&gt;
This function gets the left/right level from a [[sound]] [[element]].&lt;br /&gt;
{{New feature/item|3.0132|1.3.2||&lt;br /&gt;
If the element is a player, this function will use the players voice.&lt;br /&gt;
}}&lt;br /&gt;
==Syntax== &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;int, int getSoundLevelData ( element theSound )&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
{{OOP||[[sound]]:getLevelData}}&lt;br /&gt;
===Required Arguments=== &lt;br /&gt;
*'''theSound:''' the [[sound]] [[element]] which level data you want to return.&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns a two ''integers'' in range from 0 to 32768.&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 soundHandler = playSound ( &amp;quot;sound.wav&amp;quot; )&lt;br /&gt;
&lt;br /&gt;
function onSoundPlayRender ( )&lt;br /&gt;
    if ( soundHandler ) then&lt;br /&gt;
        local leftData, rightData = getSoundLevelData ( soundHandler )&lt;br /&gt;
	if ( leftData ) then&lt;br /&gt;
            dxDrawRectangle ( 0, 0, 64, leftData / 32768 * 256, tocolor ( 255, 0, 0 ) )&lt;br /&gt;
            dxDrawRectangle ( 64, 0, 64, rightData / 32768 * 256, tocolor ( 0, 0, 255 ) )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
addEventHandler ( &amp;quot;onClientRender&amp;quot;, root, onSoundPlayRender )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
{{Requirements|n/a|1.3.0-9.04162|}}&lt;br /&gt;
&lt;br /&gt;
==Changelog==&lt;br /&gt;
{{ChangelogHeader}}&lt;br /&gt;
{{ChangelogItem|1.3.2|Added player element to use a players voice}}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Client_audio_functions}}&lt;br /&gt;
&lt;br /&gt;
[[hu:getSoundLevelData]]&lt;br /&gt;
[[ar:getSoundLevelData]]&lt;br /&gt;
[[ro:getSoundLevelData]]&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=Template:New_items&amp;diff=67009</id>
		<title>Template:New items</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=Template:New_items&amp;diff=67009"/>
		<updated>2020-07-03T11:12:36Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{#ifexpr:({{{1|}}})&amp;gt;{{Current Version}}|&amp;lt;div style='font-weight: bold;background:black;color:white;padding:2px; padding-left:8px;'&amp;gt;[[Beta Features|&amp;lt;span style=&amp;quot;color: #FFFFFF; text-decoration:underline&amp;quot;&amp;gt;BETA&amp;lt;/span&amp;gt;]]: FROM VERSION {{{2}}} {{#if:{{{4|}}}|{{r|{{{4}}}}}|}} ONWARDS&amp;lt;/div&amp;gt;&amp;lt;div style='border: 2px solid black;padding: 3px;'&amp;gt;{{{3}}} &amp;lt;/div&amp;gt;| {{{3}}}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;Use this template for functions/events lists. In function and event pages use &amp;lt;nowiki&amp;gt;{{New feature/item}}&amp;lt;/nowiki&amp;gt;. This will prevent wrong pages appear in changelog category.&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
# Version float (value is compared with &amp;lt;code&amp;gt;&amp;amp;gt;&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Current Version}}&amp;lt;/nowiki&amp;gt; = {{Current Version}}&amp;lt;/code&amp;gt;)&lt;br /&gt;
# Version text (only visual, example: &amp;lt;code&amp;gt;{{Current Version|full}}&amp;lt;/code&amp;gt;)&lt;br /&gt;
# Text&lt;br /&gt;
# Revision number (only visual)&lt;br /&gt;
[[Category:Utility templates]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=Template:Utility_functions&amp;diff=65281</id>
		<title>Template:Utility functions</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=Template:Utility_functions&amp;diff=65281"/>
		<updated>2020-02-28T13:16:25Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*[[addDebugHook]]&lt;br /&gt;
*[[base64Decode]]&lt;br /&gt;
*[[base64Encode]]&lt;br /&gt;
{{Bit_functions}}&lt;br /&gt;
*[[debugSleep]]&lt;br /&gt;
{{New items|3.0156|1.5.5|&lt;br /&gt;
*[[decodeString]]&lt;br /&gt;
*[[encodeString]]&lt;br /&gt;
|11849}}&lt;br /&gt;
*[[fromJSON]]&lt;br /&gt;
*[[getColorFromString]]&lt;br /&gt;
*[[getDevelopmentMode]]&lt;br /&gt;
*[[getDistanceBetweenPoints2D]]&lt;br /&gt;
*[[getDistanceBetweenPoints3D]]&lt;br /&gt;
*[[getEasingValue]]&lt;br /&gt;
*[[getFPSLimit]]&lt;br /&gt;
*[[getNetworkStats]]&lt;br /&gt;
*[[getNetworkUsageData]]&lt;br /&gt;
*[[getPerformanceStats]]&lt;br /&gt;
*[[getRealTime]]&lt;br /&gt;
*[[getServerConfigSetting]]&lt;br /&gt;
*[[getTickCount]]&lt;br /&gt;
*[[getTimerDetails]]&lt;br /&gt;
*[[getTimers]]&lt;br /&gt;
*[[gettok]]&lt;br /&gt;
*[[getUserdataType]]&lt;br /&gt;
*[[getVersion]]&lt;br /&gt;
*[[hash]]&lt;br /&gt;
*[[inspect]]&lt;br /&gt;
*[[interpolateBetween]]&lt;br /&gt;
*[[iprint]]&lt;br /&gt;
*[[isOOPEnabled]]&lt;br /&gt;
*[[isTimer]]&lt;br /&gt;
*[[killTimer]]&lt;br /&gt;
*[[md5]]&lt;br /&gt;
*[[passwordHash]]&lt;br /&gt;
*[[passwordVerify]]&lt;br /&gt;
*[[pregFind]]&lt;br /&gt;
*[[pregMatch]]&lt;br /&gt;
*[[pregReplace]]&lt;br /&gt;
*[[removeDebugHook]]&lt;br /&gt;
*[[resetTimer]]&lt;br /&gt;
*[[setDevelopmentMode]]&lt;br /&gt;
*[[setFPSLimit]]&lt;br /&gt;
*[[setServerConfigSetting]]&lt;br /&gt;
*[[setTimer]]&lt;br /&gt;
*[[sha256]]&lt;br /&gt;
*[[split]]&lt;br /&gt;
*[[teaDecode]]&lt;br /&gt;
*[[teaEncode]]&lt;br /&gt;
{{New items|3.0156|1.5.5|&lt;br /&gt;
*[[tocolor]]&lt;br /&gt;
|13977}}&lt;br /&gt;
*[[toJSON]]&lt;br /&gt;
*[[utfChar]]&lt;br /&gt;
*[[utfCode]]&lt;br /&gt;
*[[utfLen]]&lt;br /&gt;
*[[utfSeek]]&lt;br /&gt;
*[[utfSub]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Functions templates]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=SetPedAnimation&amp;diff=64536</id>
		<title>SetPedAnimation</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=SetPedAnimation&amp;diff=64536"/>
		<updated>2019-10-18T00:25:28Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: Add 'retainPedState' to changelog&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Server client function}}&lt;br /&gt;
&lt;br /&gt;
Sets the current [[Animations|animation]] of a [[player]] or [[ped]]. Not specifying the type of animation will automatically cancel the current one.&lt;br /&gt;
{{Warning|It is possible that an animation will be cancelled if you use setElementFrozen on the ped, but this does not happen all the time.}}&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 setPedAnimation ( ped thePed [, string block = nil, string anim = nil, int time = -1, bool loop = true, bool updatePosition = true,&lt;br /&gt;
                       bool interruptable = true, bool freezeLastFrame = true, int blendTime = 250, bool retainPedState = false ] )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{OOP||[[ped]]:setAnimation||getPedAnimation}}&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
*'''thePed:''' the [[player]] or [[ped]] you want to apply an [[Animations|animation]] to.&lt;br /&gt;
&lt;br /&gt;
===Optional Arguments===&lt;br /&gt;
{{OptionalArg}}&lt;br /&gt;
*'''block:''' the [[Animations|animation]] block's name.&lt;br /&gt;
*'''anim:''' the name of the [[Animations|animation]] within the block.&lt;br /&gt;
*'''time:''' how long the animation will run for in milliseconds.&lt;br /&gt;
*'''loop:''' indicates whether or not the animation will loop.&lt;br /&gt;
*'''updatePosition:''' will change the actual coordinates of the ped according to the animation. Use this for e.g. walking animations.&lt;br /&gt;
*'''interruptable:''' if set to ''false'' other tasks wont be able to interupt the animation. Setting this to 'false' also gives this function more power to override other animations that are running. For example, squatting after a jump can be terminated.&lt;br /&gt;
*'''freezeLastFrame:''' if set to ''true'' after animation the last frame will be frozen, otherwise the animation will end and controls will return.&lt;br /&gt;
*'''blendTime:''' how long the animation will mixed with the previous one in milliseconds.&lt;br /&gt;
{{New items|3.0157|1.5.7|&lt;br /&gt;
*'''retainPedState:''' will restore the task which was playing before calling this function. Useful for restoring the crouch task after animation ends. This may be extended in the future to support other states/tasks.&lt;br /&gt;
|16632}}&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns ''true'' if succesful, ''false'' otherwise.&lt;br /&gt;
&lt;br /&gt;
==Examples==&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;
This example creates a ped, rotates him, and makes him walk:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function makePed()&lt;br /&gt;
	local thePed = createPed(56, 1, 1, 4, 315)&lt;br /&gt;
	setPedAnimation(thePed, &amp;quot;ped&amp;quot;, &amp;quot;WOMAN_walknorm&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
addCommandHandler(&amp;quot;makemyped&amp;quot;, makePed)&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;
This example makes the player sit down and stand up using the command /sit.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function toggleSit(thePlayer)&lt;br /&gt;
	if not getElementData(thePlayer, &amp;quot;sitting&amp;quot;) then&lt;br /&gt;
		setPedAnimation(thePlayer, &amp;quot;ped&amp;quot;, &amp;quot;seat_down&amp;quot;, -1, false, false, false, false)&lt;br /&gt;
		setElementData(thePlayer, &amp;quot;sitting&amp;quot;, true)&lt;br /&gt;
	else&lt;br /&gt;
		-- If you use again this command then your character stand up&lt;br /&gt;
		setPedAnimation(thePlayer)&lt;br /&gt;
		removeElementData(thePlayer, &amp;quot;sitting&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
addCommandHandler(&amp;quot;sit&amp;quot;, toggleSit)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Changelog==&lt;br /&gt;
{{ChangelogHeader}}&lt;br /&gt;
{{ChangelogItem|1.5.7-9.16632|Added retainPedState argument}}&lt;br /&gt;
&lt;br /&gt;
==Issues==&lt;br /&gt;
{{Issues|&lt;br /&gt;
{{Issue|1110|retainPedState in setPedAnimation() does not work when latency reduction is set to 1}}&lt;br /&gt;
{{Issue|1090|retainPedState can reset a replaced crouch idle animation to default}}&lt;br /&gt;
{{Issue|953|setPedAnimation() &amp;quot;interrupt&amp;quot; and &amp;quot;time&amp;quot; has no effect in certain situations}}&lt;br /&gt;
{{Issue|512|setPedAnimation isn't synced properly on server side}}&lt;br /&gt;
{{Issue|467|Ped animations don't sync for new players}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Ped_functions}}&lt;br /&gt;
[[ru:setPedAnimation]]&lt;br /&gt;
[[HU:setPedAnimation]]&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=Undocumented_Items&amp;diff=63934</id>
		<title>Undocumented Items</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=Undocumented_Items&amp;diff=63934"/>
		<updated>2019-08-25T19:26:49Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: Remove documented functions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page lists all MTA SA functions and events which don't have the necessary documentation for scripters to allow them to use the functions or events. Documenting these will require looking through the source code, which is available in the [https://github.com/multitheftauto/mtasa-blue MTA SA GitHub repository], to get the necessary parameters.&lt;br /&gt;
__NOTOC__&lt;br /&gt;
== Client functions that need documenting ==&lt;br /&gt;
*[[dxIsAspectRatioAdjustmentEnabled]]&lt;br /&gt;
&lt;br /&gt;
== Server functions that need documenting ==&lt;br /&gt;
(None)&lt;br /&gt;
&lt;br /&gt;
== Client events that need documenting ==&lt;br /&gt;
(None)&lt;br /&gt;
&lt;br /&gt;
== Server events that need documenting ==&lt;br /&gt;
(None)&lt;br /&gt;
&lt;br /&gt;
== Other undocumented pages ==&lt;br /&gt;
(None)&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=Undocumented_Items&amp;diff=62813</id>
		<title>Undocumented Items</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=Undocumented_Items&amp;diff=62813"/>
		<updated>2019-05-26T21:25:49Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: New functions &amp;amp; event&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page lists all MTA SA functions and events which don't have the necessary documentation for scripters to allow them to use the functions or events. Documenting these will require looking through the source code, which is available in the [https://github.com/multitheftauto/mtasa-blue MTA SA GitHub repository], to get the necessary parameters.&lt;br /&gt;
__NOTOC__&lt;br /&gt;
== Client functions that need documenting ==&lt;br /&gt;
*[[dxIsAspectRatioAdjustmentEnabled]]&lt;br /&gt;
*[[getVehicleComponentScale]]&lt;br /&gt;
*[[setVehicleComponentScale]]&lt;br /&gt;
*[[resetVehicleComponentScale]]&lt;br /&gt;
*[[guiGridListIsSortingEnabled]]&lt;br /&gt;
*[[guiGridListGetSelectionMode]]&lt;br /&gt;
&lt;br /&gt;
== Server functions that need documenting ==&lt;br /&gt;
(None)&lt;br /&gt;
&lt;br /&gt;
== Client events that need documenting ==&lt;br /&gt;
*[[onClientPaste]]&lt;br /&gt;
&lt;br /&gt;
== Server events that need documenting ==&lt;br /&gt;
(None)&lt;br /&gt;
&lt;br /&gt;
== Other undocumented pages ==&lt;br /&gt;
(None)&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=Template:Client_vehicle_functions&amp;diff=62812</id>
		<title>Template:Client vehicle functions</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=Template:Client_vehicle_functions&amp;diff=62812"/>
		<updated>2019-05-26T21:23:52Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: get/setVehicleModelDummyPosition&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*[[addVehicleUpgrade]]&lt;br /&gt;
*[[attachTrailerToVehicle]]&lt;br /&gt;
*[[blowVehicle]]&lt;br /&gt;
*[[createVehicle]]&lt;br /&gt;
*[[detachTrailerFromVehicle]]&lt;br /&gt;
*[[fixVehicle]]&lt;br /&gt;
*[[getHeliBladeCollisionsEnabled]]&lt;br /&gt;
*[[getHelicopterRotorSpeed]]&lt;br /&gt;
*[[getOriginalHandling]]&lt;br /&gt;
*[[getTrainDirection]]&lt;br /&gt;
*[[getTrainPosition]]&lt;br /&gt;
*[[getTrainSpeed]]&lt;br /&gt;
{{New items|3.0160|1.6|&lt;br /&gt;
*[[getTrainTrack]]&lt;br /&gt;
|7485}}&lt;br /&gt;
*[[getVehicleAdjustableProperty]]&lt;br /&gt;
*[[getVehicleColor]]&lt;br /&gt;
*[[getVehicleCompatibleUpgrades]]&lt;br /&gt;
*[[getVehicleComponentPosition]]&lt;br /&gt;
*[[getVehicleComponentRotation]]&lt;br /&gt;
*[[getVehicleComponentVisible]]&lt;br /&gt;
*[[getVehicleComponents]]&lt;br /&gt;
*[[getVehicleController]]&lt;br /&gt;
*[[getVehicleCurrentGear]]&lt;br /&gt;
*[[getVehicleDoorOpenRatio]]&lt;br /&gt;
*[[getVehicleDoorState]]&lt;br /&gt;
*[[getVehicleEngineState]]&lt;br /&gt;
*[[getVehicleGravity]]&lt;br /&gt;
*[[getVehicleHandling]]&lt;br /&gt;
*[[getVehicleHeadLightColor]]&lt;br /&gt;
*[[getVehicleLandingGearDown]]&lt;br /&gt;
*[[getVehicleLightState]]&lt;br /&gt;
*[[getVehicleMaxPassengers]]&lt;br /&gt;
{{New items|3.0157|1.5.6|&lt;br /&gt;
*[[getVehicleModelDummyPosition]]&lt;br /&gt;
|14403}}&lt;br /&gt;
*[[getVehicleModelExhaustFumesPosition]]&lt;br /&gt;
*[[getVehicleModelFromName]]&lt;br /&gt;
*[[getVehicleName]]&lt;br /&gt;
*[[getVehicleNameFromModel]]&lt;br /&gt;
*[[getVehicleNitroCount]]&lt;br /&gt;
*[[getVehicleNitroLevel]]&lt;br /&gt;
*[[getVehicleOccupant]]&lt;br /&gt;
*[[getVehicleOccupants]]&lt;br /&gt;
*[[getVehicleOverrideLights]]&lt;br /&gt;
*[[getVehiclePaintjob]]&lt;br /&gt;
*[[getVehiclePanelState]]&lt;br /&gt;
*[[getVehiclePlateText]]&lt;br /&gt;
*[[getVehicleSirens]]&lt;br /&gt;
*[[getVehicleSirensOn]]&lt;br /&gt;
*[[getVehicleSirenParams]]&lt;br /&gt;
*[[getVehicleTowedByVehicle]]&lt;br /&gt;
*[[getVehicleTowingVehicle]]&lt;br /&gt;
{{Deprecated items|3.0156|1.5.6|&lt;br /&gt;
*[[getVehicleTurnVelocity]]&lt;br /&gt;
}}&lt;br /&gt;
*[[getVehicleTurretPosition]]&lt;br /&gt;
*[[getVehicleType]]&lt;br /&gt;
*[[getVehicleUpgradeOnSlot]]&lt;br /&gt;
*[[getVehicleUpgradeSlotName]]&lt;br /&gt;
*[[getVehicleUpgrades]]&lt;br /&gt;
*[[getVehicleVariant]]&lt;br /&gt;
*[[getVehicleWheelStates]]&lt;br /&gt;
*[[isTrainChainEngine]]&lt;br /&gt;
*[[isTrainDerailable]]&lt;br /&gt;
*[[isTrainDerailed]]&lt;br /&gt;
*[[isVehicleBlown]]&lt;br /&gt;
*[[isVehicleDamageProof]]&lt;br /&gt;
*[[isVehicleFuelTankExplodable]]&lt;br /&gt;
*[[isVehicleLocked]]&lt;br /&gt;
*[[isVehicleNitroActivated]]&lt;br /&gt;
*[[isVehicleNitroRecharging]]&lt;br /&gt;
*[[isVehicleOnGround]]&lt;br /&gt;
*[[isVehicleTaxiLightOn]]&lt;br /&gt;
{{New items|3.0156|1.5.5|&lt;br /&gt;
*[[isVehicleWheelOnGround]]&lt;br /&gt;
|11854}}&lt;br /&gt;
*[[isVehicleWindowOpen]]&lt;br /&gt;
*[[removeVehicleUpgrade]]&lt;br /&gt;
*[[resetVehicleComponentPosition]]&lt;br /&gt;
*[[resetVehicleComponentRotation]]&lt;br /&gt;
*[[setHeliBladeCollisionsEnabled]]&lt;br /&gt;
*[[setHelicopterRotorSpeed]]&lt;br /&gt;
*[[setTrainDerailable]]&lt;br /&gt;
*[[setTrainDerailed]]&lt;br /&gt;
*[[setTrainDirection]]&lt;br /&gt;
*[[setTrainPosition]]&lt;br /&gt;
*[[setTrainSpeed]]&lt;br /&gt;
{{New items|3.0160|1.6|&lt;br /&gt;
*[[setTrainTrack]]&lt;br /&gt;
|7485}}&lt;br /&gt;
*[[setVehicleAdjustableProperty]]&lt;br /&gt;
*[[setVehicleColor]]&lt;br /&gt;
*[[setVehicleComponentPosition]]&lt;br /&gt;
*[[setVehicleComponentRotation]]&lt;br /&gt;
*[[setVehicleComponentVisible]]&lt;br /&gt;
*[[setVehicleDamageProof]]&lt;br /&gt;
*[[setVehicleDirtLevel]]&lt;br /&gt;
*[[setVehicleDoorOpenRatio]]&lt;br /&gt;
*[[setVehicleDoorState]]&lt;br /&gt;
*[[setVehicleDoorsUndamageable]]&lt;br /&gt;
*[[setVehicleEngineState]]&lt;br /&gt;
*[[setVehicleFuelTankExplodable]]&lt;br /&gt;
*[[setVehicleGravity]]&lt;br /&gt;
{{New items|3.0156|1.5.5|&lt;br /&gt;
*[[setVehicleHandling]]&lt;br /&gt;
|12009}}&lt;br /&gt;
*[[setVehicleHeadLightColor]]&lt;br /&gt;
*[[setVehicleLandingGearDown]]&lt;br /&gt;
*[[setVehicleLightState]]&lt;br /&gt;
*[[setVehicleLocked]]&lt;br /&gt;
{{New items|3.0157|1.5.6|&lt;br /&gt;
*[[setVehicleModelDummyPosition]]&lt;br /&gt;
|14403}}&lt;br /&gt;
*[[setVehicleModelExhaustFumesPosition]]&lt;br /&gt;
*[[setVehicleNitroActivated]]&lt;br /&gt;
*[[setVehicleNitroCount]]&lt;br /&gt;
*[[setVehicleNitroLevel]]&lt;br /&gt;
*[[setVehicleOverrideLights]]&lt;br /&gt;
*[[setVehiclePaintjob]]&lt;br /&gt;
*[[setVehiclePanelState]]&lt;br /&gt;
*[[setVehiclePlateText]]&lt;br /&gt;
*[[setVehicleSirens]]&lt;br /&gt;
*[[setVehicleSirensOn]]&lt;br /&gt;
*[[setVehicleTaxiLightOn]]&lt;br /&gt;
{{Deprecated items|3.0156|1.5.6|&lt;br /&gt;
*[[setVehicleTurnVelocity]]&lt;br /&gt;
}}&lt;br /&gt;
*[[setVehicleTurretPosition]]&lt;br /&gt;
*[[setVehicleWheelStates]]&lt;br /&gt;
*[[setVehicleWindowOpen]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[ru:Template:RU/Client_vehicle_functions]]&lt;br /&gt;
[[Category:Functions templates]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=PlaySound3D&amp;diff=62454</id>
		<title>PlaySound3D</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=PlaySound3D&amp;diff=62454"/>
		<updated>2019-04-07T05:40:17Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: Undo revision 62446 by DezZolation (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
{{Client function}}&lt;br /&gt;
Creates a [[sound]] [[element]] in the GTA world and plays it immediately after creation for the local player. [[setElementPosition]] can be used to move the [[sound]] element around after it has been created. Remember to use [[setElementDimension]] after creating the sound to play it outside of dimension 0.&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{{Note|&lt;br /&gt;
*The only supported audio formats are MP3, WAV, OGG, RIFF, MOD, XM, IT and S3M.&lt;br /&gt;
*For performance reasons, when using playSound3D for effects that will be played lots (i.e. weapon fire), it is recommend that you convert your audio file to a one channel (mono) WAV with sample rate of 22050 Hz or less. Also consider adding a limit on how often the effect can be played e.g. once every 50ms.}}&lt;br /&gt;
==Syntax== &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;element playSound3D ( string soundPath, float x, float y, float z, [ bool looped = false ] )&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;element playSound3D ( string soundURL, float x, float y, float z, [ bool looped = false, bool throttled = true ] )&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
{{OOP||[[Sound|Sound3D]]}}&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
*'''soundPath:''' the [[filepath]] to the sound file you want to play. (Sound file has to be predefined in the [[meta.xml]] file with &amp;lt;file /&amp;gt; tag. And also can use url instead of [[filepath]] )&lt;br /&gt;
*'''soundURL:''' the URL. (In this version the file does not has to be predefined in the [[meta.xml]] )&lt;br /&gt;
*'''x:''' a [[float]]ing point number representing the X coordinate on the map.&lt;br /&gt;
*'''y:''' a [[float]]ing point number representing the Y coordinate on the map.&lt;br /&gt;
*'''z:''' a [[float]]ing point number representing the Z coordinate on the map.&lt;br /&gt;
&lt;br /&gt;
===Optional Arguments=== &lt;br /&gt;
{{OptionalArg}} &lt;br /&gt;
*'''looped:''' a [[boolean]] representing whether the sound will be looped. To loop the sound, use ''true''.&lt;br /&gt;
{{New feature/item|3.0150|1.5||&lt;br /&gt;
*'''throttled:''' a [[boolean]] representing whether the sound will be throttled (i.e. given reduced download bandwidth). To throttle the sound, use ''true''.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns a [[sound]] [[element]] if the sound was successfully created, ''false'' otherwise.&lt;br /&gt;
&lt;br /&gt;
==Example== &lt;br /&gt;
This example creates a looping sound within a pizza shop. The pizza shop is in san fierro near pier 69&lt;br /&gt;
&amp;lt;section name=&amp;quot;Example&amp;quot; class=&amp;quot;client&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function onResourceStart()&lt;br /&gt;
	local sound = playSound3D(&amp;quot;sounds/song.mp3&amp;quot;, 373.14, -125.21, 1001, true) &lt;br /&gt;
end&lt;br /&gt;
addEventHandler(&amp;quot;onClientResourceStart&amp;quot;, resourceRoot, onResourceStart)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
This example play internet radio in groove street.&lt;br /&gt;
&amp;lt;section name=&amp;quot;Example 2&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;
addEventHandler( 'onClientResourceStart', resourceRoot,&lt;br /&gt;
	function( )&lt;br /&gt;
		local uSound = playSound3D( 'http://193.34.51.25:80', 2498, -1659, 12 ) &lt;br /&gt;
		setSoundMaxDistance( uSound, 100 )&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;
==See Also==&lt;br /&gt;
{{Client_audio_functions}}&lt;br /&gt;
[[HU:playSound3D]]&lt;br /&gt;
[[AR:playSound3D]]&lt;br /&gt;
[[DE:playSound3D]]&lt;br /&gt;
[[RU:playSound3D]]&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=OnClientPedDamage&amp;diff=61990</id>
		<title>OnClientPedDamage</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=OnClientPedDamage&amp;diff=61990"/>
		<updated>2019-01-16T23:01:45Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Client event}}&lt;br /&gt;
This event is triggered whenever a [[ped]] is damaged.&lt;br /&gt;
{{Note|This event is only triggered for peds that are streamed in}}&lt;br /&gt;
==Parameters==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
element attacker, int weapon, int bodypart [, float loss ]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''attacker''': A [[player]] [[element]] representing the attacker or [[vehicle]] [[element]] (when a ped falls of a bike).&lt;br /&gt;
*'''weapon''': An integer representing the weapon ID the attacker used&lt;br /&gt;
*'''bodypart''': An integer representing the bodypart the ped was damaged&lt;br /&gt;
{{BodyParts}}&lt;br /&gt;
*'''loss''': A float representing the percentage of health the ped lost.&lt;br /&gt;
&lt;br /&gt;
==Source==&lt;br /&gt;
The [[event system#Event source|source]] of this event is the [[ped]] that got damaged&lt;br /&gt;
&lt;br /&gt;
==Cancel effect==&lt;br /&gt;
If this event is [[Event system#Canceling|canceled]], then any damaging effects to the ped will cease.&lt;br /&gt;
&lt;br /&gt;
==Example== &lt;br /&gt;
This example cancels any damage done to peds&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function cancelPedDamage ( attacker )&lt;br /&gt;
	cancelEvent() -- cancel any damage done to peds&lt;br /&gt;
end&lt;br /&gt;
addEventHandler ( &amp;quot;onClientPedDamage&amp;quot;, getRootElement(), cancelPedDamage )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Issues==&lt;br /&gt;
{{Issues|&lt;br /&gt;
{{Issue|8082|(Fixed in r9762) Custom weapons don't fully work with onClientPlayerDamage}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
===Client ped events===&lt;br /&gt;
{{Client_ped_events}}&lt;br /&gt;
===Client event functions===&lt;br /&gt;
{{Client_event_functions}}&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=OnPlayerDamage&amp;diff=61989</id>
		<title>OnPlayerDamage</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=OnPlayerDamage&amp;diff=61989"/>
		<updated>2019-01-16T23:01:32Z</updated>

		<summary type="html">&lt;p&gt;Zver-CR: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
{{Server event}}&lt;br /&gt;
This event is triggered when a player is damaged, in any way.&lt;br /&gt;
&lt;br /&gt;
*This event is not triggered when attacked by a team member if friendly fire is enabled.&lt;br /&gt;
*Canceling this event has no effect. Cancel the client-side event [[onClientPlayerDamage]] instead.&lt;br /&gt;
*onPlayerDamage doesn't trigger if the damage kills the player, [[onPlayerWasted]] is called instead. &lt;br /&gt;
&lt;br /&gt;
==Parameters==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
player attacker, int attackerweapon, int bodypart, float loss&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
*'''attacker''': a [[player]] element representing the player who was the attacker.  If there was no attacker this returns false.&lt;br /&gt;
*'''attackerweapon''': an [[int]] representing the [[Weapons|attacker weapon]] or the [[Damage Types|damage type]].&lt;br /&gt;
*'''bodypart''': an [[int]] representing the bodypart ID the player was hit on when he got damaged.&lt;br /&gt;
{{BodyParts}}&lt;br /&gt;
*'''loss''': a [[float]] representing the percentage of health the player lost.&lt;br /&gt;
&lt;br /&gt;
==Source==&lt;br /&gt;
The [[event system#Event source|source]] of this event is the [[player]] who was damaged.&lt;br /&gt;
&lt;br /&gt;
==Example== &lt;br /&gt;
This example causes an instant kill when a player is shot in the head, and announces it in the chatbox.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
--add an event handler for the onPlayerDamage event&lt;br /&gt;
function playerDamage_text ( attacker, weapon, bodypart, loss ) --when a player is damaged&lt;br /&gt;
	if ( bodypart == 9 ) then -- if the body part is 9, i.e. the head&lt;br /&gt;
            outputChatBox ( &amp;quot;Headshot!&amp;quot;, getRootElement (), 255, 170, 0 ) --output &amp;quot;Headshot&amp;quot; into the chatbox&lt;br /&gt;
	    killPed ( source, attacker, weapon, bodypart ) -- and kill the player&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
addEventHandler ( &amp;quot;onPlayerDamage&amp;quot;, getRootElement (), playerDamage_text )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Issues==&lt;br /&gt;
{{Issues|&lt;br /&gt;
{{Issue|6495|[Fixed in 1.3.3-5411] onPlayerDamage has wrong parameters if source on vehicle}}&lt;br /&gt;
{{Issue|8082|(Fixed in r9762) Custom weapons &amp;amp; objects don't fully work with ped damage events}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{See also/Server event|Player events}}&lt;/div&gt;</summary>
		<author><name>Zver-CR</name></author>
	</entry>
</feed>