<?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=IIYAMA</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=IIYAMA"/>
	<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/wiki/Special:Contributions/IIYAMA"/>
	<updated>2026-04-24T01:01:03Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=81851</id>
		<title>GetScreenStartPositionFromBox</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=81851"/>
		<updated>2025-03-09T16:23:52Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function provides a way to calculate screen positions for UI elements in MTA:SA, particularly useful for positioning dx-effects and creating user interfaces. It uses a box-based positioning system that allows precise control over element placement relative to screen boundaries or center points.&lt;br /&gt;
&lt;br /&gt;
The function calculates the starting position (X,Y coordinates) for drawing elements on the screen based on:&lt;br /&gt;
* A virtual box with defined dimensions (width/height)&lt;br /&gt;
* Desired positioning (left/right/center horizontally, top/bottom/center vertically)&lt;br /&gt;
* Offset values for fine-tuning the position&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
float startX, float startY = getScreenStartPositionFromBox(float width, float height, float offsetX, float offsetY, [string startIndicationX = &amp;quot;left&amp;quot;, string startIndicationY = &amp;quot;top&amp;quot;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''width:''' The width of the virtual box in pixels&lt;br /&gt;
  Can be 0, though using actual element dimensions is recommended&lt;br /&gt;
  Used for calculating center and right-aligned positions&lt;br /&gt;
* '''height:''' The height of the virtual box in pixels&lt;br /&gt;
  Can be 0, though using actual element dimensions is recommended&lt;br /&gt;
  Used for calculating center and bottom-aligned positions&lt;br /&gt;
* '''offsetX:''' Horizontal offset from the calculated position&lt;br /&gt;
  For &amp;quot;left&amp;quot;/&amp;quot;center&amp;quot;: Positive values move right&lt;br /&gt;
  For &amp;quot;right&amp;quot;: Positive values move left&lt;br /&gt;
* '''offsetY:''' Vertical offset from the calculated position&lt;br /&gt;
  For &amp;quot;top&amp;quot;/&amp;quot;center&amp;quot;: Positive values move down&lt;br /&gt;
  For &amp;quot;bottom&amp;quot;: Positive values move up&lt;br /&gt;
&lt;br /&gt;
===Optional Arguments===&lt;br /&gt;
* '''startIndicationX:''' Horizontal positioning mode&lt;br /&gt;
  Default: &amp;quot;left&amp;quot;&lt;br /&gt;
  Valid values:&lt;br /&gt;
    - &amp;quot;left&amp;quot;: Aligns to left screen edge&lt;br /&gt;
    - &amp;quot;right&amp;quot;: Aligns to right screen edge&lt;br /&gt;
    - &amp;quot;center&amp;quot;: Centers horizontally on screen&lt;br /&gt;
* '''startIndicationY:''' Vertical positioning mode&lt;br /&gt;
  Default: &amp;quot;top&amp;quot;&lt;br /&gt;
  Valid values:&lt;br /&gt;
    - &amp;quot;top&amp;quot;: Aligns to top screen edge&lt;br /&gt;
    - &amp;quot;bottom&amp;quot;: Aligns to bottom screen edge&lt;br /&gt;
    - &amp;quot;center&amp;quot;: Centers vertically on screen&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns two values:&lt;br /&gt;
* '''startX:''' The calculated X coordinate for drawing&lt;br /&gt;
* '''startY:''' The calculated Y coordinate for drawing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Behavior position calculation===&lt;br /&gt;
* Left alignment: startX = offsetX&lt;br /&gt;
* Right alignment: startX = screenWidth - (width + offsetX)&lt;br /&gt;
* Center X alignment: startX = (screenWidth / 2) - (width / 2) + offsetX&lt;br /&gt;
* Top alignment: startY = offsetY&lt;br /&gt;
* Bottom alignment: startY = screenHeight - (height + offsetY)&lt;br /&gt;
* Center Y alignment: startY = (screenHeight / 2) - (height / 2) + offsetY&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Clientside Script&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;
do&lt;br /&gt;
	local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
	function getScreenStartPositionFromBox (width, height, offsetX, offsetY, startIndicationX, startIndicationY)&lt;br /&gt;
	&lt;br /&gt;
		local startX = offsetX &lt;br /&gt;
		local startY = offsetY&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationX == &amp;quot;right&amp;quot; then&lt;br /&gt;
			startX = screenX - (width + offsetX)&lt;br /&gt;
		elseif startIndicationX == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startX = screenX / 2 - width / 2 + offsetX&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationY == &amp;quot;bottom&amp;quot; then&lt;br /&gt;
			startY = screenY - (height + offsetY)&lt;br /&gt;
		elseif startIndicationY == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startY = screenY / 2 - height / 2 + offsetY&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return startX, startY&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
--[[&lt;br /&gt;
	Draw a rectangle on the left-bottom of the screen.&lt;br /&gt;
	The offset from the bottom and left is 100 pixels.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	-- Note: The following values are not scaled. See second example for how to scale it for all screen resolutions.&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400, 200&lt;br /&gt;
	&lt;br /&gt;
	local startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 100, 100, &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;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;
&lt;br /&gt;
--[[&lt;br /&gt;
	Scale for all screens&lt;br /&gt;
]]&lt;br /&gt;
-- Your resolution as developer.&lt;br /&gt;
local devScreenX = 1920&lt;br /&gt;
local devScreenY = 1080&lt;br /&gt;
&lt;br /&gt;
-- The current resolution of the client&lt;br /&gt;
local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
-- Get the scale value&lt;br /&gt;
local scaleValue = screenY / devScreenY&lt;br /&gt;
&lt;br /&gt;
-- Set an upper limit, so that it isn't scaled too small.&lt;br /&gt;
scaleValue = math.max(scaleValue, 0.65)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400 * scaleValue, 200 * scaleValue&lt;br /&gt;
	local offsetX = 100 * scaleValue&lt;br /&gt;
	local offsetY = 100 * scaleValue&lt;br /&gt;
	&lt;br /&gt;
	local startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offsetX, offsetY, &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;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;
&lt;br /&gt;
--[[&lt;br /&gt;
	Scale for all screens&lt;br /&gt;
]]&lt;br /&gt;
-- Your resolution as developer.&lt;br /&gt;
local devScreenX = 1920&lt;br /&gt;
local devScreenY = 1080&lt;br /&gt;
&lt;br /&gt;
-- The current resolution of the client&lt;br /&gt;
local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
-- Get the scale value&lt;br /&gt;
local scaleValue = screenY / devScreenY&lt;br /&gt;
&lt;br /&gt;
-- Set an upper limit, so that it isn't scaled too small.&lt;br /&gt;
scaleValue = math.max(scaleValue, 0.65)&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Start drawing:&lt;br /&gt;
]]&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	-- Scale the dimensions:&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400 * scaleValue, 200 * scaleValue &lt;br /&gt;
	local offSetX, offsetY = 50 * scaleValue, 50 * scaleValue&lt;br /&gt;
	&lt;br /&gt;
	-- Start drawing at the correct position:&lt;br /&gt;
	local startX, startY &lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; top&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;left&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; top&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;right&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; bottom&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; bottom&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;left&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; center&lt;br /&gt;
		Note: offsetY is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, 0, &amp;quot;left&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; center&lt;br /&gt;
		Note: offsetY is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, 0, &amp;quot;right&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; top&lt;br /&gt;
		Note: offsetX is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, offsetY, &amp;quot;center&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; bottom&lt;br /&gt;
		Note: offsetX is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, offsetY, &amp;quot;center&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; center&lt;br /&gt;
		Note: offsetX and offsetY are 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, 0, &amp;quot;center&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), 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;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=81850</id>
		<title>GetScreenStartPositionFromBox</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=81850"/>
		<updated>2025-03-09T11:55:39Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function provides a way to calculate screen positions for UI elements in MTA:SA, particularly useful for positioning dx-effects and creating responsive user interfaces. It uses a box-based positioning system that allows precise control over element placement relative to screen boundaries or center points.&lt;br /&gt;
&lt;br /&gt;
The function calculates the starting position (X,Y coordinates) for drawing elements on the screen based on:&lt;br /&gt;
* A virtual box with defined dimensions (width/height)&lt;br /&gt;
* Desired positioning (left/right/center horizontally, top/bottom/center vertically)&lt;br /&gt;
* Offset values for fine-tuning the position&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
float startX, float startY = getScreenStartPositionFromBox(float width, float height, float offsetX, float offsetY, [string startIndicationX = &amp;quot;left&amp;quot;, string startIndicationY = &amp;quot;top&amp;quot;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''width:''' The width of the virtual box in pixels&lt;br /&gt;
  Can be 0, though using actual element dimensions is recommended&lt;br /&gt;
  Used for calculating center and right-aligned positions&lt;br /&gt;
* '''height:''' The height of the virtual box in pixels&lt;br /&gt;
  Can be 0, though using actual element dimensions is recommended&lt;br /&gt;
  Used for calculating center and bottom-aligned positions&lt;br /&gt;
* '''offsetX:''' Horizontal offset from the calculated position&lt;br /&gt;
  For &amp;quot;left&amp;quot;/&amp;quot;center&amp;quot;: Positive values move right&lt;br /&gt;
  For &amp;quot;right&amp;quot;: Positive values move left&lt;br /&gt;
* '''offsetY:''' Vertical offset from the calculated position&lt;br /&gt;
  For &amp;quot;top&amp;quot;/&amp;quot;center&amp;quot;: Positive values move down&lt;br /&gt;
  For &amp;quot;bottom&amp;quot;: Positive values move up&lt;br /&gt;
&lt;br /&gt;
===Optional Arguments===&lt;br /&gt;
* '''startIndicationX:''' Horizontal positioning mode&lt;br /&gt;
  Default: &amp;quot;left&amp;quot;&lt;br /&gt;
  Valid values:&lt;br /&gt;
    - &amp;quot;left&amp;quot;: Aligns to left screen edge&lt;br /&gt;
    - &amp;quot;right&amp;quot;: Aligns to right screen edge&lt;br /&gt;
    - &amp;quot;center&amp;quot;: Centers horizontally on screen&lt;br /&gt;
* '''startIndicationY:''' Vertical positioning mode&lt;br /&gt;
  Default: &amp;quot;top&amp;quot;&lt;br /&gt;
  Valid values:&lt;br /&gt;
    - &amp;quot;top&amp;quot;: Aligns to top screen edge&lt;br /&gt;
    - &amp;quot;bottom&amp;quot;: Aligns to bottom screen edge&lt;br /&gt;
    - &amp;quot;center&amp;quot;: Centers vertically on screen&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns two values:&lt;br /&gt;
* '''startX:''' The calculated X coordinate for drawing&lt;br /&gt;
* '''startY:''' The calculated Y coordinate for drawing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Behavior position calculation===&lt;br /&gt;
* Left alignment: startX = offsetX&lt;br /&gt;
* Right alignment: startX = screenWidth - (width + offsetX)&lt;br /&gt;
* Center X alignment: startX = (screenWidth / 2) - (width / 2) + offsetX&lt;br /&gt;
* Top alignment: startY = offsetY&lt;br /&gt;
* Bottom alignment: startY = screenHeight - (height + offsetY)&lt;br /&gt;
* Center Y alignment: startY = (screenHeight / 2) - (height / 2) + offsetY&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Clientside Script&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;
do&lt;br /&gt;
	local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
	function getScreenStartPositionFromBox (width, height, offsetX, offsetY, startIndicationX, startIndicationY)&lt;br /&gt;
	&lt;br /&gt;
		local startX = offsetX &lt;br /&gt;
		local startY = offsetY&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationX == &amp;quot;right&amp;quot; then&lt;br /&gt;
			startX = screenX - (width + offsetX)&lt;br /&gt;
		elseif startIndicationX == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startX = screenX / 2 - width / 2 + offsetX&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationY == &amp;quot;bottom&amp;quot; then&lt;br /&gt;
			startY = screenY - (height + offsetY)&lt;br /&gt;
		elseif startIndicationY == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startY = screenY / 2 - height / 2 + offsetY&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return startX, startY&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
--[[&lt;br /&gt;
	Draw a rectangle on the left-bottom of the screen.&lt;br /&gt;
	The offset from the bottom and left is 100 pixels.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	-- Note: The following values are not scaled. See second example for how to scale it for all screen resolutions.&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400, 200&lt;br /&gt;
	&lt;br /&gt;
	local startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 100, 100, &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;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;
&lt;br /&gt;
--[[&lt;br /&gt;
	Scale for all screens&lt;br /&gt;
]]&lt;br /&gt;
-- Your resolution as developer.&lt;br /&gt;
local devScreenX = 1920&lt;br /&gt;
local devScreenY = 1080&lt;br /&gt;
&lt;br /&gt;
-- The current resolution of the client&lt;br /&gt;
local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
-- Get the scale value&lt;br /&gt;
local scaleValue = screenY / devScreenY&lt;br /&gt;
&lt;br /&gt;
-- Set an upper limit, so that it isn't scaled too small.&lt;br /&gt;
scaleValue = math.max(scaleValue, 0.65)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400 * scaleValue, 200 * scaleValue&lt;br /&gt;
	local offsetX = 100 * scaleValue&lt;br /&gt;
	local offsetY = 100 * scaleValue&lt;br /&gt;
	&lt;br /&gt;
	local startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offsetX, offsetY, &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;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;
&lt;br /&gt;
--[[&lt;br /&gt;
	Scale for all screens&lt;br /&gt;
]]&lt;br /&gt;
-- Your resolution as developer.&lt;br /&gt;
local devScreenX = 1920&lt;br /&gt;
local devScreenY = 1080&lt;br /&gt;
&lt;br /&gt;
-- The current resolution of the client&lt;br /&gt;
local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
-- Get the scale value&lt;br /&gt;
local scaleValue = screenY / devScreenY&lt;br /&gt;
&lt;br /&gt;
-- Set an upper limit, so that it isn't scaled too small.&lt;br /&gt;
scaleValue = math.max(scaleValue, 0.65)&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Start drawing:&lt;br /&gt;
]]&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	-- Scale the dimensions:&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400 * scaleValue, 200 * scaleValue &lt;br /&gt;
	local offSetX, offsetY = 50 * scaleValue, 50 * scaleValue&lt;br /&gt;
	&lt;br /&gt;
	-- Start drawing at the correct position:&lt;br /&gt;
	local startX, startY &lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; top&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;left&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; top&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;right&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; bottom&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; bottom&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;left&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; center&lt;br /&gt;
		Note: offsetY is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, 0, &amp;quot;left&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; center&lt;br /&gt;
		Note: offsetY is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, 0, &amp;quot;right&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; top&lt;br /&gt;
		Note: offsetX is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, offsetY, &amp;quot;center&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; bottom&lt;br /&gt;
		Note: offsetX is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, offsetY, &amp;quot;center&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; center&lt;br /&gt;
		Note: offsetX and offsetY are 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, 0, &amp;quot;center&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), 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;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=81849</id>
		<title>GetScreenStartPositionFromBox</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=81849"/>
		<updated>2025-03-09T11:54:01Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function provides a way to calculate screen positions for UI elements in MTA:SA, particularly useful for positioning dx-effects and creating responsive user interfaces. It uses a box-based positioning system that allows precise control over element placement relative to screen boundaries or center points.&lt;br /&gt;
&lt;br /&gt;
The function calculates the starting position (X,Y coordinates) for drawing elements on the screen based on:&lt;br /&gt;
* A virtual box with defined dimensions (width/height)&lt;br /&gt;
* Desired positioning (left/right/center horizontally, top/bottom/center vertically)&lt;br /&gt;
* Offset values for fine-tuning the position&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
float startX, float startY = getScreenStartPositionFromBox(float width, float height, float offsetX, float offsetY, [string startIndicationX = &amp;quot;left&amp;quot;, string startIndicationY = &amp;quot;top&amp;quot;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''width:''' The width of the virtual box in pixels&lt;br /&gt;
  Can be 0, though using actual element dimensions is recommended&lt;br /&gt;
  Used for calculating center and right-aligned positions&lt;br /&gt;
* '''height:''' The height of the virtual box in pixels&lt;br /&gt;
  Can be 0, though using actual element dimensions is recommended&lt;br /&gt;
  Used for calculating center and bottom-aligned positions&lt;br /&gt;
* '''offsetX:''' Horizontal offset from the calculated position&lt;br /&gt;
  For &amp;quot;left&amp;quot;/&amp;quot;center&amp;quot;: Positive values move right&lt;br /&gt;
  For &amp;quot;right&amp;quot;: Positive values move left&lt;br /&gt;
* '''offsetY:''' Vertical offset from the calculated position&lt;br /&gt;
  For &amp;quot;top&amp;quot;/&amp;quot;center&amp;quot;: Positive values move down&lt;br /&gt;
  For &amp;quot;bottom&amp;quot;: Positive values move up&lt;br /&gt;
&lt;br /&gt;
===Optional Arguments===&lt;br /&gt;
* '''startIndicationX:''' Horizontal positioning mode&lt;br /&gt;
  Default: &amp;quot;left&amp;quot;&lt;br /&gt;
  Valid values:&lt;br /&gt;
    - &amp;quot;left&amp;quot;: Aligns to left screen edge&lt;br /&gt;
    - &amp;quot;right&amp;quot;: Aligns to right screen edge&lt;br /&gt;
    - &amp;quot;center&amp;quot;: Centers horizontally on screen&lt;br /&gt;
* '''startIndicationY:''' Vertical positioning mode&lt;br /&gt;
  Default: &amp;quot;top&amp;quot;&lt;br /&gt;
  Valid values:&lt;br /&gt;
    - &amp;quot;top&amp;quot;: Aligns to top screen edge&lt;br /&gt;
    - &amp;quot;bottom&amp;quot;: Aligns to bottom screen edge&lt;br /&gt;
    - &amp;quot;center&amp;quot;: Centers vertically on screen&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns two values:&lt;br /&gt;
* '''startX:''' The calculated X coordinate for drawing&lt;br /&gt;
* '''startY:''' The calculated Y coordinate for drawing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Behavior position calculation===&lt;br /&gt;
* Left alignment: startX = offsetX&lt;br /&gt;
* Right alignment: startX = screenWidth - (width + offsetX)&lt;br /&gt;
* Center X alignment: startX = (screenWidth / 2) - (width / 2) + offsetX&lt;br /&gt;
* Top alignment: startY = offsetY&lt;br /&gt;
* Bottom alignment: startY = screenHeight - (height + offsetY)&lt;br /&gt;
* Center Y alignment: startY = (screenHeight / 2) - (height / 2) + offsetY&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Clientside Script&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;
do&lt;br /&gt;
	local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
	function getScreenStartPositionFromBox (width, height, offsetX, offsetY, startIndicationX, startIndicationY)&lt;br /&gt;
	&lt;br /&gt;
		local startX = offsetX &lt;br /&gt;
		local startY = offsetY&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationX == &amp;quot;right&amp;quot; then&lt;br /&gt;
			startX = screenX - (width + offsetX)&lt;br /&gt;
		elseif startIndicationX == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startX = screenX / 2 - width / 2 + offsetX&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationY == &amp;quot;bottom&amp;quot; then&lt;br /&gt;
			startY = screenY - (height + offsetY)&lt;br /&gt;
		elseif startIndicationY == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startY = screenY / 2 - height / 2 + offsetY&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return startX, startY&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
--[[&lt;br /&gt;
	Draw a rectangle on the left-bottom of the screen.&lt;br /&gt;
	The offset from the bottom and left is 100 pixels.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	-- Note: The following values are not scaled. See second example for how to scale it for all screen resolutions.&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400, 200&lt;br /&gt;
	&lt;br /&gt;
	local startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 100, 100, &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;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;
&lt;br /&gt;
--[[&lt;br /&gt;
	Scale for all screens&lt;br /&gt;
]]&lt;br /&gt;
-- Your resolution as developer.&lt;br /&gt;
local devScreenX = 1920&lt;br /&gt;
local devScreenY = 1080&lt;br /&gt;
&lt;br /&gt;
-- The current resolution of the client&lt;br /&gt;
local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
-- Get the scale value&lt;br /&gt;
local scaleValue = screenY / devScreenY&lt;br /&gt;
&lt;br /&gt;
-- Set an upper limit, so that it isn't scaled too small.&lt;br /&gt;
scaleValue = math.max(scaleValue, 0.65)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400 * scaleValue, 200 * scaleValue&lt;br /&gt;
	&lt;br /&gt;
	local startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 100 * scaleValue, 100 * scaleValue, &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;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;
&lt;br /&gt;
--[[&lt;br /&gt;
	Scale for all screens&lt;br /&gt;
]]&lt;br /&gt;
-- Your resolution as developer.&lt;br /&gt;
local devScreenX = 1920&lt;br /&gt;
local devScreenY = 1080&lt;br /&gt;
&lt;br /&gt;
-- The current resolution of the client&lt;br /&gt;
local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
-- Get the scale value&lt;br /&gt;
local scaleValue = screenY / devScreenY&lt;br /&gt;
&lt;br /&gt;
-- Set an upper limit, so that it isn't scaled too small.&lt;br /&gt;
scaleValue = math.max(scaleValue, 0.65)&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Start drawing:&lt;br /&gt;
]]&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	-- Scale the dimensions:&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400 * scaleValue, 200 * scaleValue &lt;br /&gt;
	local offSetX, offsetY = 50 * scaleValue, 50 * scaleValue&lt;br /&gt;
	&lt;br /&gt;
	-- Start drawing at the correct position:&lt;br /&gt;
	local startX, startY &lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; top&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;left&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; top&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;right&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; bottom&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; bottom&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;left&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; center&lt;br /&gt;
		Note: offsetY is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, 0, &amp;quot;left&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; center&lt;br /&gt;
		Note: offsetY is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, 0, &amp;quot;right&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; top&lt;br /&gt;
		Note: offsetX is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, offsetY, &amp;quot;center&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; bottom&lt;br /&gt;
		Note: offsetX is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, offsetY, &amp;quot;center&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; center&lt;br /&gt;
		Note: offsetX and offsetY are 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, 0, &amp;quot;center&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), 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;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=81848</id>
		<title>GetScreenStartPositionFromBox</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=81848"/>
		<updated>2025-03-09T11:47:50Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: Remove extra validation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function provides a way to calculate screen positions for UI elements in MTA:SA, particularly useful for positioning dx-effects and creating responsive user interfaces. It uses a box-based positioning system that allows precise control over element placement relative to screen boundaries or center points.&lt;br /&gt;
&lt;br /&gt;
The function calculates the starting position (X,Y coordinates) for drawing elements on the screen based on:&lt;br /&gt;
* A virtual box with defined dimensions (width/height)&lt;br /&gt;
* Desired positioning (left/right/center horizontally, top/bottom/center vertically)&lt;br /&gt;
* Offset values for fine-tuning the position&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
float startX, float startY = getScreenStartPositionFromBox(float width, float height, float offsetX, float offsetY, [string startIndicationX = &amp;quot;left&amp;quot;, string startIndicationY = &amp;quot;top&amp;quot;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''width:''' The width of the virtual box in pixels&lt;br /&gt;
  Can be 0, though using actual element dimensions is recommended&lt;br /&gt;
  Used for calculating center and right-aligned positions&lt;br /&gt;
* '''height:''' The height of the virtual box in pixels&lt;br /&gt;
  Can be 0, though using actual element dimensions is recommended&lt;br /&gt;
  Used for calculating center and bottom-aligned positions&lt;br /&gt;
* '''offsetX:''' Horizontal offset from the calculated position&lt;br /&gt;
  For &amp;quot;left&amp;quot;/&amp;quot;center&amp;quot;: Positive values move right&lt;br /&gt;
  For &amp;quot;right&amp;quot;: Positive values move left&lt;br /&gt;
* '''offsetY:''' Vertical offset from the calculated position&lt;br /&gt;
  For &amp;quot;top&amp;quot;/&amp;quot;center&amp;quot;: Positive values move down&lt;br /&gt;
  For &amp;quot;bottom&amp;quot;: Positive values move up&lt;br /&gt;
&lt;br /&gt;
===Optional Arguments===&lt;br /&gt;
* '''startIndicationX:''' Horizontal positioning mode&lt;br /&gt;
  Default: &amp;quot;left&amp;quot;&lt;br /&gt;
  Valid values:&lt;br /&gt;
    - &amp;quot;left&amp;quot;: Aligns to left screen edge&lt;br /&gt;
    - &amp;quot;right&amp;quot;: Aligns to right screen edge&lt;br /&gt;
    - &amp;quot;center&amp;quot;: Centers horizontally on screen&lt;br /&gt;
* '''startIndicationY:''' Vertical positioning mode&lt;br /&gt;
  Default: &amp;quot;top&amp;quot;&lt;br /&gt;
  Valid values:&lt;br /&gt;
    - &amp;quot;top&amp;quot;: Aligns to top screen edge&lt;br /&gt;
    - &amp;quot;bottom&amp;quot;: Aligns to bottom screen edge&lt;br /&gt;
    - &amp;quot;center&amp;quot;: Centers vertically on screen&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns two values:&lt;br /&gt;
* '''startX:''' The calculated X coordinate for drawing&lt;br /&gt;
* '''startY:''' The calculated Y coordinate for drawing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Behavior position calculation===&lt;br /&gt;
* Left alignment: startX = offsetX&lt;br /&gt;
* Right alignment: startX = screenWidth - (width + offsetX)&lt;br /&gt;
* Center X alignment: startX = (screenWidth / 2) - (width / 2) + offsetX&lt;br /&gt;
* Top alignment: startY = offsetY&lt;br /&gt;
* Bottom alignment: startY = screenHeight - (height + offsetY)&lt;br /&gt;
* Center Y alignment: startY = (screenHeight / 2) - (height / 2) + offsetY&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Clientside Script&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;
do&lt;br /&gt;
	local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
	function getScreenStartPositionFromBox (width, height, offsetX, offsetY, startIndicationX, startIndicationY)&lt;br /&gt;
	&lt;br /&gt;
		local startX = offsetX &lt;br /&gt;
		local startY = offsetY&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationX == &amp;quot;right&amp;quot; then&lt;br /&gt;
			startX = screenX - (width + offsetX)&lt;br /&gt;
		elseif startIndicationX == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startX = screenX / 2 - width / 2 + offsetX&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationY == &amp;quot;bottom&amp;quot; then&lt;br /&gt;
			startY = screenY - (height + offsetY)&lt;br /&gt;
		elseif startIndicationY == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startY = screenY / 2 - height / 2 + offsetY&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return startX, startY&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
--[[&lt;br /&gt;
	Draw a rectangle on the left-bottom of the screen.&lt;br /&gt;
	The offset from the bottom and left is 100 pixels.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	-- Note: The following values are not scaled. See second example for how to scale it for all screen resolutions.&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400, 200&lt;br /&gt;
	&lt;br /&gt;
	local startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 100, 100, &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
--[[&lt;br /&gt;
	- Scaled version for all screen resolutions&lt;br /&gt;
	- Multiple rectangles&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Prepare the scale multiplier:&lt;br /&gt;
]]&lt;br /&gt;
-- Your resolution as developer.&lt;br /&gt;
local devScreenX = 1920&lt;br /&gt;
local devScreenY = 1080&lt;br /&gt;
&lt;br /&gt;
-- The current resolution of the client&lt;br /&gt;
local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
-- Get the scale value&lt;br /&gt;
local scaleValue = screenY / devScreenY&lt;br /&gt;
&lt;br /&gt;
-- Set an upper limit, so that it isn't scaled too small.&lt;br /&gt;
scaleValue = math.max(scaleValue, 0.65)&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Start drawing:&lt;br /&gt;
]]&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	-- Scale the dimensions:&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400 * scaleValue, 200 * scaleValue &lt;br /&gt;
	local offSetX, offsetY = 50 * scaleValue, 50 * scaleValue&lt;br /&gt;
	&lt;br /&gt;
	-- Start drawing at the correct position:&lt;br /&gt;
	local startX, startY &lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; top&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;left&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; top&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;right&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; bottom&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; bottom&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;left&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; center&lt;br /&gt;
		Note: offsetY is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, 0, &amp;quot;left&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; center&lt;br /&gt;
		Note: offsetY is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, 0, &amp;quot;right&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; top&lt;br /&gt;
		Note: offsetX is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, offsetY, &amp;quot;center&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; bottom&lt;br /&gt;
		Note: offsetX is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, offsetY, &amp;quot;center&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; center&lt;br /&gt;
		Note: offsetX and offsetY are 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, 0, &amp;quot;center&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), 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;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=81847</id>
		<title>GetScreenStartPositionFromBox</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=81847"/>
		<updated>2025-03-09T11:45:19Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function provides a way to calculate screen positions for UI elements in MTA:SA, particularly useful for positioning dx-effects and creating responsive user interfaces. It uses a box-based positioning system that allows precise control over element placement relative to screen boundaries or center points.&lt;br /&gt;
&lt;br /&gt;
The function calculates the starting position (X,Y coordinates) for drawing elements on the screen based on:&lt;br /&gt;
* A virtual box with defined dimensions (width/height)&lt;br /&gt;
* Desired positioning (left/right/center horizontally, top/bottom/center vertically)&lt;br /&gt;
* Offset values for fine-tuning the position&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
float startX, float startY = getScreenStartPositionFromBox(float width, float height, float offsetX, float offsetY, [string startIndicationX = &amp;quot;left&amp;quot;, string startIndicationY = &amp;quot;top&amp;quot;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''width:''' The width of the virtual box in pixels&lt;br /&gt;
  Can be 0, though using actual element dimensions is recommended&lt;br /&gt;
  Used for calculating center and right-aligned positions&lt;br /&gt;
* '''height:''' The height of the virtual box in pixels&lt;br /&gt;
  Can be 0, though using actual element dimensions is recommended&lt;br /&gt;
  Used for calculating center and bottom-aligned positions&lt;br /&gt;
* '''offsetX:''' Horizontal offset from the calculated position&lt;br /&gt;
  For &amp;quot;left&amp;quot;/&amp;quot;center&amp;quot;: Positive values move right&lt;br /&gt;
  For &amp;quot;right&amp;quot;: Positive values move left&lt;br /&gt;
* '''offsetY:''' Vertical offset from the calculated position&lt;br /&gt;
  For &amp;quot;top&amp;quot;/&amp;quot;center&amp;quot;: Positive values move down&lt;br /&gt;
  For &amp;quot;bottom&amp;quot;: Positive values move up&lt;br /&gt;
&lt;br /&gt;
===Optional Arguments===&lt;br /&gt;
* '''startIndicationX:''' Horizontal positioning mode&lt;br /&gt;
  Default: &amp;quot;left&amp;quot;&lt;br /&gt;
  Valid values:&lt;br /&gt;
    - &amp;quot;left&amp;quot;: Aligns to left screen edge&lt;br /&gt;
    - &amp;quot;right&amp;quot;: Aligns to right screen edge&lt;br /&gt;
    - &amp;quot;center&amp;quot;: Centers horizontally on screen&lt;br /&gt;
* '''startIndicationY:''' Vertical positioning mode&lt;br /&gt;
  Default: &amp;quot;top&amp;quot;&lt;br /&gt;
  Valid values:&lt;br /&gt;
    - &amp;quot;top&amp;quot;: Aligns to top screen edge&lt;br /&gt;
    - &amp;quot;bottom&amp;quot;: Aligns to bottom screen edge&lt;br /&gt;
    - &amp;quot;center&amp;quot;: Centers vertically on screen&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns two values:&lt;br /&gt;
* '''startX:''' The calculated X coordinate for drawing&lt;br /&gt;
* '''startY:''' The calculated Y coordinate for drawing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Behavior position calculation===&lt;br /&gt;
* Left alignment: startX = offsetX&lt;br /&gt;
* Right alignment: startX = screenWidth - (width + offsetX)&lt;br /&gt;
* Center X alignment: startX = (screenWidth / 2) - (width / 2) + offsetX&lt;br /&gt;
* Top alignment: startY = offsetY&lt;br /&gt;
* Bottom alignment: startY = screenHeight - (height + offsetY)&lt;br /&gt;
* Center Y alignment: startY = (screenHeight / 2) - (height / 2) + offsetY&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Clientside Script&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;
do&lt;br /&gt;
	local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
	function getScreenStartPositionFromBox (width, height, offsetX, offsetY, startIndicationX, startIndicationY)&lt;br /&gt;
	&lt;br /&gt;
		if type(width) ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			width = 0&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if type(height) ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			height = 0&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if type(offsetX) ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			offsetX = 0&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if type(offsetY) ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			offsetY = 0&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local startX = offsetX &lt;br /&gt;
		local startY = offsetY&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationX == &amp;quot;right&amp;quot; then&lt;br /&gt;
			startX = screenX - (width + offsetX)&lt;br /&gt;
		elseif startIndicationX == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startX = screenX / 2 - width / 2 + offsetX&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationY == &amp;quot;bottom&amp;quot; then&lt;br /&gt;
			startY = screenY - (height + offsetY)&lt;br /&gt;
		elseif startIndicationY == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startY = screenY / 2 - height / 2 + offsetY&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return startX, startY&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
--[[&lt;br /&gt;
	Draw a rectangle on the left-bottom of the screen.&lt;br /&gt;
	The offset from the bottom and left is 100 pixels.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	-- Note: The following values are not scaled. See second example for how to scale it for all screen resolutions.&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400, 200&lt;br /&gt;
	&lt;br /&gt;
	local startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 100, 100, &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
--[[&lt;br /&gt;
	- Scaled version for all screen resolutions&lt;br /&gt;
	- Multiple rectangles&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Prepare the scale multiplier:&lt;br /&gt;
]]&lt;br /&gt;
-- Your resolution as developer.&lt;br /&gt;
local devScreenX = 1920&lt;br /&gt;
local devScreenY = 1080&lt;br /&gt;
&lt;br /&gt;
-- The current resolution of the client&lt;br /&gt;
local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
-- Get the scale value&lt;br /&gt;
local scaleValue = screenY / devScreenY&lt;br /&gt;
&lt;br /&gt;
-- Set an upper limit, so that it isn't scaled too small.&lt;br /&gt;
scaleValue = math.max(scaleValue, 0.65)&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Start drawing:&lt;br /&gt;
]]&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	-- Scale the dimensions:&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400 * scaleValue, 200 * scaleValue &lt;br /&gt;
	local offSetX, offsetY = 50 * scaleValue, 50 * scaleValue&lt;br /&gt;
	&lt;br /&gt;
	-- Start drawing at the correct position:&lt;br /&gt;
	local startX, startY &lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; top&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;left&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; top&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;right&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; bottom&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; bottom&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;left&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; center&lt;br /&gt;
		Note: offsetY is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, 0, &amp;quot;left&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; center&lt;br /&gt;
		Note: offsetY is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, 0, &amp;quot;right&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; top&lt;br /&gt;
		Note: offsetX is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, offsetY, &amp;quot;center&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; bottom&lt;br /&gt;
		Note: offsetX is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, offsetY, &amp;quot;center&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; center&lt;br /&gt;
		Note: offsetX and offsetY are 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, 0, &amp;quot;center&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), 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;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=80060</id>
		<title>GetScreenStartPositionFromBox</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=80060"/>
		<updated>2024-08-22T22:44:50Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function can be used to position dx-effects on your screen. The function requires you to create a box. This box exist out of the dimensions width/height and a X/Y position. The box is used to help with positioning dx-effects that do have a width/height. The box can have 0 width and 0 height, but it is recommended to fill those in with the dimensions of the dx-effect you want to draw.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
float startX, float startY = getScreenStartPositionFromBox(float width, float height, float offsetX, float offsetY, [string startIndicationX = &amp;quot;left&amp;quot;, string startIndicationY = &amp;quot;top&amp;quot;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''width:''' The width of the box.&lt;br /&gt;
* '''height:''' The height of the box.&lt;br /&gt;
* '''offsetX:'''The offset from it's current position. (&amp;quot;left&amp;quot;/&amp;quot;center&amp;quot; startIndicationX = offset added.) (&amp;quot;right&amp;quot; startIndicationX = offset subtracted.)&lt;br /&gt;
* '''offsetY:''' The offset from it's current position. (&amp;quot;top&amp;quot;/&amp;quot;center&amp;quot; startIndicationY = offset added.) (&amp;quot;bottom&amp;quot; startIndicationY = offset subtracted.)&lt;br /&gt;
* '''startIndicationX:''' The X position of the box: &amp;quot;left&amp;quot;, &amp;quot;right&amp;quot;, &amp;quot;center&amp;quot;&lt;br /&gt;
* '''startIndicationY:''' The Y position of the box: &amp;quot;top&amp;quot;, &amp;quot;bottom&amp;quot;, &amp;quot;center&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns 2 values:&lt;br /&gt;
* '''startX:''' Start X position&lt;br /&gt;
* '''startY:''' Start Y position&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Clientside Script&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;
do&lt;br /&gt;
	local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
	function getScreenStartPositionFromBox (width, height, offsetX, offsetY, startIndicationX, startIndicationY)&lt;br /&gt;
	&lt;br /&gt;
		if type(width) ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			width = 0&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if type(height) ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			height = 0&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if type(offsetX) ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			offsetX = 0&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if type(offsetY) ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			offsetY = 0&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local startX = offsetX &lt;br /&gt;
		local startY = offsetY&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationX == &amp;quot;right&amp;quot; then&lt;br /&gt;
			startX = screenX - (width + offsetX)&lt;br /&gt;
		elseif startIndicationX == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startX = screenX / 2 - width / 2 + offsetX&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationY == &amp;quot;bottom&amp;quot; then&lt;br /&gt;
			startY = screenY - (height + offsetY)&lt;br /&gt;
		elseif startIndicationY == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startY = screenY / 2 - height / 2 + offsetY&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return startX, startY&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
--[[&lt;br /&gt;
	Draw a rectangle on the left-bottom of the screen.&lt;br /&gt;
	The offset from the bottom and left is 100 pixels.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	-- Note: The following values are not scaled. See second example for how to scale it for all screen resolutions.&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400, 200&lt;br /&gt;
	&lt;br /&gt;
	local startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 100, 100, &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
--[[&lt;br /&gt;
	- Scaled version for all screen resolutions&lt;br /&gt;
	- Multiple rectangles&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Prepare the scale multiplier:&lt;br /&gt;
]]&lt;br /&gt;
-- Your resolution as developer.&lt;br /&gt;
local devScreenX = 1920&lt;br /&gt;
local devScreenY = 1080&lt;br /&gt;
&lt;br /&gt;
-- The current resolution of the client&lt;br /&gt;
local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
-- Get the scale value&lt;br /&gt;
local scaleValue = screenY / devScreenY&lt;br /&gt;
&lt;br /&gt;
-- Set an upper limit, so that it isn't scaled too small.&lt;br /&gt;
scaleValue = math.max(scaleValue, 0.65)&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Start drawing:&lt;br /&gt;
]]&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	-- Scale the dimensions:&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400 * scaleValue, 200 * scaleValue &lt;br /&gt;
	local offSetX, offsetY = 50 * scaleValue, 50 * scaleValue&lt;br /&gt;
	&lt;br /&gt;
	-- Start drawing at the correct position:&lt;br /&gt;
	local startX, startY &lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; top&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;left&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; top&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;right&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; bottom&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; bottom&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;left&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; center&lt;br /&gt;
		Note: offsetY is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, 0, &amp;quot;left&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; center&lt;br /&gt;
		Note: offsetY is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, 0, &amp;quot;right&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; top&lt;br /&gt;
		Note: offsetX is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, offsetY, &amp;quot;center&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; bottom&lt;br /&gt;
		Note: offsetX is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, offsetY, &amp;quot;center&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; center&lt;br /&gt;
		Note: offsetX and offsetY are 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, 0, &amp;quot;center&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), 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;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=Template:Client_element_functions&amp;diff=79367</id>
		<title>Template:Client element functions</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=Template:Client_element_functions&amp;diff=79367"/>
		<updated>2024-05-21T20:41:32Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: Add missing function getElementBoundingBox&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;ul&amp;gt;&lt;br /&gt;
{{Added feature/item|1.5.9|1.5.8|20704|&lt;br /&gt;
&amp;lt;li&amp;gt;[[getElementBoneMatrix]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[getElementBonePosition]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[getElementBoneRotation]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[getElementBoundingBox]]&amp;lt;/li&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;li&amp;gt;[[getElementDistanceFromCentreOfMassToBaseOfModel]]&amp;lt;/li&amp;gt;&lt;br /&gt;
{{Added feature/item|1.5.9|1.5.8|21367|&lt;br /&gt;
&amp;lt;li&amp;gt;[[getElementLighting]]&amp;lt;/li&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;li&amp;gt;[[getElementRadius]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[isElementCollidableWith]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[isElementLocal]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[isElementOnScreen]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[isElementStreamable]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[isElementStreamedIn]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[isElementSyncer]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[isElementWaitingForGroundToLoad]]&amp;lt;/li&amp;gt;&lt;br /&gt;
{{Added feature/item|1.5.9|1.5.8|20704|&lt;br /&gt;
&amp;lt;li&amp;gt;[[setElementBoneMatrix]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[setElementBonePosition]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[setElementBoneRotation]]&amp;lt;/li&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;li&amp;gt;[[setElementCollidableWith]]&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;[[setElementStreamable]]&amp;lt;/li&amp;gt;&lt;br /&gt;
{{Added feature/item|1.5.9|1.5.8|20704|&lt;br /&gt;
&amp;lt;li&amp;gt;[[updateElementRpHAnim]]&amp;lt;/li&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Shared'''&lt;br /&gt;
{{Shared_element_functions}}&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>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=OnClientResourceFileDownload&amp;diff=78750</id>
		<title>OnClientResourceFileDownload</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=OnClientResourceFileDownload&amp;diff=78750"/>
		<updated>2023-12-27T15:53:58Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Client event}} &lt;br /&gt;
{{Added feature/item|1.5.9|1.5.8|20788|This event is triggered every time a [[resource]] file download is queued, finished or has failed.}}&lt;br /&gt;
{{Warning|This event is '''NOT''' related to [[downloadFile]] and [[onClientFileDownloadComplete]]!|true}}&lt;br /&gt;
&lt;br /&gt;
==Parameters==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
resource fileResource, string fileName, int fileSize, string state&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*'''fileResource:''' [[Resource]] the file belongs to.&lt;br /&gt;
*'''fileName:''' Relative [[resource]] file path.&lt;br /&gt;
*'''fileSize:''' Size of the file in bytes.&lt;br /&gt;
*'''state:''' Possible values: &amp;lt;code&amp;gt;&amp;quot;queued&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;finished&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;failed&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Source==&lt;br /&gt;
The [[event system#Event source|source]] of this event is the resource's root element.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
This example will output the file's resource name/file name/size/state when downloading:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function writeMsg (fileResource, fileName, fileSize, state)&lt;br /&gt;
    local resourceName = getResourceName( fileResource )&lt;br /&gt;
    outputChatBox ( &amp;quot;Resource name: &amp;quot; .. resourceName .. &amp;quot;, file name: &amp;quot; .. fileName .. &amp;quot;, size: &amp;quot; .. fileSize .. &amp;quot;, state: &amp;quot; .. state)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
addEventHandler (&amp;quot;onClientResourceFileDownload&amp;quot;, root, writeMsg)&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.20788|}}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
===Client resource events===&lt;br /&gt;
{{Client_resource_events}}&lt;br /&gt;
===Client event functions===&lt;br /&gt;
{{Client_event_functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=OnClientResourceFileDownload&amp;diff=78749</id>
		<title>OnClientResourceFileDownload</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=OnClientResourceFileDownload&amp;diff=78749"/>
		<updated>2023-12-27T15:53:27Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Client event}} &lt;br /&gt;
{{Added feature/item|1.5.9|1.5.8|20788|This event is triggered every time a [[resource]] file download is queued, finished or has failed.}}&lt;br /&gt;
{{Warning|This event is '''NOT''' related to [[downloadFile]] and [[onClientFileDownloadComplete]]!|true}}&lt;br /&gt;
&lt;br /&gt;
==Parameters==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
resource fileResource, string fileName, integer fileSize, string state&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
*'''fileResource:''' [[Resource]] the file belongs to.&lt;br /&gt;
*'''fileName:''' Relative [[resource]] file path.&lt;br /&gt;
*'''fileSize:''' Size of the file in bytes.&lt;br /&gt;
*'''state:''' Possible values: &amp;lt;code&amp;gt;&amp;quot;queued&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;finished&amp;quot;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;&amp;quot;failed&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Source==&lt;br /&gt;
The [[event system#Event source|source]] of this event is the resource's root element.&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
This example will output the file's resource name/file name/size/state when downloading:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function writeMsg (fileResource, fileName, fileSize, state)&lt;br /&gt;
    local resourceName = getResourceName( fileResource )&lt;br /&gt;
    outputChatBox ( &amp;quot;Resource name: &amp;quot; .. resourceName .. &amp;quot;, file name: &amp;quot; .. fileName .. &amp;quot;, size: &amp;quot; .. fileSize .. &amp;quot;, state: &amp;quot; .. state)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
addEventHandler (&amp;quot;onClientResourceFileDownload&amp;quot;, root, writeMsg)&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.20788|}}&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
===Client resource events===&lt;br /&gt;
{{Client_resource_events}}&lt;br /&gt;
===Client event functions===&lt;br /&gt;
{{Client_event_functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=IsElementCollidableWith&amp;diff=78742</id>
		<title>IsElementCollidableWith</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=IsElementCollidableWith&amp;diff=78742"/>
		<updated>2023-12-23T16:06:18Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: add space&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Client function}}&lt;br /&gt;
__NOTOC__ &lt;br /&gt;
This function can be used to check whether specified element is collidable with another element.&amp;lt;br&amp;gt;&lt;br /&gt;
'''Note:''' You can only use this function with the element types listed below.&lt;br /&gt;
*[[Player]]&lt;br /&gt;
*[[Ped]]&lt;br /&gt;
*[[Vehicle]]&lt;br /&gt;
*[[Object]]&lt;br /&gt;
{{Added feature/item|1.5.9|1.5.8|21348|&lt;br /&gt;
* [[Element/Weapon|Weapon]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Syntax== &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
bool isElementCollidableWith ( element theElement, element withElement ) &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{New feature/item|3.0141|1.4.0|6987|{{OOP||[[element]]:isCollidableWith||setElementCollidableWith}}}}&lt;br /&gt;
&lt;br /&gt;
===Required Arguments=== &lt;br /&gt;
*'''theElement:''' The [[element]] which colliding you want to get&lt;br /&gt;
*'''withElement:''' The other [[element]] which colliding with the first entity you want to get&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns ''true'' if the elements collide with each other, ''false'' otherwise.&lt;br /&gt;
&lt;br /&gt;
==Example== &lt;br /&gt;
This example adds the command ''togglecol'' which toggles the collision between the player and ped.&lt;br /&gt;
&amp;lt;section name=&amp;quot;Client&amp;quot; class=&amp;quot;client&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local tPed = {}&lt;br /&gt;
addEventHandler( &amp;quot;onClientPlayerSpawn&amp;quot;, localPlayer,&lt;br /&gt;
    function()&lt;br /&gt;
        local x, y, z = getElementPosition(source)&lt;br /&gt;
        if isElement(tPed[&amp;quot;thePed&amp;quot;]) then&lt;br /&gt;
            destroyElement(tPed[&amp;quot;thePed&amp;quot;])&lt;br /&gt;
        end&lt;br /&gt;
        -- Creates a random ped near player&lt;br /&gt;
        tPed[&amp;quot;thePed&amp;quot;] = createPed(math.random(209, 238), x+1, y+1, z)&lt;br /&gt;
    end&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
function toggleColisionFunc()&lt;br /&gt;
    if not isElement(tPed[&amp;quot;thePed&amp;quot;]) then&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
    -- Is the local player collidable with the ped?&lt;br /&gt;
    local isCollidable = isElementCollidableWith( localPlayer, tPed[&amp;quot;thePed&amp;quot;] )&lt;br /&gt;
    -- Toggles the colision with the ped.&lt;br /&gt;
    setElementCollidableWith( localPlayer, tPed[&amp;quot;thePed&amp;quot;], not isCollidable )&lt;br /&gt;
end&lt;br /&gt;
-- Adds a command handler to enable/disable colisions with the ped&lt;br /&gt;
addCommandHandler(&amp;quot;togglecol&amp;quot;, toggleColisionFunc)&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 element functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=AclGroupRemoveObject&amp;diff=78640</id>
		<title>AclGroupRemoveObject</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=AclGroupRemoveObject&amp;diff=78640"/>
		<updated>2023-11-29T19:17:52Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: fix small typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
{{Server function}} &lt;br /&gt;
&amp;lt;!-- Describe in plain english what this function does. Don't go into details, just give an overview --&amp;gt;&lt;br /&gt;
This function removes the given object from the given ACL group. The object can be a resource or a player. See [[aclGroupAddObject]] for more details.&lt;br /&gt;
&lt;br /&gt;
==Syntax== &lt;br /&gt;
&amp;lt;!-- NOTE: don't use 'special' names for variable names, e.g. you shouldn't be writing things like 'player player, vehicle vehicle', instead write something like 'player thePlayer, vehicle vehicleToGetInto'. This is less confusing and prevents the syntax highlighting being odd --&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
bool aclGroupRemoveObject ( aclgroup theGroup, string theObjectString )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
{{OOP||[[aclgroup]]:removeObject||}}&lt;br /&gt;
===Required Arguments=== &lt;br /&gt;
&amp;lt;!-- List each argument one per line. This should be the argument's name as in the argument list above, NOT the argument's data type --&amp;gt;&lt;br /&gt;
*'''theGroup:''' The ACL group to remove the object string from&lt;br /&gt;
*'''theObjectString:''' The object to remove from the ACL group&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
&amp;lt;!-- Make this descriptive. Explain what cases will return false. If you're unsure, add a tag to it so we can check --&amp;gt;&lt;br /&gt;
Returns ''true'' if the object existed in the ACL and could be removed, ''false'' if it could not be removed for some reason, ie. it did not exist in the given ACL group.&lt;br /&gt;
&lt;br /&gt;
==Example== &lt;br /&gt;
&amp;lt;!-- Explain what the example is in a single sentance --&amp;gt;&lt;br /&gt;
This example does...&lt;br /&gt;
&amp;lt;!-- Add the code below, an emphasis should be on making it clear, not optimized. You could provide two versions if you wish, one clear and well commented, the other optimized --&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function deladm (playerSource, commandName, accountName)&lt;br /&gt;
	if accountName then --Make the script able to detect if a user is given.&lt;br /&gt;
		aclGroupRemoveObject (aclGetGroup(&amp;quot;Admin&amp;quot;), &amp;quot;user.&amp;quot;..accountName) --Removing the admin.&lt;br /&gt;
		outputChatBox (&amp;quot;ACL: Account '&amp;quot;..accountName..&amp;quot;' succesfully removed as admin.&amp;quot;, playerSource) -- Giving you a messsage.&lt;br /&gt;
		outputChatBox (&amp;quot;ACL: Someone have removed you as admin.&amp;quot;, accountName) -- giving the poor removed guy a message.&lt;br /&gt;
	else --Make the Syntax display.&lt;br /&gt;
		outputChatBox (&amp;quot;ACL: No account name specified.&amp;quot;, playerSource)&lt;br /&gt;
		outputChatBox (&amp;quot;ACL: Syntax: /deladmin [accountName]&amp;quot;, playerSource)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
addCommandHandler (&amp;quot;deladmin&amp;quot;, deladm)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
&amp;lt;!-- Change FunctionArea to the area that this function is in on the main function list page, e.g. Server, Player, Vehicle etc --&amp;gt;&lt;br /&gt;
{{ACL_functions}}&lt;br /&gt;
[[zh-cn:aclGroupRemoveObject]]&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=Dataset-map-height&amp;diff=73400</id>
		<title>Dataset-map-height</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=Dataset-map-height&amp;diff=73400"/>
		<updated>2022-01-15T20:55:45Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Dataset: GTA map height ==&lt;br /&gt;
The following table contains the height of the GTA terrain for each 200x200 units.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;section name=&amp;quot;Dataset code&amp;quot; class=&amp;quot;shared&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;
--[[&lt;br /&gt;
&lt;br /&gt;
	Indexes x-axis and y-axis:&lt;br /&gt;
	-15 &amp;gt; 0 &amp;gt; 15 (31 for each axis)&lt;br /&gt;
&lt;br /&gt;
	Measurements:&lt;br /&gt;
	31 * 31 = 961&lt;br /&gt;
&lt;br /&gt;
	Each measurement is:&lt;br /&gt;
	200x200 units (from that the max height value is given)&lt;br /&gt;
&lt;br /&gt;
	GTA map size:&lt;br /&gt;
	6000 x 6000&lt;br /&gt;
&lt;br /&gt;
	Map size covered for each axis:&lt;br /&gt;
	31 * 200 = 6200 units&lt;br /&gt;
&lt;br /&gt;
	Covered from the center:&lt;br /&gt;
	6200 / 2 = 3100&lt;br /&gt;
&lt;br /&gt;
	Margin (unintentional):&lt;br /&gt;
	3100 - 3000 = 100&lt;br /&gt;
&lt;br /&gt;
	Measurement quality:&lt;br /&gt;
	Every 1 unit&lt;br /&gt;
&lt;br /&gt;
	Table name:&lt;br /&gt;
	mapHeight&lt;br /&gt;
&lt;br /&gt;
]] --&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------&lt;br /&gt;
-- Calculations [FROM] &amp;lt;world&amp;gt; [TO] &amp;lt;table index&amp;gt;:&lt;br /&gt;
--[[&lt;br /&gt;
	tableX = math.floor( worldX / 200 + 0.5 )&lt;br /&gt;
	tableY = math.floor( worldY / 200 + 0.5 )&lt;br /&gt;
	&lt;br /&gt;
	-- Get the height from the table:&lt;br /&gt;
	height = mapHeight[tableX][tableY]&lt;br /&gt;
]]&lt;br /&gt;
-- INFO: [math.floor] and [+ 0.5] are used to round the value up/down. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------&lt;br /&gt;
-- Calculations [FROM] &amp;lt;table index&amp;gt; [TO] &amp;lt;world&amp;gt;:&lt;br /&gt;
--[[&lt;br /&gt;
	worldX = tableX * 200&lt;br /&gt;
	worldY = tableY * 200&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
mapHeight = {&lt;br /&gt;
	{&lt;br /&gt;
		4, 0, 10, 34, 32, 59, 59, 34, 34, 34, 124, 24, 52, 79, 55, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 0, [-10] = 50, [-9] = 31, [-8] = 113,&lt;br /&gt;
			[-7] = 101, [-6] = 113, [-5] = 98, [-4] = 129, [-3] = 152, [-2] = 54, [-1] = 27, [0] = 13&lt;br /&gt;
	}, {&lt;br /&gt;
		57, 30, 30, 32, 31, 48, 41, 38, 35, 55, 50, 41, 64, 82, 48, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 0, [-10] = 33, [-9] = 34,&lt;br /&gt;
			[-8] = 113, [-7] = 80, [-6] = 107, [-5] = 124, [-4] = 118, [-3] = 147, [-2] = 133, [-1] = 52, [0] = 65&lt;br /&gt;
	}, {&lt;br /&gt;
		51, 31, 30, 22, 40, 47, 47, 24, 42, 63, 58, 44, 63, 86, 6, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 0, [-10] = 2, [-9] = 44, [-8] = 64,&lt;br /&gt;
			[-7] = 79, [-6] = 88, [-5] = 123, [-4] = 136, [-3] = 118, [-2] = 129, [-1] = 78, [0] = 82&lt;br /&gt;
	}, {&lt;br /&gt;
		68, 48, 16, 29, 31, 34, 59, 49, 44, 44, 26, 30, 55, 86, 35, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 0, [-10] = 13, [-9] = 38, [-8] = 41,&lt;br /&gt;
			[-7] = 41, [-6] = 49, [-5] = 119, [-4] = 129, [-3] = 122, [-2] = 138, [-1] = 62, [0] = 124&lt;br /&gt;
	}, {&lt;br /&gt;
		60, 51, 44, 34, 56, 38, 48, 51, 24, 25, 34, 16, 32, 53, 54, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 35, [-11] = 90, [-10] = 82, [-9] = 41,&lt;br /&gt;
			[-8] = 48, [-7] = 54, [-6] = 64, [-5] = 110, [-4] = 184, [-3] = 144, [-2] = 155, [-1] = 165, [0] = 135&lt;br /&gt;
	}, {&lt;br /&gt;
		60, 64, 64, 33, 33, 38, 48, 51, 35, 34, 27, 19, 34, 38, 43, [-15] = 0, [-14] = 1, [-13] = 12, [-12] = 31, [-11] = 103, [-10] = 81, [-9] = 52,&lt;br /&gt;
			[-8] = 61, [-7] = 75, [-6] = 115, [-5] = 148, [-4] = 121, [-3] = 136, [-2] = 148, [-1] = 178, [0] = 114&lt;br /&gt;
	}, {&lt;br /&gt;
		122, 125, 35, 35, 33, 26, 20, 20, 25, 35, 38, 34, 34, 38, 48, [-15] = 0, [-14] = 13, [-13] = 27, [-12] = 39, [-11] = 57, [-10] = 62, [-9] = 156,&lt;br /&gt;
			[-8] = 85, [-7] = 163, [-6] = 201, [-5] = 212, [-4] = 158, [-3] = 119, [-2] = 133, [-1] = 46, [0] = 38&lt;br /&gt;
	}, {&lt;br /&gt;
		124, 113, 35, 35, 25, 39, 47, 23, 38, 35, 35, 38, 34, 38, 46, [-15] = 0, [-14] = 13, [-13] = 25, [-12] = 80, [-11] = 93, [-10] = 42, [-9] = 77,&lt;br /&gt;
			[-8] = 86, [-7] = 329, [-6] = 277, [-5] = 180, [-4] = 102, [-3] = 119, [-2] = 113, [-1] = 69, [0] = 74&lt;br /&gt;
	}, {&lt;br /&gt;
		71, 74, 30, 34, 55, 63, 73, 75, 38, 124, 35, 31, 35, 38, 41, [-15] = 0, [-14] = 13, [-13] = 25, [-12] = 34, [-11] = 40, [-10] = 46, [-9] = 54,&lt;br /&gt;
			[-8] = 76, [-7] = 131, [-6] = 131, [-5] = 84, [-4] = 112, [-3] = 139, [-2] = 172, [-1] = 165, [0] = 59&lt;br /&gt;
	}, {&lt;br /&gt;
		79, 71, 38, 38, 58, 76, 75, 75, 127, 130, 38, 165, 34, 45, 51, [-15] = 0, [-14] = 13, [-13] = 25, [-12] = 27, [-11] = 29, [-10] = 44, [-9] = 42,&lt;br /&gt;
			[-8] = 40, [-7] = 84, [-6] = 86, [-5] = 107, [-4] = 217, [-3] = 213, [-2] = 115, [-1] = 33, [0] = 77&lt;br /&gt;
	}, {&lt;br /&gt;
		64, 68, 16, 35, 85, 85, 65, 107, 100, 99, 103, 74, 31, 26, 35, [-15] = 0, [-14] = 25, [-13] = 32, [-12] = 44, [-11] = 26, [-10] = 39, [-9] = 41,&lt;br /&gt;
			[-8] = 50, [-7] = 52, [-6] = 52, [-5] = 115, [-4] = 200, [-3] = 225, [-2] = 131, [-1] = 63, [0] = 42&lt;br /&gt;
	}, {&lt;br /&gt;
		127, 104, 16, 31, 85, 96, 73, 68, 77, 99, 103, 91, 68, 38, 47, [-15] = 0, [-14] = 36, [-13] = 41, [-12] = 38, [-11] = 61, [-10] = 39, [-9] = 40,&lt;br /&gt;
			[-8] = 50, [-7] = 59, [-6] = 66, [-5] = 101, [-4] = 223, [-3] = 222, [-2] = 130, [-1] = 121, [0] = 51&lt;br /&gt;
	}, {&lt;br /&gt;
		153, 125, 11, 38, 57, 32, 77, 38, 38, 38, 79, 54, 114, 128, 38, [-15] = 0, [-14] = 38, [-13] = 38, [-12] = 49, [-11] = 62, [-10] = 53, [-9] = 46,&lt;br /&gt;
			[-8] = 50, [-7] = 80, [-6] = 93, [-5] = 105, [-4] = 140, [-3] = 168, [-2] = 169, [-1] = 141, [0] = 86&lt;br /&gt;
	}, {&lt;br /&gt;
		71, 19, 40, 40, 38, 35, 31, 30, 31, 25, 35, 38, 61, 78, 41, [-15] = 0, [-14] = 0, [-13] = 38, [-12] = 48, [-11] = 62, [-10] = 46, [-9] = 43,&lt;br /&gt;
			[-8] = 56, [-7] = 80, [-6] = 93, [-5] = 94, [-4] = 84, [-3] = 100, [-2] = 57, [-1] = 46, [0] = 54&lt;br /&gt;
	}, {&lt;br /&gt;
		0, 0, 32, 35, 34, 41, 45, 46, 34, 40, 29, 36, 36, 39, 32, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 2, [-10] = 3, [-9] = 8, [-8] = 33,&lt;br /&gt;
			[-7] = 37, [-6] = 12, [-5] = 11, [-4] = 11, [-3] = 17, [-2] = 10, [-1] = 0, [0] = 20&lt;br /&gt;
	}, [-15] = {&lt;br /&gt;
		4, 6, 26, 40, 45, 35, 0, 0, 0, 68, 135, 227, 227, 236, 0, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 0, [-10] = 36, [-9] = 69, [-8] = 127,&lt;br /&gt;
			[-7] = 127, [-6] = 32, [-5] = 32, [-4] = 14, [-3] = 11, [-2] = 5, [-1] = 3, [0] = 4&lt;br /&gt;
	}, [-14] = {&lt;br /&gt;
		22, 48, 104, 80, 79, 60, 66, 225, 109, 225, 197, 252, 283, 293, 31, [-15] = 0, [-14] = 12, [-13] = 11, [-12] = 17, [-11] = 36, [-10] = 135,&lt;br /&gt;
			[-9] = 252, [-8] = 343, [-7] = 342, [-6] = 157, [-5] = 48, [-4] = 59, [-3] = 64, [-2] = 71, [-1] = 24, [0] = 19&lt;br /&gt;
	}, [-13] = {&lt;br /&gt;
		55, 104, 104, 98, 87, 64, 66, 225, 109, 225, 78, 74, 118, 223, 95, [-15] = 0, [-14] = 40, [-13] = 69, [-12] = 46, [-11] = 124, [-10] = 298,&lt;br /&gt;
			[-9] = 414, [-8] = 442, [-7] = 383, [-6] = 293, [-5] = 176, [-4] = 316, [-3] = 316, [-2] = 98, [-1] = 44, [0] = 55&lt;br /&gt;
	}, [-12] = {&lt;br /&gt;
		76, 88, 76, 93, 93, 79, 37, 55, 0, 0, 20, 42, 89, 198, 42, [-15] = 0, [-14] = 57, [-13] = 73, [-12] = 126, [-11] = 119, [-10] = 404, [-9] = 485,&lt;br /&gt;
			[-8] = 526, [-7] = 422, [-6] = 312, [-5] = 187, [-4] = 316, [-3] = 279, [-2] = 111, [-1] = 68, [0] = 68&lt;br /&gt;
	}, [-11] = {&lt;br /&gt;
		68, 111, 91, 97, 108, 110, 28, 8, 0, 0, 14, 49, 179, 197, 71, [-15] = 0, [-14] = 72, [-13] = 82, [-12] = 81, [-11] = 110, [-10] = 329, [-9] = 487,&lt;br /&gt;
			[-8] = 483, [-7] = 400, [-6] = 272, [-5] = 113, [-4] = 92, [-3] = 111, [-2] = 85, [-1] = 62, [0] = 68&lt;br /&gt;
	}, [-10] = {&lt;br /&gt;
		71, 159, 209, 145, 95, 90, 30, 15, 0, 0, 35, 83, 177, 175, 122, [-15] = 0, [-14] = 68, [-13] = 127, [-12] = 138, [-11] = 174, [-10] = 185,&lt;br /&gt;
			[-9] = 273, [-8] = 268, [-7] = 243, [-6] = 78, [-5] = 66, [-4] = 66, [-3] = 71, [-2] = 74, [-1] = 63, [0] = 56&lt;br /&gt;
	}, [-9] = {&lt;br /&gt;
		48, 115, 332, 295, 201, 93, 61, 17, 54, 59, 51, 115, 115, 129, 64, [-15] = 0, [-14] = 53, [-13] = 79, [-12] = 139, [-11] = 182, [-10] = 199,&lt;br /&gt;
			[-9] = 176, [-8] = 47, [-7] = 76, [-6] = 88, [-5] = 176, [-4] = 158, [-3] = 53, [-2] = 53, [-1] = 52, [0] = 89&lt;br /&gt;
	}, [-8] = {&lt;br /&gt;
		53, 53, 147, 139, 139, 93, 20, 3, 66, 69, 56, 97, 103, 108, 87, [-15] = 40, [-14] = 61, [-13] = 163, [-12] = 198, [-11] = 127, [-10] = 140,&lt;br /&gt;
			[-9] = 175, [-8] = 137, [-7] = 146, [-6] = 169, [-5] = 189, [-4] = 186, [-3] = 41, [-2] = 15, [-1] = 31, [0] = 55&lt;br /&gt;
	}, [-7] = {&lt;br /&gt;
		53, 60, 109, 105, 109, 17, 21, 18, 74, 75, 130, 130, 93, 109, 96, [-15] = 53, [-14] = 167, [-13] = 161, [-12] = 137, [-11] = 133, [-10] = 125,&lt;br /&gt;
			[-9] = 145, [-8] = 196, [-7] = 194, [-6] = 180, [-5] = 205, [-4] = 194, [-3] = 41, [-2] = 39, [-1] = 39, [0] = 15&lt;br /&gt;
	}, [-6] = {&lt;br /&gt;
		18, 34, 17, 83, 147, 42, 32, 41, 87, 144, 132, 132, 114, 107, 90, [-15] = 67, [-14] = 107, [-13] = 142, [-12] = 142, [-11] = 124, [-10] = 78,&lt;br /&gt;
			[-9] = 152, [-8] = 182, [-7] = 207, [-6] = 173, [-5] = 184, [-4] = 173, [-3] = 72, [-2] = 32, [-1] = 39, [0] = 72&lt;br /&gt;
	}, [-5] = {&lt;br /&gt;
		0, 19, 0, 74, 63, 65, 65, 46, 155, 143, 103, 94, 80, 90, 73, [-15] = 57, [-14] = 187, [-13] = 182, [-12] = 184, [-11] = 166, [-10] = 148,&lt;br /&gt;
			[-9] = 115, [-8] = 169, [-7] = 231, [-6] = 231, [-5] = 225, [-4] = 171, [-3] = 135, [-2] = 74, [-1] = 104, [0] = 57&lt;br /&gt;
	}, [-4] = {&lt;br /&gt;
		69, 0, 18, 50, 72, 63, 77, 82, 139, 139, 153, 161, 135, 91, 69, [-15] = 5, [-14] = 187, [-13] = 190, [-12] = 171, [-11] = 168, [-10] = 147,&lt;br /&gt;
			[-9] = 173, [-8] = 200, [-7] = 206, [-6] = 139, [-5] = 156, [-4] = 247, [-3] = 209, [-2] = 125, [-1] = 154, [0] = 101&lt;br /&gt;
	}, [-3] = {&lt;br /&gt;
		105, 1, 16, 15, 46, 37, 78, 86, 143, 126, 135, 161, 152, 94, 72, [-15] = 0, [-14] = 153, [-13] = 175, [-12] = 149, [-11] = 172, [-10] = 149,&lt;br /&gt;
			[-9] = 104, [-8] = 73, [-7] = 116, [-6] = 116, [-5] = 206, [-4] = 205, [-3] = 83, [-2] = 113, [-1] = 167, [0] = 162&lt;br /&gt;
	}, [-2] = {&lt;br /&gt;
		25, 1, 34, 33, 30, 57, 82, 165, 132, 131, 133, 123, 123, 113, 103, [-15] = 0, [-14] = 169, [-13] = 168, [-12] = 117, [-11] = 174, [-10] = 180,&lt;br /&gt;
			[-9] = 112, [-8] = 114, [-7] = 80, [-6] = 80, [-5] = 151, [-4] = 138, [-3] = 116, [-2] = 58, [-1] = 171, [0] = 146&lt;br /&gt;
	}, [-1] = {&lt;br /&gt;
		27, 27, 24, 27, 31, 54, 172, 79, 127, 128, 121, 111, 80, 97, 96, [-15] = 38, [-14] = 162, [-13] = 162, [-12] = 143, [-11] = 68, [-10] = 112,&lt;br /&gt;
			[-9] = 26, [-8] = 59, [-7] = 46, [-6] = 64, [-5] = 81, [-4] = 79, [-3] = 4, [-2] = 39, [-1] = 93, [0] = 26&lt;br /&gt;
	}, [0] = {&lt;br /&gt;
		25, 5, 23, 38, 32, 31, 57, 56, 27, 29, 126, 39, 78, 85, 52, [-15] = 30, [-14] = 159, [-13] = 177, [-12] = 131, [-11] = 0, [-10] = 0, [-9] = 10,&lt;br /&gt;
			[-8] = 48, [-7] = 37, [-6] = 102, [-5] = 59, [-4] = 101, [-3] = 116, [-2] = 46, [-1] = 79, [0] = 25&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=Dataset-map-height&amp;diff=73399</id>
		<title>Dataset-map-height</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=Dataset-map-height&amp;diff=73399"/>
		<updated>2022-01-15T20:54:02Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Dataset: GTA map height ==&lt;br /&gt;
The following table contains the height of the GTA terrain for each 200x200 units.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;section name=&amp;quot;Dataset code&amp;quot; class=&amp;quot;shared&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;
--[[&lt;br /&gt;
&lt;br /&gt;
	Indexes x-axis and y-axis:&lt;br /&gt;
	-15 &amp;gt; 0 &amp;gt; 15 (31 for each axis)&lt;br /&gt;
&lt;br /&gt;
	Measurements:&lt;br /&gt;
	31 * 31 = 961&lt;br /&gt;
&lt;br /&gt;
	Each measurement is:&lt;br /&gt;
	200x200 units&lt;br /&gt;
&lt;br /&gt;
	GTA map size:&lt;br /&gt;
	6000 x 6000&lt;br /&gt;
&lt;br /&gt;
	Map size covered for each axis:&lt;br /&gt;
	31 * 200 = 6200 units&lt;br /&gt;
&lt;br /&gt;
	Covered from the center:&lt;br /&gt;
	6200 / 2 = 3100&lt;br /&gt;
&lt;br /&gt;
	Margin (unintentional):&lt;br /&gt;
	3100 - 3000 = 100&lt;br /&gt;
&lt;br /&gt;
	Measurement quality:&lt;br /&gt;
	Every 1 unit&lt;br /&gt;
&lt;br /&gt;
	Table name:&lt;br /&gt;
	mapHeight&lt;br /&gt;
&lt;br /&gt;
]] --&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------&lt;br /&gt;
-- Calculations [FROM] &amp;lt;world&amp;gt; [TO] &amp;lt;table index&amp;gt;:&lt;br /&gt;
--[[&lt;br /&gt;
	tableX = math.floor( worldX / 200 + 0.5 )&lt;br /&gt;
	tableY = math.floor( worldY / 200 + 0.5 )&lt;br /&gt;
	&lt;br /&gt;
	-- Get the height from the table:&lt;br /&gt;
	height = mapHeight[tableX][tableY]&lt;br /&gt;
]]&lt;br /&gt;
-- INFO: [math.floor] and [+ 0.5] are used to round the value up/down. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------&lt;br /&gt;
-- Calculations [FROM] &amp;lt;table index&amp;gt; [TO] &amp;lt;world&amp;gt;:&lt;br /&gt;
--[[&lt;br /&gt;
	worldX = tableX * 200&lt;br /&gt;
	worldY = tableY * 200&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
mapHeight = {&lt;br /&gt;
	{&lt;br /&gt;
		4, 0, 10, 34, 32, 59, 59, 34, 34, 34, 124, 24, 52, 79, 55, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 0, [-10] = 50, [-9] = 31, [-8] = 113,&lt;br /&gt;
			[-7] = 101, [-6] = 113, [-5] = 98, [-4] = 129, [-3] = 152, [-2] = 54, [-1] = 27, [0] = 13&lt;br /&gt;
	}, {&lt;br /&gt;
		57, 30, 30, 32, 31, 48, 41, 38, 35, 55, 50, 41, 64, 82, 48, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 0, [-10] = 33, [-9] = 34,&lt;br /&gt;
			[-8] = 113, [-7] = 80, [-6] = 107, [-5] = 124, [-4] = 118, [-3] = 147, [-2] = 133, [-1] = 52, [0] = 65&lt;br /&gt;
	}, {&lt;br /&gt;
		51, 31, 30, 22, 40, 47, 47, 24, 42, 63, 58, 44, 63, 86, 6, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 0, [-10] = 2, [-9] = 44, [-8] = 64,&lt;br /&gt;
			[-7] = 79, [-6] = 88, [-5] = 123, [-4] = 136, [-3] = 118, [-2] = 129, [-1] = 78, [0] = 82&lt;br /&gt;
	}, {&lt;br /&gt;
		68, 48, 16, 29, 31, 34, 59, 49, 44, 44, 26, 30, 55, 86, 35, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 0, [-10] = 13, [-9] = 38, [-8] = 41,&lt;br /&gt;
			[-7] = 41, [-6] = 49, [-5] = 119, [-4] = 129, [-3] = 122, [-2] = 138, [-1] = 62, [0] = 124&lt;br /&gt;
	}, {&lt;br /&gt;
		60, 51, 44, 34, 56, 38, 48, 51, 24, 25, 34, 16, 32, 53, 54, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 35, [-11] = 90, [-10] = 82, [-9] = 41,&lt;br /&gt;
			[-8] = 48, [-7] = 54, [-6] = 64, [-5] = 110, [-4] = 184, [-3] = 144, [-2] = 155, [-1] = 165, [0] = 135&lt;br /&gt;
	}, {&lt;br /&gt;
		60, 64, 64, 33, 33, 38, 48, 51, 35, 34, 27, 19, 34, 38, 43, [-15] = 0, [-14] = 1, [-13] = 12, [-12] = 31, [-11] = 103, [-10] = 81, [-9] = 52,&lt;br /&gt;
			[-8] = 61, [-7] = 75, [-6] = 115, [-5] = 148, [-4] = 121, [-3] = 136, [-2] = 148, [-1] = 178, [0] = 114&lt;br /&gt;
	}, {&lt;br /&gt;
		122, 125, 35, 35, 33, 26, 20, 20, 25, 35, 38, 34, 34, 38, 48, [-15] = 0, [-14] = 13, [-13] = 27, [-12] = 39, [-11] = 57, [-10] = 62, [-9] = 156,&lt;br /&gt;
			[-8] = 85, [-7] = 163, [-6] = 201, [-5] = 212, [-4] = 158, [-3] = 119, [-2] = 133, [-1] = 46, [0] = 38&lt;br /&gt;
	}, {&lt;br /&gt;
		124, 113, 35, 35, 25, 39, 47, 23, 38, 35, 35, 38, 34, 38, 46, [-15] = 0, [-14] = 13, [-13] = 25, [-12] = 80, [-11] = 93, [-10] = 42, [-9] = 77,&lt;br /&gt;
			[-8] = 86, [-7] = 329, [-6] = 277, [-5] = 180, [-4] = 102, [-3] = 119, [-2] = 113, [-1] = 69, [0] = 74&lt;br /&gt;
	}, {&lt;br /&gt;
		71, 74, 30, 34, 55, 63, 73, 75, 38, 124, 35, 31, 35, 38, 41, [-15] = 0, [-14] = 13, [-13] = 25, [-12] = 34, [-11] = 40, [-10] = 46, [-9] = 54,&lt;br /&gt;
			[-8] = 76, [-7] = 131, [-6] = 131, [-5] = 84, [-4] = 112, [-3] = 139, [-2] = 172, [-1] = 165, [0] = 59&lt;br /&gt;
	}, {&lt;br /&gt;
		79, 71, 38, 38, 58, 76, 75, 75, 127, 130, 38, 165, 34, 45, 51, [-15] = 0, [-14] = 13, [-13] = 25, [-12] = 27, [-11] = 29, [-10] = 44, [-9] = 42,&lt;br /&gt;
			[-8] = 40, [-7] = 84, [-6] = 86, [-5] = 107, [-4] = 217, [-3] = 213, [-2] = 115, [-1] = 33, [0] = 77&lt;br /&gt;
	}, {&lt;br /&gt;
		64, 68, 16, 35, 85, 85, 65, 107, 100, 99, 103, 74, 31, 26, 35, [-15] = 0, [-14] = 25, [-13] = 32, [-12] = 44, [-11] = 26, [-10] = 39, [-9] = 41,&lt;br /&gt;
			[-8] = 50, [-7] = 52, [-6] = 52, [-5] = 115, [-4] = 200, [-3] = 225, [-2] = 131, [-1] = 63, [0] = 42&lt;br /&gt;
	}, {&lt;br /&gt;
		127, 104, 16, 31, 85, 96, 73, 68, 77, 99, 103, 91, 68, 38, 47, [-15] = 0, [-14] = 36, [-13] = 41, [-12] = 38, [-11] = 61, [-10] = 39, [-9] = 40,&lt;br /&gt;
			[-8] = 50, [-7] = 59, [-6] = 66, [-5] = 101, [-4] = 223, [-3] = 222, [-2] = 130, [-1] = 121, [0] = 51&lt;br /&gt;
	}, {&lt;br /&gt;
		153, 125, 11, 38, 57, 32, 77, 38, 38, 38, 79, 54, 114, 128, 38, [-15] = 0, [-14] = 38, [-13] = 38, [-12] = 49, [-11] = 62, [-10] = 53, [-9] = 46,&lt;br /&gt;
			[-8] = 50, [-7] = 80, [-6] = 93, [-5] = 105, [-4] = 140, [-3] = 168, [-2] = 169, [-1] = 141, [0] = 86&lt;br /&gt;
	}, {&lt;br /&gt;
		71, 19, 40, 40, 38, 35, 31, 30, 31, 25, 35, 38, 61, 78, 41, [-15] = 0, [-14] = 0, [-13] = 38, [-12] = 48, [-11] = 62, [-10] = 46, [-9] = 43,&lt;br /&gt;
			[-8] = 56, [-7] = 80, [-6] = 93, [-5] = 94, [-4] = 84, [-3] = 100, [-2] = 57, [-1] = 46, [0] = 54&lt;br /&gt;
	}, {&lt;br /&gt;
		0, 0, 32, 35, 34, 41, 45, 46, 34, 40, 29, 36, 36, 39, 32, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 2, [-10] = 3, [-9] = 8, [-8] = 33,&lt;br /&gt;
			[-7] = 37, [-6] = 12, [-5] = 11, [-4] = 11, [-3] = 17, [-2] = 10, [-1] = 0, [0] = 20&lt;br /&gt;
	}, [-15] = {&lt;br /&gt;
		4, 6, 26, 40, 45, 35, 0, 0, 0, 68, 135, 227, 227, 236, 0, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 0, [-10] = 36, [-9] = 69, [-8] = 127,&lt;br /&gt;
			[-7] = 127, [-6] = 32, [-5] = 32, [-4] = 14, [-3] = 11, [-2] = 5, [-1] = 3, [0] = 4&lt;br /&gt;
	}, [-14] = {&lt;br /&gt;
		22, 48, 104, 80, 79, 60, 66, 225, 109, 225, 197, 252, 283, 293, 31, [-15] = 0, [-14] = 12, [-13] = 11, [-12] = 17, [-11] = 36, [-10] = 135,&lt;br /&gt;
			[-9] = 252, [-8] = 343, [-7] = 342, [-6] = 157, [-5] = 48, [-4] = 59, [-3] = 64, [-2] = 71, [-1] = 24, [0] = 19&lt;br /&gt;
	}, [-13] = {&lt;br /&gt;
		55, 104, 104, 98, 87, 64, 66, 225, 109, 225, 78, 74, 118, 223, 95, [-15] = 0, [-14] = 40, [-13] = 69, [-12] = 46, [-11] = 124, [-10] = 298,&lt;br /&gt;
			[-9] = 414, [-8] = 442, [-7] = 383, [-6] = 293, [-5] = 176, [-4] = 316, [-3] = 316, [-2] = 98, [-1] = 44, [0] = 55&lt;br /&gt;
	}, [-12] = {&lt;br /&gt;
		76, 88, 76, 93, 93, 79, 37, 55, 0, 0, 20, 42, 89, 198, 42, [-15] = 0, [-14] = 57, [-13] = 73, [-12] = 126, [-11] = 119, [-10] = 404, [-9] = 485,&lt;br /&gt;
			[-8] = 526, [-7] = 422, [-6] = 312, [-5] = 187, [-4] = 316, [-3] = 279, [-2] = 111, [-1] = 68, [0] = 68&lt;br /&gt;
	}, [-11] = {&lt;br /&gt;
		68, 111, 91, 97, 108, 110, 28, 8, 0, 0, 14, 49, 179, 197, 71, [-15] = 0, [-14] = 72, [-13] = 82, [-12] = 81, [-11] = 110, [-10] = 329, [-9] = 487,&lt;br /&gt;
			[-8] = 483, [-7] = 400, [-6] = 272, [-5] = 113, [-4] = 92, [-3] = 111, [-2] = 85, [-1] = 62, [0] = 68&lt;br /&gt;
	}, [-10] = {&lt;br /&gt;
		71, 159, 209, 145, 95, 90, 30, 15, 0, 0, 35, 83, 177, 175, 122, [-15] = 0, [-14] = 68, [-13] = 127, [-12] = 138, [-11] = 174, [-10] = 185,&lt;br /&gt;
			[-9] = 273, [-8] = 268, [-7] = 243, [-6] = 78, [-5] = 66, [-4] = 66, [-3] = 71, [-2] = 74, [-1] = 63, [0] = 56&lt;br /&gt;
	}, [-9] = {&lt;br /&gt;
		48, 115, 332, 295, 201, 93, 61, 17, 54, 59, 51, 115, 115, 129, 64, [-15] = 0, [-14] = 53, [-13] = 79, [-12] = 139, [-11] = 182, [-10] = 199,&lt;br /&gt;
			[-9] = 176, [-8] = 47, [-7] = 76, [-6] = 88, [-5] = 176, [-4] = 158, [-3] = 53, [-2] = 53, [-1] = 52, [0] = 89&lt;br /&gt;
	}, [-8] = {&lt;br /&gt;
		53, 53, 147, 139, 139, 93, 20, 3, 66, 69, 56, 97, 103, 108, 87, [-15] = 40, [-14] = 61, [-13] = 163, [-12] = 198, [-11] = 127, [-10] = 140,&lt;br /&gt;
			[-9] = 175, [-8] = 137, [-7] = 146, [-6] = 169, [-5] = 189, [-4] = 186, [-3] = 41, [-2] = 15, [-1] = 31, [0] = 55&lt;br /&gt;
	}, [-7] = {&lt;br /&gt;
		53, 60, 109, 105, 109, 17, 21, 18, 74, 75, 130, 130, 93, 109, 96, [-15] = 53, [-14] = 167, [-13] = 161, [-12] = 137, [-11] = 133, [-10] = 125,&lt;br /&gt;
			[-9] = 145, [-8] = 196, [-7] = 194, [-6] = 180, [-5] = 205, [-4] = 194, [-3] = 41, [-2] = 39, [-1] = 39, [0] = 15&lt;br /&gt;
	}, [-6] = {&lt;br /&gt;
		18, 34, 17, 83, 147, 42, 32, 41, 87, 144, 132, 132, 114, 107, 90, [-15] = 67, [-14] = 107, [-13] = 142, [-12] = 142, [-11] = 124, [-10] = 78,&lt;br /&gt;
			[-9] = 152, [-8] = 182, [-7] = 207, [-6] = 173, [-5] = 184, [-4] = 173, [-3] = 72, [-2] = 32, [-1] = 39, [0] = 72&lt;br /&gt;
	}, [-5] = {&lt;br /&gt;
		0, 19, 0, 74, 63, 65, 65, 46, 155, 143, 103, 94, 80, 90, 73, [-15] = 57, [-14] = 187, [-13] = 182, [-12] = 184, [-11] = 166, [-10] = 148,&lt;br /&gt;
			[-9] = 115, [-8] = 169, [-7] = 231, [-6] = 231, [-5] = 225, [-4] = 171, [-3] = 135, [-2] = 74, [-1] = 104, [0] = 57&lt;br /&gt;
	}, [-4] = {&lt;br /&gt;
		69, 0, 18, 50, 72, 63, 77, 82, 139, 139, 153, 161, 135, 91, 69, [-15] = 5, [-14] = 187, [-13] = 190, [-12] = 171, [-11] = 168, [-10] = 147,&lt;br /&gt;
			[-9] = 173, [-8] = 200, [-7] = 206, [-6] = 139, [-5] = 156, [-4] = 247, [-3] = 209, [-2] = 125, [-1] = 154, [0] = 101&lt;br /&gt;
	}, [-3] = {&lt;br /&gt;
		105, 1, 16, 15, 46, 37, 78, 86, 143, 126, 135, 161, 152, 94, 72, [-15] = 0, [-14] = 153, [-13] = 175, [-12] = 149, [-11] = 172, [-10] = 149,&lt;br /&gt;
			[-9] = 104, [-8] = 73, [-7] = 116, [-6] = 116, [-5] = 206, [-4] = 205, [-3] = 83, [-2] = 113, [-1] = 167, [0] = 162&lt;br /&gt;
	}, [-2] = {&lt;br /&gt;
		25, 1, 34, 33, 30, 57, 82, 165, 132, 131, 133, 123, 123, 113, 103, [-15] = 0, [-14] = 169, [-13] = 168, [-12] = 117, [-11] = 174, [-10] = 180,&lt;br /&gt;
			[-9] = 112, [-8] = 114, [-7] = 80, [-6] = 80, [-5] = 151, [-4] = 138, [-3] = 116, [-2] = 58, [-1] = 171, [0] = 146&lt;br /&gt;
	}, [-1] = {&lt;br /&gt;
		27, 27, 24, 27, 31, 54, 172, 79, 127, 128, 121, 111, 80, 97, 96, [-15] = 38, [-14] = 162, [-13] = 162, [-12] = 143, [-11] = 68, [-10] = 112,&lt;br /&gt;
			[-9] = 26, [-8] = 59, [-7] = 46, [-6] = 64, [-5] = 81, [-4] = 79, [-3] = 4, [-2] = 39, [-1] = 93, [0] = 26&lt;br /&gt;
	}, [0] = {&lt;br /&gt;
		25, 5, 23, 38, 32, 31, 57, 56, 27, 29, 126, 39, 78, 85, 52, [-15] = 30, [-14] = 159, [-13] = 177, [-12] = 131, [-11] = 0, [-10] = 0, [-9] = 10,&lt;br /&gt;
			[-8] = 48, [-7] = 37, [-6] = 102, [-5] = 59, [-4] = 101, [-3] = 116, [-2] = 46, [-1] = 79, [0] = 25&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=Dataset-map-height&amp;diff=73398</id>
		<title>Dataset-map-height</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=Dataset-map-height&amp;diff=73398"/>
		<updated>2022-01-15T20:47:55Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Dataset: GTA map height ==&lt;br /&gt;
The following table contains the height of the GTA terrain for each 200x200 units.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;section name=&amp;quot;Dataset code&amp;quot; class=&amp;quot;shared&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;
--[[&lt;br /&gt;
&lt;br /&gt;
	Indexes x-axis and y-axis:&lt;br /&gt;
	-15 &amp;gt; 0 &amp;gt; 15 (31 for each axis)&lt;br /&gt;
&lt;br /&gt;
	Measurements:&lt;br /&gt;
	31 * 31 = 961&lt;br /&gt;
&lt;br /&gt;
	Each measurement is:&lt;br /&gt;
	200x200 units&lt;br /&gt;
&lt;br /&gt;
	GTA map size:&lt;br /&gt;
	6000 x 6000&lt;br /&gt;
&lt;br /&gt;
	Map size covered for each axis:&lt;br /&gt;
	31 * 200 = 6200 units&lt;br /&gt;
&lt;br /&gt;
	Covered from the center:&lt;br /&gt;
	6200 / 2 = 3100&lt;br /&gt;
&lt;br /&gt;
	Margin (unintentional):&lt;br /&gt;
	3100 - 3000 = 100&lt;br /&gt;
&lt;br /&gt;
	Measurement quality:&lt;br /&gt;
	Every 1 unit (HQ)&lt;br /&gt;
&lt;br /&gt;
	Table name:&lt;br /&gt;
	mapHeight&lt;br /&gt;
&lt;br /&gt;
]] --&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------&lt;br /&gt;
-- Calculations [FROM] &amp;lt;world&amp;gt; [TO] &amp;lt;table index&amp;gt;:&lt;br /&gt;
--[[&lt;br /&gt;
	tableX = math.floor( worldX / 200 + 0.5 )&lt;br /&gt;
	tableY = math.floor( worldY / 200 + 0.5 )&lt;br /&gt;
	&lt;br /&gt;
	-- Get the height from the table:&lt;br /&gt;
	height = mapHeight[tableX][tableY]&lt;br /&gt;
]]&lt;br /&gt;
-- INFO: [math.floor] and [+ 0.5] are used to round the value up/down. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------&lt;br /&gt;
-- Calculations [FROM] &amp;lt;table index&amp;gt; [TO] &amp;lt;world&amp;gt;:&lt;br /&gt;
--[[&lt;br /&gt;
	worldX = tableX * 200&lt;br /&gt;
	worldY = tableY * 200&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
mapHeight = {&lt;br /&gt;
	{&lt;br /&gt;
		4, 0, 10, 34, 32, 59, 59, 34, 34, 34, 124, 24, 52, 79, 55, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 0, [-10] = 50, [-9] = 31, [-8] = 113,&lt;br /&gt;
			[-7] = 101, [-6] = 113, [-5] = 98, [-4] = 129, [-3] = 152, [-2] = 54, [-1] = 27, [0] = 13&lt;br /&gt;
	}, {&lt;br /&gt;
		57, 30, 30, 32, 31, 48, 41, 38, 35, 55, 50, 41, 64, 82, 48, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 0, [-10] = 33, [-9] = 34,&lt;br /&gt;
			[-8] = 113, [-7] = 80, [-6] = 107, [-5] = 124, [-4] = 118, [-3] = 147, [-2] = 133, [-1] = 52, [0] = 65&lt;br /&gt;
	}, {&lt;br /&gt;
		51, 31, 30, 22, 40, 47, 47, 24, 42, 63, 58, 44, 63, 86, 6, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 0, [-10] = 2, [-9] = 44, [-8] = 64,&lt;br /&gt;
			[-7] = 79, [-6] = 88, [-5] = 123, [-4] = 136, [-3] = 118, [-2] = 129, [-1] = 78, [0] = 82&lt;br /&gt;
	}, {&lt;br /&gt;
		68, 48, 16, 29, 31, 34, 59, 49, 44, 44, 26, 30, 55, 86, 35, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 0, [-10] = 13, [-9] = 38, [-8] = 41,&lt;br /&gt;
			[-7] = 41, [-6] = 49, [-5] = 119, [-4] = 129, [-3] = 122, [-2] = 138, [-1] = 62, [0] = 124&lt;br /&gt;
	}, {&lt;br /&gt;
		60, 51, 44, 34, 56, 38, 48, 51, 24, 25, 34, 16, 32, 53, 54, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 35, [-11] = 90, [-10] = 82, [-9] = 41,&lt;br /&gt;
			[-8] = 48, [-7] = 54, [-6] = 64, [-5] = 110, [-4] = 184, [-3] = 144, [-2] = 155, [-1] = 165, [0] = 135&lt;br /&gt;
	}, {&lt;br /&gt;
		60, 64, 64, 33, 33, 38, 48, 51, 35, 34, 27, 19, 34, 38, 43, [-15] = 0, [-14] = 1, [-13] = 12, [-12] = 31, [-11] = 103, [-10] = 81, [-9] = 52,&lt;br /&gt;
			[-8] = 61, [-7] = 75, [-6] = 115, [-5] = 148, [-4] = 121, [-3] = 136, [-2] = 148, [-1] = 178, [0] = 114&lt;br /&gt;
	}, {&lt;br /&gt;
		122, 125, 35, 35, 33, 26, 20, 20, 25, 35, 38, 34, 34, 38, 48, [-15] = 0, [-14] = 13, [-13] = 27, [-12] = 39, [-11] = 57, [-10] = 62, [-9] = 156,&lt;br /&gt;
			[-8] = 85, [-7] = 163, [-6] = 201, [-5] = 212, [-4] = 158, [-3] = 119, [-2] = 133, [-1] = 46, [0] = 38&lt;br /&gt;
	}, {&lt;br /&gt;
		124, 113, 35, 35, 25, 39, 47, 23, 38, 35, 35, 38, 34, 38, 46, [-15] = 0, [-14] = 13, [-13] = 25, [-12] = 80, [-11] = 93, [-10] = 42, [-9] = 77,&lt;br /&gt;
			[-8] = 86, [-7] = 329, [-6] = 277, [-5] = 180, [-4] = 102, [-3] = 119, [-2] = 113, [-1] = 69, [0] = 74&lt;br /&gt;
	}, {&lt;br /&gt;
		71, 74, 30, 34, 55, 63, 73, 75, 38, 124, 35, 31, 35, 38, 41, [-15] = 0, [-14] = 13, [-13] = 25, [-12] = 34, [-11] = 40, [-10] = 46, [-9] = 54,&lt;br /&gt;
			[-8] = 76, [-7] = 131, [-6] = 131, [-5] = 84, [-4] = 112, [-3] = 139, [-2] = 172, [-1] = 165, [0] = 59&lt;br /&gt;
	}, {&lt;br /&gt;
		79, 71, 38, 38, 58, 76, 75, 75, 127, 130, 38, 165, 34, 45, 51, [-15] = 0, [-14] = 13, [-13] = 25, [-12] = 27, [-11] = 29, [-10] = 44, [-9] = 42,&lt;br /&gt;
			[-8] = 40, [-7] = 84, [-6] = 86, [-5] = 107, [-4] = 217, [-3] = 213, [-2] = 115, [-1] = 33, [0] = 77&lt;br /&gt;
	}, {&lt;br /&gt;
		64, 68, 16, 35, 85, 85, 65, 107, 100, 99, 103, 74, 31, 26, 35, [-15] = 0, [-14] = 25, [-13] = 32, [-12] = 44, [-11] = 26, [-10] = 39, [-9] = 41,&lt;br /&gt;
			[-8] = 50, [-7] = 52, [-6] = 52, [-5] = 115, [-4] = 200, [-3] = 225, [-2] = 131, [-1] = 63, [0] = 42&lt;br /&gt;
	}, {&lt;br /&gt;
		127, 104, 16, 31, 85, 96, 73, 68, 77, 99, 103, 91, 68, 38, 47, [-15] = 0, [-14] = 36, [-13] = 41, [-12] = 38, [-11] = 61, [-10] = 39, [-9] = 40,&lt;br /&gt;
			[-8] = 50, [-7] = 59, [-6] = 66, [-5] = 101, [-4] = 223, [-3] = 222, [-2] = 130, [-1] = 121, [0] = 51&lt;br /&gt;
	}, {&lt;br /&gt;
		153, 125, 11, 38, 57, 32, 77, 38, 38, 38, 79, 54, 114, 128, 38, [-15] = 0, [-14] = 38, [-13] = 38, [-12] = 49, [-11] = 62, [-10] = 53, [-9] = 46,&lt;br /&gt;
			[-8] = 50, [-7] = 80, [-6] = 93, [-5] = 105, [-4] = 140, [-3] = 168, [-2] = 169, [-1] = 141, [0] = 86&lt;br /&gt;
	}, {&lt;br /&gt;
		71, 19, 40, 40, 38, 35, 31, 30, 31, 25, 35, 38, 61, 78, 41, [-15] = 0, [-14] = 0, [-13] = 38, [-12] = 48, [-11] = 62, [-10] = 46, [-9] = 43,&lt;br /&gt;
			[-8] = 56, [-7] = 80, [-6] = 93, [-5] = 94, [-4] = 84, [-3] = 100, [-2] = 57, [-1] = 46, [0] = 54&lt;br /&gt;
	}, {&lt;br /&gt;
		0, 0, 32, 35, 34, 41, 45, 46, 34, 40, 29, 36, 36, 39, 32, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 2, [-10] = 3, [-9] = 8, [-8] = 33,&lt;br /&gt;
			[-7] = 37, [-6] = 12, [-5] = 11, [-4] = 11, [-3] = 17, [-2] = 10, [-1] = 0, [0] = 20&lt;br /&gt;
	}, [-15] = {&lt;br /&gt;
		4, 6, 26, 40, 45, 35, 0, 0, 0, 68, 135, 227, 227, 236, 0, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 0, [-10] = 36, [-9] = 69, [-8] = 127,&lt;br /&gt;
			[-7] = 127, [-6] = 32, [-5] = 32, [-4] = 14, [-3] = 11, [-2] = 5, [-1] = 3, [0] = 4&lt;br /&gt;
	}, [-14] = {&lt;br /&gt;
		22, 48, 104, 80, 79, 60, 66, 225, 109, 225, 197, 252, 283, 293, 31, [-15] = 0, [-14] = 12, [-13] = 11, [-12] = 17, [-11] = 36, [-10] = 135,&lt;br /&gt;
			[-9] = 252, [-8] = 343, [-7] = 342, [-6] = 157, [-5] = 48, [-4] = 59, [-3] = 64, [-2] = 71, [-1] = 24, [0] = 19&lt;br /&gt;
	}, [-13] = {&lt;br /&gt;
		55, 104, 104, 98, 87, 64, 66, 225, 109, 225, 78, 74, 118, 223, 95, [-15] = 0, [-14] = 40, [-13] = 69, [-12] = 46, [-11] = 124, [-10] = 298,&lt;br /&gt;
			[-9] = 414, [-8] = 442, [-7] = 383, [-6] = 293, [-5] = 176, [-4] = 316, [-3] = 316, [-2] = 98, [-1] = 44, [0] = 55&lt;br /&gt;
	}, [-12] = {&lt;br /&gt;
		76, 88, 76, 93, 93, 79, 37, 55, 0, 0, 20, 42, 89, 198, 42, [-15] = 0, [-14] = 57, [-13] = 73, [-12] = 126, [-11] = 119, [-10] = 404, [-9] = 485,&lt;br /&gt;
			[-8] = 526, [-7] = 422, [-6] = 312, [-5] = 187, [-4] = 316, [-3] = 279, [-2] = 111, [-1] = 68, [0] = 68&lt;br /&gt;
	}, [-11] = {&lt;br /&gt;
		68, 111, 91, 97, 108, 110, 28, 8, 0, 0, 14, 49, 179, 197, 71, [-15] = 0, [-14] = 72, [-13] = 82, [-12] = 81, [-11] = 110, [-10] = 329, [-9] = 487,&lt;br /&gt;
			[-8] = 483, [-7] = 400, [-6] = 272, [-5] = 113, [-4] = 92, [-3] = 111, [-2] = 85, [-1] = 62, [0] = 68&lt;br /&gt;
	}, [-10] = {&lt;br /&gt;
		71, 159, 209, 145, 95, 90, 30, 15, 0, 0, 35, 83, 177, 175, 122, [-15] = 0, [-14] = 68, [-13] = 127, [-12] = 138, [-11] = 174, [-10] = 185,&lt;br /&gt;
			[-9] = 273, [-8] = 268, [-7] = 243, [-6] = 78, [-5] = 66, [-4] = 66, [-3] = 71, [-2] = 74, [-1] = 63, [0] = 56&lt;br /&gt;
	}, [-9] = {&lt;br /&gt;
		48, 115, 332, 295, 201, 93, 61, 17, 54, 59, 51, 115, 115, 129, 64, [-15] = 0, [-14] = 53, [-13] = 79, [-12] = 139, [-11] = 182, [-10] = 199,&lt;br /&gt;
			[-9] = 176, [-8] = 47, [-7] = 76, [-6] = 88, [-5] = 176, [-4] = 158, [-3] = 53, [-2] = 53, [-1] = 52, [0] = 89&lt;br /&gt;
	}, [-8] = {&lt;br /&gt;
		53, 53, 147, 139, 139, 93, 20, 3, 66, 69, 56, 97, 103, 108, 87, [-15] = 40, [-14] = 61, [-13] = 163, [-12] = 198, [-11] = 127, [-10] = 140,&lt;br /&gt;
			[-9] = 175, [-8] = 137, [-7] = 146, [-6] = 169, [-5] = 189, [-4] = 186, [-3] = 41, [-2] = 15, [-1] = 31, [0] = 55&lt;br /&gt;
	}, [-7] = {&lt;br /&gt;
		53, 60, 109, 105, 109, 17, 21, 18, 74, 75, 130, 130, 93, 109, 96, [-15] = 53, [-14] = 167, [-13] = 161, [-12] = 137, [-11] = 133, [-10] = 125,&lt;br /&gt;
			[-9] = 145, [-8] = 196, [-7] = 194, [-6] = 180, [-5] = 205, [-4] = 194, [-3] = 41, [-2] = 39, [-1] = 39, [0] = 15&lt;br /&gt;
	}, [-6] = {&lt;br /&gt;
		18, 34, 17, 83, 147, 42, 32, 41, 87, 144, 132, 132, 114, 107, 90, [-15] = 67, [-14] = 107, [-13] = 142, [-12] = 142, [-11] = 124, [-10] = 78,&lt;br /&gt;
			[-9] = 152, [-8] = 182, [-7] = 207, [-6] = 173, [-5] = 184, [-4] = 173, [-3] = 72, [-2] = 32, [-1] = 39, [0] = 72&lt;br /&gt;
	}, [-5] = {&lt;br /&gt;
		0, 19, 0, 74, 63, 65, 65, 46, 155, 143, 103, 94, 80, 90, 73, [-15] = 57, [-14] = 187, [-13] = 182, [-12] = 184, [-11] = 166, [-10] = 148,&lt;br /&gt;
			[-9] = 115, [-8] = 169, [-7] = 231, [-6] = 231, [-5] = 225, [-4] = 171, [-3] = 135, [-2] = 74, [-1] = 104, [0] = 57&lt;br /&gt;
	}, [-4] = {&lt;br /&gt;
		69, 0, 18, 50, 72, 63, 77, 82, 139, 139, 153, 161, 135, 91, 69, [-15] = 5, [-14] = 187, [-13] = 190, [-12] = 171, [-11] = 168, [-10] = 147,&lt;br /&gt;
			[-9] = 173, [-8] = 200, [-7] = 206, [-6] = 139, [-5] = 156, [-4] = 247, [-3] = 209, [-2] = 125, [-1] = 154, [0] = 101&lt;br /&gt;
	}, [-3] = {&lt;br /&gt;
		105, 1, 16, 15, 46, 37, 78, 86, 143, 126, 135, 161, 152, 94, 72, [-15] = 0, [-14] = 153, [-13] = 175, [-12] = 149, [-11] = 172, [-10] = 149,&lt;br /&gt;
			[-9] = 104, [-8] = 73, [-7] = 116, [-6] = 116, [-5] = 206, [-4] = 205, [-3] = 83, [-2] = 113, [-1] = 167, [0] = 162&lt;br /&gt;
	}, [-2] = {&lt;br /&gt;
		25, 1, 34, 33, 30, 57, 82, 165, 132, 131, 133, 123, 123, 113, 103, [-15] = 0, [-14] = 169, [-13] = 168, [-12] = 117, [-11] = 174, [-10] = 180,&lt;br /&gt;
			[-9] = 112, [-8] = 114, [-7] = 80, [-6] = 80, [-5] = 151, [-4] = 138, [-3] = 116, [-2] = 58, [-1] = 171, [0] = 146&lt;br /&gt;
	}, [-1] = {&lt;br /&gt;
		27, 27, 24, 27, 31, 54, 172, 79, 127, 128, 121, 111, 80, 97, 96, [-15] = 38, [-14] = 162, [-13] = 162, [-12] = 143, [-11] = 68, [-10] = 112,&lt;br /&gt;
			[-9] = 26, [-8] = 59, [-7] = 46, [-6] = 64, [-5] = 81, [-4] = 79, [-3] = 4, [-2] = 39, [-1] = 93, [0] = 26&lt;br /&gt;
	}, [0] = {&lt;br /&gt;
		25, 5, 23, 38, 32, 31, 57, 56, 27, 29, 126, 39, 78, 85, 52, [-15] = 30, [-14] = 159, [-13] = 177, [-12] = 131, [-11] = 0, [-10] = 0, [-9] = 10,&lt;br /&gt;
			[-8] = 48, [-7] = 37, [-6] = 102, [-5] = 59, [-4] = 101, [-3] = 116, [-2] = 46, [-1] = 79, [0] = 25&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=Dataset-map-height&amp;diff=73397</id>
		<title>Dataset-map-height</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=Dataset-map-height&amp;diff=73397"/>
		<updated>2022-01-15T20:36:49Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Dataset: GTA map height ==&lt;br /&gt;
The following table contains the height of the GTA terrain for each 200x200 units.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;section name=&amp;quot;Dataset code&amp;quot; class=&amp;quot;shared&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;
--[[&lt;br /&gt;
&lt;br /&gt;
	Indexes x-axis and y-axis:&lt;br /&gt;
	-15 &amp;gt; 0 &amp;gt; 15 (31 for each axis)&lt;br /&gt;
&lt;br /&gt;
	Measurements:&lt;br /&gt;
	31 * 31 = 961&lt;br /&gt;
&lt;br /&gt;
	Each measurement is:&lt;br /&gt;
	200x200 units&lt;br /&gt;
&lt;br /&gt;
	GTA map size:&lt;br /&gt;
	6000&lt;br /&gt;
&lt;br /&gt;
	Map size covered&lt;br /&gt;
	31 * 200 = 6200 units&lt;br /&gt;
&lt;br /&gt;
	Covered from the center:&lt;br /&gt;
	6200 / 2 = 3100&lt;br /&gt;
&lt;br /&gt;
	Margin (unintentional):&lt;br /&gt;
	3100 - 3000 = 100&lt;br /&gt;
&lt;br /&gt;
	Measurement quality:&lt;br /&gt;
	Every 1 unit (HQ)&lt;br /&gt;
&lt;br /&gt;
	Table name:&lt;br /&gt;
	mapHeight&lt;br /&gt;
&lt;br /&gt;
]] --&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------&lt;br /&gt;
-- Calculations [FROM] &amp;lt;world&amp;gt; [TO] &amp;lt;table index&amp;gt;:&lt;br /&gt;
--[[&lt;br /&gt;
	tableX = math.floor( worldX / 200 + 0.5 )&lt;br /&gt;
	tableY = math.floor( worldY / 200 + 0.5 )&lt;br /&gt;
	&lt;br /&gt;
	-- Get the height from the table:&lt;br /&gt;
	height = mapHeight[tableX][tableY]&lt;br /&gt;
]]&lt;br /&gt;
-- INFO: [math.floor] and [+ 0.5] are used to round the value up/down. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------&lt;br /&gt;
-- Calculations [FROM] &amp;lt;table index&amp;gt; [TO] &amp;lt;world&amp;gt;:&lt;br /&gt;
--[[&lt;br /&gt;
	worldX = tableX * 200&lt;br /&gt;
	worldY = tableY * 200&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
mapHeight = {&lt;br /&gt;
	{&lt;br /&gt;
		4, 0, 10, 34, 32, 59, 59, 34, 34, 34, 124, 24, 52, 79, 55, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 0, [-10] = 50, [-9] = 31, [-8] = 113,&lt;br /&gt;
			[-7] = 101, [-6] = 113, [-5] = 98, [-4] = 129, [-3] = 152, [-2] = 54, [-1] = 27, [0] = 13&lt;br /&gt;
	}, {&lt;br /&gt;
		57, 30, 30, 32, 31, 48, 41, 38, 35, 55, 50, 41, 64, 82, 48, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 0, [-10] = 33, [-9] = 34,&lt;br /&gt;
			[-8] = 113, [-7] = 80, [-6] = 107, [-5] = 124, [-4] = 118, [-3] = 147, [-2] = 133, [-1] = 52, [0] = 65&lt;br /&gt;
	}, {&lt;br /&gt;
		51, 31, 30, 22, 40, 47, 47, 24, 42, 63, 58, 44, 63, 86, 6, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 0, [-10] = 2, [-9] = 44, [-8] = 64,&lt;br /&gt;
			[-7] = 79, [-6] = 88, [-5] = 123, [-4] = 136, [-3] = 118, [-2] = 129, [-1] = 78, [0] = 82&lt;br /&gt;
	}, {&lt;br /&gt;
		68, 48, 16, 29, 31, 34, 59, 49, 44, 44, 26, 30, 55, 86, 35, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 0, [-10] = 13, [-9] = 38, [-8] = 41,&lt;br /&gt;
			[-7] = 41, [-6] = 49, [-5] = 119, [-4] = 129, [-3] = 122, [-2] = 138, [-1] = 62, [0] = 124&lt;br /&gt;
	}, {&lt;br /&gt;
		60, 51, 44, 34, 56, 38, 48, 51, 24, 25, 34, 16, 32, 53, 54, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 35, [-11] = 90, [-10] = 82, [-9] = 41,&lt;br /&gt;
			[-8] = 48, [-7] = 54, [-6] = 64, [-5] = 110, [-4] = 184, [-3] = 144, [-2] = 155, [-1] = 165, [0] = 135&lt;br /&gt;
	}, {&lt;br /&gt;
		60, 64, 64, 33, 33, 38, 48, 51, 35, 34, 27, 19, 34, 38, 43, [-15] = 0, [-14] = 1, [-13] = 12, [-12] = 31, [-11] = 103, [-10] = 81, [-9] = 52,&lt;br /&gt;
			[-8] = 61, [-7] = 75, [-6] = 115, [-5] = 148, [-4] = 121, [-3] = 136, [-2] = 148, [-1] = 178, [0] = 114&lt;br /&gt;
	}, {&lt;br /&gt;
		122, 125, 35, 35, 33, 26, 20, 20, 25, 35, 38, 34, 34, 38, 48, [-15] = 0, [-14] = 13, [-13] = 27, [-12] = 39, [-11] = 57, [-10] = 62, [-9] = 156,&lt;br /&gt;
			[-8] = 85, [-7] = 163, [-6] = 201, [-5] = 212, [-4] = 158, [-3] = 119, [-2] = 133, [-1] = 46, [0] = 38&lt;br /&gt;
	}, {&lt;br /&gt;
		124, 113, 35, 35, 25, 39, 47, 23, 38, 35, 35, 38, 34, 38, 46, [-15] = 0, [-14] = 13, [-13] = 25, [-12] = 80, [-11] = 93, [-10] = 42, [-9] = 77,&lt;br /&gt;
			[-8] = 86, [-7] = 329, [-6] = 277, [-5] = 180, [-4] = 102, [-3] = 119, [-2] = 113, [-1] = 69, [0] = 74&lt;br /&gt;
	}, {&lt;br /&gt;
		71, 74, 30, 34, 55, 63, 73, 75, 38, 124, 35, 31, 35, 38, 41, [-15] = 0, [-14] = 13, [-13] = 25, [-12] = 34, [-11] = 40, [-10] = 46, [-9] = 54,&lt;br /&gt;
			[-8] = 76, [-7] = 131, [-6] = 131, [-5] = 84, [-4] = 112, [-3] = 139, [-2] = 172, [-1] = 165, [0] = 59&lt;br /&gt;
	}, {&lt;br /&gt;
		79, 71, 38, 38, 58, 76, 75, 75, 127, 130, 38, 165, 34, 45, 51, [-15] = 0, [-14] = 13, [-13] = 25, [-12] = 27, [-11] = 29, [-10] = 44, [-9] = 42,&lt;br /&gt;
			[-8] = 40, [-7] = 84, [-6] = 86, [-5] = 107, [-4] = 217, [-3] = 213, [-2] = 115, [-1] = 33, [0] = 77&lt;br /&gt;
	}, {&lt;br /&gt;
		64, 68, 16, 35, 85, 85, 65, 107, 100, 99, 103, 74, 31, 26, 35, [-15] = 0, [-14] = 25, [-13] = 32, [-12] = 44, [-11] = 26, [-10] = 39, [-9] = 41,&lt;br /&gt;
			[-8] = 50, [-7] = 52, [-6] = 52, [-5] = 115, [-4] = 200, [-3] = 225, [-2] = 131, [-1] = 63, [0] = 42&lt;br /&gt;
	}, {&lt;br /&gt;
		127, 104, 16, 31, 85, 96, 73, 68, 77, 99, 103, 91, 68, 38, 47, [-15] = 0, [-14] = 36, [-13] = 41, [-12] = 38, [-11] = 61, [-10] = 39, [-9] = 40,&lt;br /&gt;
			[-8] = 50, [-7] = 59, [-6] = 66, [-5] = 101, [-4] = 223, [-3] = 222, [-2] = 130, [-1] = 121, [0] = 51&lt;br /&gt;
	}, {&lt;br /&gt;
		153, 125, 11, 38, 57, 32, 77, 38, 38, 38, 79, 54, 114, 128, 38, [-15] = 0, [-14] = 38, [-13] = 38, [-12] = 49, [-11] = 62, [-10] = 53, [-9] = 46,&lt;br /&gt;
			[-8] = 50, [-7] = 80, [-6] = 93, [-5] = 105, [-4] = 140, [-3] = 168, [-2] = 169, [-1] = 141, [0] = 86&lt;br /&gt;
	}, {&lt;br /&gt;
		71, 19, 40, 40, 38, 35, 31, 30, 31, 25, 35, 38, 61, 78, 41, [-15] = 0, [-14] = 0, [-13] = 38, [-12] = 48, [-11] = 62, [-10] = 46, [-9] = 43,&lt;br /&gt;
			[-8] = 56, [-7] = 80, [-6] = 93, [-5] = 94, [-4] = 84, [-3] = 100, [-2] = 57, [-1] = 46, [0] = 54&lt;br /&gt;
	}, {&lt;br /&gt;
		0, 0, 32, 35, 34, 41, 45, 46, 34, 40, 29, 36, 36, 39, 32, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 2, [-10] = 3, [-9] = 8, [-8] = 33,&lt;br /&gt;
			[-7] = 37, [-6] = 12, [-5] = 11, [-4] = 11, [-3] = 17, [-2] = 10, [-1] = 0, [0] = 20&lt;br /&gt;
	}, [-15] = {&lt;br /&gt;
		4, 6, 26, 40, 45, 35, 0, 0, 0, 68, 135, 227, 227, 236, 0, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 0, [-10] = 36, [-9] = 69, [-8] = 127,&lt;br /&gt;
			[-7] = 127, [-6] = 32, [-5] = 32, [-4] = 14, [-3] = 11, [-2] = 5, [-1] = 3, [0] = 4&lt;br /&gt;
	}, [-14] = {&lt;br /&gt;
		22, 48, 104, 80, 79, 60, 66, 225, 109, 225, 197, 252, 283, 293, 31, [-15] = 0, [-14] = 12, [-13] = 11, [-12] = 17, [-11] = 36, [-10] = 135,&lt;br /&gt;
			[-9] = 252, [-8] = 343, [-7] = 342, [-6] = 157, [-5] = 48, [-4] = 59, [-3] = 64, [-2] = 71, [-1] = 24, [0] = 19&lt;br /&gt;
	}, [-13] = {&lt;br /&gt;
		55, 104, 104, 98, 87, 64, 66, 225, 109, 225, 78, 74, 118, 223, 95, [-15] = 0, [-14] = 40, [-13] = 69, [-12] = 46, [-11] = 124, [-10] = 298,&lt;br /&gt;
			[-9] = 414, [-8] = 442, [-7] = 383, [-6] = 293, [-5] = 176, [-4] = 316, [-3] = 316, [-2] = 98, [-1] = 44, [0] = 55&lt;br /&gt;
	}, [-12] = {&lt;br /&gt;
		76, 88, 76, 93, 93, 79, 37, 55, 0, 0, 20, 42, 89, 198, 42, [-15] = 0, [-14] = 57, [-13] = 73, [-12] = 126, [-11] = 119, [-10] = 404, [-9] = 485,&lt;br /&gt;
			[-8] = 526, [-7] = 422, [-6] = 312, [-5] = 187, [-4] = 316, [-3] = 279, [-2] = 111, [-1] = 68, [0] = 68&lt;br /&gt;
	}, [-11] = {&lt;br /&gt;
		68, 111, 91, 97, 108, 110, 28, 8, 0, 0, 14, 49, 179, 197, 71, [-15] = 0, [-14] = 72, [-13] = 82, [-12] = 81, [-11] = 110, [-10] = 329, [-9] = 487,&lt;br /&gt;
			[-8] = 483, [-7] = 400, [-6] = 272, [-5] = 113, [-4] = 92, [-3] = 111, [-2] = 85, [-1] = 62, [0] = 68&lt;br /&gt;
	}, [-10] = {&lt;br /&gt;
		71, 159, 209, 145, 95, 90, 30, 15, 0, 0, 35, 83, 177, 175, 122, [-15] = 0, [-14] = 68, [-13] = 127, [-12] = 138, [-11] = 174, [-10] = 185,&lt;br /&gt;
			[-9] = 273, [-8] = 268, [-7] = 243, [-6] = 78, [-5] = 66, [-4] = 66, [-3] = 71, [-2] = 74, [-1] = 63, [0] = 56&lt;br /&gt;
	}, [-9] = {&lt;br /&gt;
		48, 115, 332, 295, 201, 93, 61, 17, 54, 59, 51, 115, 115, 129, 64, [-15] = 0, [-14] = 53, [-13] = 79, [-12] = 139, [-11] = 182, [-10] = 199,&lt;br /&gt;
			[-9] = 176, [-8] = 47, [-7] = 76, [-6] = 88, [-5] = 176, [-4] = 158, [-3] = 53, [-2] = 53, [-1] = 52, [0] = 89&lt;br /&gt;
	}, [-8] = {&lt;br /&gt;
		53, 53, 147, 139, 139, 93, 20, 3, 66, 69, 56, 97, 103, 108, 87, [-15] = 40, [-14] = 61, [-13] = 163, [-12] = 198, [-11] = 127, [-10] = 140,&lt;br /&gt;
			[-9] = 175, [-8] = 137, [-7] = 146, [-6] = 169, [-5] = 189, [-4] = 186, [-3] = 41, [-2] = 15, [-1] = 31, [0] = 55&lt;br /&gt;
	}, [-7] = {&lt;br /&gt;
		53, 60, 109, 105, 109, 17, 21, 18, 74, 75, 130, 130, 93, 109, 96, [-15] = 53, [-14] = 167, [-13] = 161, [-12] = 137, [-11] = 133, [-10] = 125,&lt;br /&gt;
			[-9] = 145, [-8] = 196, [-7] = 194, [-6] = 180, [-5] = 205, [-4] = 194, [-3] = 41, [-2] = 39, [-1] = 39, [0] = 15&lt;br /&gt;
	}, [-6] = {&lt;br /&gt;
		18, 34, 17, 83, 147, 42, 32, 41, 87, 144, 132, 132, 114, 107, 90, [-15] = 67, [-14] = 107, [-13] = 142, [-12] = 142, [-11] = 124, [-10] = 78,&lt;br /&gt;
			[-9] = 152, [-8] = 182, [-7] = 207, [-6] = 173, [-5] = 184, [-4] = 173, [-3] = 72, [-2] = 32, [-1] = 39, [0] = 72&lt;br /&gt;
	}, [-5] = {&lt;br /&gt;
		0, 19, 0, 74, 63, 65, 65, 46, 155, 143, 103, 94, 80, 90, 73, [-15] = 57, [-14] = 187, [-13] = 182, [-12] = 184, [-11] = 166, [-10] = 148,&lt;br /&gt;
			[-9] = 115, [-8] = 169, [-7] = 231, [-6] = 231, [-5] = 225, [-4] = 171, [-3] = 135, [-2] = 74, [-1] = 104, [0] = 57&lt;br /&gt;
	}, [-4] = {&lt;br /&gt;
		69, 0, 18, 50, 72, 63, 77, 82, 139, 139, 153, 161, 135, 91, 69, [-15] = 5, [-14] = 187, [-13] = 190, [-12] = 171, [-11] = 168, [-10] = 147,&lt;br /&gt;
			[-9] = 173, [-8] = 200, [-7] = 206, [-6] = 139, [-5] = 156, [-4] = 247, [-3] = 209, [-2] = 125, [-1] = 154, [0] = 101&lt;br /&gt;
	}, [-3] = {&lt;br /&gt;
		105, 1, 16, 15, 46, 37, 78, 86, 143, 126, 135, 161, 152, 94, 72, [-15] = 0, [-14] = 153, [-13] = 175, [-12] = 149, [-11] = 172, [-10] = 149,&lt;br /&gt;
			[-9] = 104, [-8] = 73, [-7] = 116, [-6] = 116, [-5] = 206, [-4] = 205, [-3] = 83, [-2] = 113, [-1] = 167, [0] = 162&lt;br /&gt;
	}, [-2] = {&lt;br /&gt;
		25, 1, 34, 33, 30, 57, 82, 165, 132, 131, 133, 123, 123, 113, 103, [-15] = 0, [-14] = 169, [-13] = 168, [-12] = 117, [-11] = 174, [-10] = 180,&lt;br /&gt;
			[-9] = 112, [-8] = 114, [-7] = 80, [-6] = 80, [-5] = 151, [-4] = 138, [-3] = 116, [-2] = 58, [-1] = 171, [0] = 146&lt;br /&gt;
	}, [-1] = {&lt;br /&gt;
		27, 27, 24, 27, 31, 54, 172, 79, 127, 128, 121, 111, 80, 97, 96, [-15] = 38, [-14] = 162, [-13] = 162, [-12] = 143, [-11] = 68, [-10] = 112,&lt;br /&gt;
			[-9] = 26, [-8] = 59, [-7] = 46, [-6] = 64, [-5] = 81, [-4] = 79, [-3] = 4, [-2] = 39, [-1] = 93, [0] = 26&lt;br /&gt;
	}, [0] = {&lt;br /&gt;
		25, 5, 23, 38, 32, 31, 57, 56, 27, 29, 126, 39, 78, 85, 52, [-15] = 30, [-14] = 159, [-13] = 177, [-12] = 131, [-11] = 0, [-10] = 0, [-9] = 10,&lt;br /&gt;
			[-8] = 48, [-7] = 37, [-6] = 102, [-5] = 59, [-4] = 101, [-3] = 116, [-2] = 46, [-1] = 79, [0] = 25&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=Dataset-map-height&amp;diff=73396</id>
		<title>Dataset-map-height</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=Dataset-map-height&amp;diff=73396"/>
		<updated>2022-01-15T20:35:26Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Dataset: GTA map height ==&lt;br /&gt;
The following table contains the height of the GTA terrain for each 200x200 units.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;section name=&amp;quot;Dataset code&amp;quot; class=&amp;quot;shared&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;
--[[&lt;br /&gt;
&lt;br /&gt;
	Indexes x-axis and y-axis:&lt;br /&gt;
	-15 &amp;gt; 0 &amp;gt; 15 (31 for each axis)&lt;br /&gt;
&lt;br /&gt;
	Measurements:&lt;br /&gt;
	31 * 31 = 961&lt;br /&gt;
&lt;br /&gt;
	Each measurement is:&lt;br /&gt;
	200 units&lt;br /&gt;
&lt;br /&gt;
	GTA map size:&lt;br /&gt;
	6000&lt;br /&gt;
&lt;br /&gt;
	Map size covered&lt;br /&gt;
	31 * 200 = 6200 units&lt;br /&gt;
&lt;br /&gt;
	Covered from the center:&lt;br /&gt;
	6200 / 2 = 3100&lt;br /&gt;
&lt;br /&gt;
	Margin (unintentional):&lt;br /&gt;
	3100 - 3000 = 100&lt;br /&gt;
&lt;br /&gt;
	Measurement quality:&lt;br /&gt;
	Every 1 unit (HQ)&lt;br /&gt;
&lt;br /&gt;
	Table name:&lt;br /&gt;
	mapHeight&lt;br /&gt;
&lt;br /&gt;
]] --&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------&lt;br /&gt;
-- Calculations [FROM] &amp;lt;world&amp;gt; [TO] &amp;lt;table index&amp;gt;:&lt;br /&gt;
--[[&lt;br /&gt;
	tableX = math.floor( worldX / 200 + 0.5 )&lt;br /&gt;
	tableY = math.floor( worldY / 200 + 0.5 )&lt;br /&gt;
	&lt;br /&gt;
	-- Get the height from the table:&lt;br /&gt;
	height = mapHeight[tableX][tableY]&lt;br /&gt;
]]&lt;br /&gt;
-- INFO: [math.floor] and [+ 0.5] are used to round the value up/down. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------&lt;br /&gt;
-- Calculations [FROM] &amp;lt;table index&amp;gt; [TO] &amp;lt;world&amp;gt;:&lt;br /&gt;
--[[&lt;br /&gt;
	worldX = tableX * 200&lt;br /&gt;
	worldY = tableY * 200&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
mapHeight = {&lt;br /&gt;
	{&lt;br /&gt;
		4, 0, 10, 34, 32, 59, 59, 34, 34, 34, 124, 24, 52, 79, 55, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 0, [-10] = 50, [-9] = 31, [-8] = 113,&lt;br /&gt;
			[-7] = 101, [-6] = 113, [-5] = 98, [-4] = 129, [-3] = 152, [-2] = 54, [-1] = 27, [0] = 13&lt;br /&gt;
	}, {&lt;br /&gt;
		57, 30, 30, 32, 31, 48, 41, 38, 35, 55, 50, 41, 64, 82, 48, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 0, [-10] = 33, [-9] = 34,&lt;br /&gt;
			[-8] = 113, [-7] = 80, [-6] = 107, [-5] = 124, [-4] = 118, [-3] = 147, [-2] = 133, [-1] = 52, [0] = 65&lt;br /&gt;
	}, {&lt;br /&gt;
		51, 31, 30, 22, 40, 47, 47, 24, 42, 63, 58, 44, 63, 86, 6, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 0, [-10] = 2, [-9] = 44, [-8] = 64,&lt;br /&gt;
			[-7] = 79, [-6] = 88, [-5] = 123, [-4] = 136, [-3] = 118, [-2] = 129, [-1] = 78, [0] = 82&lt;br /&gt;
	}, {&lt;br /&gt;
		68, 48, 16, 29, 31, 34, 59, 49, 44, 44, 26, 30, 55, 86, 35, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 0, [-10] = 13, [-9] = 38, [-8] = 41,&lt;br /&gt;
			[-7] = 41, [-6] = 49, [-5] = 119, [-4] = 129, [-3] = 122, [-2] = 138, [-1] = 62, [0] = 124&lt;br /&gt;
	}, {&lt;br /&gt;
		60, 51, 44, 34, 56, 38, 48, 51, 24, 25, 34, 16, 32, 53, 54, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 35, [-11] = 90, [-10] = 82, [-9] = 41,&lt;br /&gt;
			[-8] = 48, [-7] = 54, [-6] = 64, [-5] = 110, [-4] = 184, [-3] = 144, [-2] = 155, [-1] = 165, [0] = 135&lt;br /&gt;
	}, {&lt;br /&gt;
		60, 64, 64, 33, 33, 38, 48, 51, 35, 34, 27, 19, 34, 38, 43, [-15] = 0, [-14] = 1, [-13] = 12, [-12] = 31, [-11] = 103, [-10] = 81, [-9] = 52,&lt;br /&gt;
			[-8] = 61, [-7] = 75, [-6] = 115, [-5] = 148, [-4] = 121, [-3] = 136, [-2] = 148, [-1] = 178, [0] = 114&lt;br /&gt;
	}, {&lt;br /&gt;
		122, 125, 35, 35, 33, 26, 20, 20, 25, 35, 38, 34, 34, 38, 48, [-15] = 0, [-14] = 13, [-13] = 27, [-12] = 39, [-11] = 57, [-10] = 62, [-9] = 156,&lt;br /&gt;
			[-8] = 85, [-7] = 163, [-6] = 201, [-5] = 212, [-4] = 158, [-3] = 119, [-2] = 133, [-1] = 46, [0] = 38&lt;br /&gt;
	}, {&lt;br /&gt;
		124, 113, 35, 35, 25, 39, 47, 23, 38, 35, 35, 38, 34, 38, 46, [-15] = 0, [-14] = 13, [-13] = 25, [-12] = 80, [-11] = 93, [-10] = 42, [-9] = 77,&lt;br /&gt;
			[-8] = 86, [-7] = 329, [-6] = 277, [-5] = 180, [-4] = 102, [-3] = 119, [-2] = 113, [-1] = 69, [0] = 74&lt;br /&gt;
	}, {&lt;br /&gt;
		71, 74, 30, 34, 55, 63, 73, 75, 38, 124, 35, 31, 35, 38, 41, [-15] = 0, [-14] = 13, [-13] = 25, [-12] = 34, [-11] = 40, [-10] = 46, [-9] = 54,&lt;br /&gt;
			[-8] = 76, [-7] = 131, [-6] = 131, [-5] = 84, [-4] = 112, [-3] = 139, [-2] = 172, [-1] = 165, [0] = 59&lt;br /&gt;
	}, {&lt;br /&gt;
		79, 71, 38, 38, 58, 76, 75, 75, 127, 130, 38, 165, 34, 45, 51, [-15] = 0, [-14] = 13, [-13] = 25, [-12] = 27, [-11] = 29, [-10] = 44, [-9] = 42,&lt;br /&gt;
			[-8] = 40, [-7] = 84, [-6] = 86, [-5] = 107, [-4] = 217, [-3] = 213, [-2] = 115, [-1] = 33, [0] = 77&lt;br /&gt;
	}, {&lt;br /&gt;
		64, 68, 16, 35, 85, 85, 65, 107, 100, 99, 103, 74, 31, 26, 35, [-15] = 0, [-14] = 25, [-13] = 32, [-12] = 44, [-11] = 26, [-10] = 39, [-9] = 41,&lt;br /&gt;
			[-8] = 50, [-7] = 52, [-6] = 52, [-5] = 115, [-4] = 200, [-3] = 225, [-2] = 131, [-1] = 63, [0] = 42&lt;br /&gt;
	}, {&lt;br /&gt;
		127, 104, 16, 31, 85, 96, 73, 68, 77, 99, 103, 91, 68, 38, 47, [-15] = 0, [-14] = 36, [-13] = 41, [-12] = 38, [-11] = 61, [-10] = 39, [-9] = 40,&lt;br /&gt;
			[-8] = 50, [-7] = 59, [-6] = 66, [-5] = 101, [-4] = 223, [-3] = 222, [-2] = 130, [-1] = 121, [0] = 51&lt;br /&gt;
	}, {&lt;br /&gt;
		153, 125, 11, 38, 57, 32, 77, 38, 38, 38, 79, 54, 114, 128, 38, [-15] = 0, [-14] = 38, [-13] = 38, [-12] = 49, [-11] = 62, [-10] = 53, [-9] = 46,&lt;br /&gt;
			[-8] = 50, [-7] = 80, [-6] = 93, [-5] = 105, [-4] = 140, [-3] = 168, [-2] = 169, [-1] = 141, [0] = 86&lt;br /&gt;
	}, {&lt;br /&gt;
		71, 19, 40, 40, 38, 35, 31, 30, 31, 25, 35, 38, 61, 78, 41, [-15] = 0, [-14] = 0, [-13] = 38, [-12] = 48, [-11] = 62, [-10] = 46, [-9] = 43,&lt;br /&gt;
			[-8] = 56, [-7] = 80, [-6] = 93, [-5] = 94, [-4] = 84, [-3] = 100, [-2] = 57, [-1] = 46, [0] = 54&lt;br /&gt;
	}, {&lt;br /&gt;
		0, 0, 32, 35, 34, 41, 45, 46, 34, 40, 29, 36, 36, 39, 32, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 2, [-10] = 3, [-9] = 8, [-8] = 33,&lt;br /&gt;
			[-7] = 37, [-6] = 12, [-5] = 11, [-4] = 11, [-3] = 17, [-2] = 10, [-1] = 0, [0] = 20&lt;br /&gt;
	}, [-15] = {&lt;br /&gt;
		4, 6, 26, 40, 45, 35, 0, 0, 0, 68, 135, 227, 227, 236, 0, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 0, [-10] = 36, [-9] = 69, [-8] = 127,&lt;br /&gt;
			[-7] = 127, [-6] = 32, [-5] = 32, [-4] = 14, [-3] = 11, [-2] = 5, [-1] = 3, [0] = 4&lt;br /&gt;
	}, [-14] = {&lt;br /&gt;
		22, 48, 104, 80, 79, 60, 66, 225, 109, 225, 197, 252, 283, 293, 31, [-15] = 0, [-14] = 12, [-13] = 11, [-12] = 17, [-11] = 36, [-10] = 135,&lt;br /&gt;
			[-9] = 252, [-8] = 343, [-7] = 342, [-6] = 157, [-5] = 48, [-4] = 59, [-3] = 64, [-2] = 71, [-1] = 24, [0] = 19&lt;br /&gt;
	}, [-13] = {&lt;br /&gt;
		55, 104, 104, 98, 87, 64, 66, 225, 109, 225, 78, 74, 118, 223, 95, [-15] = 0, [-14] = 40, [-13] = 69, [-12] = 46, [-11] = 124, [-10] = 298,&lt;br /&gt;
			[-9] = 414, [-8] = 442, [-7] = 383, [-6] = 293, [-5] = 176, [-4] = 316, [-3] = 316, [-2] = 98, [-1] = 44, [0] = 55&lt;br /&gt;
	}, [-12] = {&lt;br /&gt;
		76, 88, 76, 93, 93, 79, 37, 55, 0, 0, 20, 42, 89, 198, 42, [-15] = 0, [-14] = 57, [-13] = 73, [-12] = 126, [-11] = 119, [-10] = 404, [-9] = 485,&lt;br /&gt;
			[-8] = 526, [-7] = 422, [-6] = 312, [-5] = 187, [-4] = 316, [-3] = 279, [-2] = 111, [-1] = 68, [0] = 68&lt;br /&gt;
	}, [-11] = {&lt;br /&gt;
		68, 111, 91, 97, 108, 110, 28, 8, 0, 0, 14, 49, 179, 197, 71, [-15] = 0, [-14] = 72, [-13] = 82, [-12] = 81, [-11] = 110, [-10] = 329, [-9] = 487,&lt;br /&gt;
			[-8] = 483, [-7] = 400, [-6] = 272, [-5] = 113, [-4] = 92, [-3] = 111, [-2] = 85, [-1] = 62, [0] = 68&lt;br /&gt;
	}, [-10] = {&lt;br /&gt;
		71, 159, 209, 145, 95, 90, 30, 15, 0, 0, 35, 83, 177, 175, 122, [-15] = 0, [-14] = 68, [-13] = 127, [-12] = 138, [-11] = 174, [-10] = 185,&lt;br /&gt;
			[-9] = 273, [-8] = 268, [-7] = 243, [-6] = 78, [-5] = 66, [-4] = 66, [-3] = 71, [-2] = 74, [-1] = 63, [0] = 56&lt;br /&gt;
	}, [-9] = {&lt;br /&gt;
		48, 115, 332, 295, 201, 93, 61, 17, 54, 59, 51, 115, 115, 129, 64, [-15] = 0, [-14] = 53, [-13] = 79, [-12] = 139, [-11] = 182, [-10] = 199,&lt;br /&gt;
			[-9] = 176, [-8] = 47, [-7] = 76, [-6] = 88, [-5] = 176, [-4] = 158, [-3] = 53, [-2] = 53, [-1] = 52, [0] = 89&lt;br /&gt;
	}, [-8] = {&lt;br /&gt;
		53, 53, 147, 139, 139, 93, 20, 3, 66, 69, 56, 97, 103, 108, 87, [-15] = 40, [-14] = 61, [-13] = 163, [-12] = 198, [-11] = 127, [-10] = 140,&lt;br /&gt;
			[-9] = 175, [-8] = 137, [-7] = 146, [-6] = 169, [-5] = 189, [-4] = 186, [-3] = 41, [-2] = 15, [-1] = 31, [0] = 55&lt;br /&gt;
	}, [-7] = {&lt;br /&gt;
		53, 60, 109, 105, 109, 17, 21, 18, 74, 75, 130, 130, 93, 109, 96, [-15] = 53, [-14] = 167, [-13] = 161, [-12] = 137, [-11] = 133, [-10] = 125,&lt;br /&gt;
			[-9] = 145, [-8] = 196, [-7] = 194, [-6] = 180, [-5] = 205, [-4] = 194, [-3] = 41, [-2] = 39, [-1] = 39, [0] = 15&lt;br /&gt;
	}, [-6] = {&lt;br /&gt;
		18, 34, 17, 83, 147, 42, 32, 41, 87, 144, 132, 132, 114, 107, 90, [-15] = 67, [-14] = 107, [-13] = 142, [-12] = 142, [-11] = 124, [-10] = 78,&lt;br /&gt;
			[-9] = 152, [-8] = 182, [-7] = 207, [-6] = 173, [-5] = 184, [-4] = 173, [-3] = 72, [-2] = 32, [-1] = 39, [0] = 72&lt;br /&gt;
	}, [-5] = {&lt;br /&gt;
		0, 19, 0, 74, 63, 65, 65, 46, 155, 143, 103, 94, 80, 90, 73, [-15] = 57, [-14] = 187, [-13] = 182, [-12] = 184, [-11] = 166, [-10] = 148,&lt;br /&gt;
			[-9] = 115, [-8] = 169, [-7] = 231, [-6] = 231, [-5] = 225, [-4] = 171, [-3] = 135, [-2] = 74, [-1] = 104, [0] = 57&lt;br /&gt;
	}, [-4] = {&lt;br /&gt;
		69, 0, 18, 50, 72, 63, 77, 82, 139, 139, 153, 161, 135, 91, 69, [-15] = 5, [-14] = 187, [-13] = 190, [-12] = 171, [-11] = 168, [-10] = 147,&lt;br /&gt;
			[-9] = 173, [-8] = 200, [-7] = 206, [-6] = 139, [-5] = 156, [-4] = 247, [-3] = 209, [-2] = 125, [-1] = 154, [0] = 101&lt;br /&gt;
	}, [-3] = {&lt;br /&gt;
		105, 1, 16, 15, 46, 37, 78, 86, 143, 126, 135, 161, 152, 94, 72, [-15] = 0, [-14] = 153, [-13] = 175, [-12] = 149, [-11] = 172, [-10] = 149,&lt;br /&gt;
			[-9] = 104, [-8] = 73, [-7] = 116, [-6] = 116, [-5] = 206, [-4] = 205, [-3] = 83, [-2] = 113, [-1] = 167, [0] = 162&lt;br /&gt;
	}, [-2] = {&lt;br /&gt;
		25, 1, 34, 33, 30, 57, 82, 165, 132, 131, 133, 123, 123, 113, 103, [-15] = 0, [-14] = 169, [-13] = 168, [-12] = 117, [-11] = 174, [-10] = 180,&lt;br /&gt;
			[-9] = 112, [-8] = 114, [-7] = 80, [-6] = 80, [-5] = 151, [-4] = 138, [-3] = 116, [-2] = 58, [-1] = 171, [0] = 146&lt;br /&gt;
	}, [-1] = {&lt;br /&gt;
		27, 27, 24, 27, 31, 54, 172, 79, 127, 128, 121, 111, 80, 97, 96, [-15] = 38, [-14] = 162, [-13] = 162, [-12] = 143, [-11] = 68, [-10] = 112,&lt;br /&gt;
			[-9] = 26, [-8] = 59, [-7] = 46, [-6] = 64, [-5] = 81, [-4] = 79, [-3] = 4, [-2] = 39, [-1] = 93, [0] = 26&lt;br /&gt;
	}, [0] = {&lt;br /&gt;
		25, 5, 23, 38, 32, 31, 57, 56, 27, 29, 126, 39, 78, 85, 52, [-15] = 30, [-14] = 159, [-13] = 177, [-12] = 131, [-11] = 0, [-10] = 0, [-9] = 10,&lt;br /&gt;
			[-8] = 48, [-7] = 37, [-6] = 102, [-5] = 59, [-4] = 101, [-3] = 116, [-2] = 46, [-1] = 79, [0] = 25&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=Dataset-map-height&amp;diff=73395</id>
		<title>Dataset-map-height</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=Dataset-map-height&amp;diff=73395"/>
		<updated>2022-01-15T20:34:07Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: Created page with &amp;quot; == Dataset: GTA map height == The following table contains the height of the GTA terrain for each 200x200 units.    &amp;lt;section name=&amp;quot;Dataset&amp;quot; class=&amp;quot;shared&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt; --  	Indexes x-axis and y-axis: 	-15 &amp;gt; 0 &amp;gt; 15 (31 for each axis)  	Measurements: 	31 * 31 = 961  	Each measurement is: 	200 units  	GTA map size: 	6000  	Map size covered 	31 * 200 = 6200 units  	Covered from the center: 	6200 / 2 = 3100  	Margin (unintentional): 	3100 - 300...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Dataset: GTA map height ==&lt;br /&gt;
The following table contains the height of the GTA terrain for each 200x200 units.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;section name=&amp;quot;Dataset&amp;quot; class=&amp;quot;shared&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;
--[[&lt;br /&gt;
&lt;br /&gt;
	Indexes x-axis and y-axis:&lt;br /&gt;
	-15 &amp;gt; 0 &amp;gt; 15 (31 for each axis)&lt;br /&gt;
&lt;br /&gt;
	Measurements:&lt;br /&gt;
	31 * 31 = 961&lt;br /&gt;
&lt;br /&gt;
	Each measurement is:&lt;br /&gt;
	200 units&lt;br /&gt;
&lt;br /&gt;
	GTA map size:&lt;br /&gt;
	6000&lt;br /&gt;
&lt;br /&gt;
	Map size covered&lt;br /&gt;
	31 * 200 = 6200 units&lt;br /&gt;
&lt;br /&gt;
	Covered from the center:&lt;br /&gt;
	6200 / 2 = 3100&lt;br /&gt;
&lt;br /&gt;
	Margin (unintentional):&lt;br /&gt;
	3100 - 3000 = 100&lt;br /&gt;
&lt;br /&gt;
	Measurement quality:&lt;br /&gt;
	Every 1 unit (HQ)&lt;br /&gt;
&lt;br /&gt;
	Table name:&lt;br /&gt;
	mapHeight&lt;br /&gt;
&lt;br /&gt;
]] --&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------&lt;br /&gt;
-- Calculations [FROM] &amp;lt;world&amp;gt; [TO] &amp;lt;table index&amp;gt;:&lt;br /&gt;
--[[&lt;br /&gt;
	tableX = math.floor( worldX / 200 + 0.5 )&lt;br /&gt;
	tableY = math.floor( worldY / 200 + 0.5 )&lt;br /&gt;
	&lt;br /&gt;
	-- Get the height from the table:&lt;br /&gt;
	height = mapHeight[tableX][tableY]&lt;br /&gt;
]]&lt;br /&gt;
-- INFO: [math.floor] and [+ 0.5] are used to round the value up/down. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
---------------------------------------------------&lt;br /&gt;
-- Calculations [FROM] &amp;lt;table index&amp;gt; [TO] &amp;lt;world&amp;gt;:&lt;br /&gt;
--[[&lt;br /&gt;
	worldX = tableX * 200&lt;br /&gt;
	worldY = tableY * 200&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
mapHeight = {&lt;br /&gt;
	{&lt;br /&gt;
		4, 0, 10, 34, 32, 59, 59, 34, 34, 34, 124, 24, 52, 79, 55, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 0, [-10] = 50, [-9] = 31, [-8] = 113,&lt;br /&gt;
			[-7] = 101, [-6] = 113, [-5] = 98, [-4] = 129, [-3] = 152, [-2] = 54, [-1] = 27, [0] = 13&lt;br /&gt;
	}, {&lt;br /&gt;
		57, 30, 30, 32, 31, 48, 41, 38, 35, 55, 50, 41, 64, 82, 48, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 0, [-10] = 33, [-9] = 34,&lt;br /&gt;
			[-8] = 113, [-7] = 80, [-6] = 107, [-5] = 124, [-4] = 118, [-3] = 147, [-2] = 133, [-1] = 52, [0] = 65&lt;br /&gt;
	}, {&lt;br /&gt;
		51, 31, 30, 22, 40, 47, 47, 24, 42, 63, 58, 44, 63, 86, 6, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 0, [-10] = 2, [-9] = 44, [-8] = 64,&lt;br /&gt;
			[-7] = 79, [-6] = 88, [-5] = 123, [-4] = 136, [-3] = 118, [-2] = 129, [-1] = 78, [0] = 82&lt;br /&gt;
	}, {&lt;br /&gt;
		68, 48, 16, 29, 31, 34, 59, 49, 44, 44, 26, 30, 55, 86, 35, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 0, [-10] = 13, [-9] = 38, [-8] = 41,&lt;br /&gt;
			[-7] = 41, [-6] = 49, [-5] = 119, [-4] = 129, [-3] = 122, [-2] = 138, [-1] = 62, [0] = 124&lt;br /&gt;
	}, {&lt;br /&gt;
		60, 51, 44, 34, 56, 38, 48, 51, 24, 25, 34, 16, 32, 53, 54, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 35, [-11] = 90, [-10] = 82, [-9] = 41,&lt;br /&gt;
			[-8] = 48, [-7] = 54, [-6] = 64, [-5] = 110, [-4] = 184, [-3] = 144, [-2] = 155, [-1] = 165, [0] = 135&lt;br /&gt;
	}, {&lt;br /&gt;
		60, 64, 64, 33, 33, 38, 48, 51, 35, 34, 27, 19, 34, 38, 43, [-15] = 0, [-14] = 1, [-13] = 12, [-12] = 31, [-11] = 103, [-10] = 81, [-9] = 52,&lt;br /&gt;
			[-8] = 61, [-7] = 75, [-6] = 115, [-5] = 148, [-4] = 121, [-3] = 136, [-2] = 148, [-1] = 178, [0] = 114&lt;br /&gt;
	}, {&lt;br /&gt;
		122, 125, 35, 35, 33, 26, 20, 20, 25, 35, 38, 34, 34, 38, 48, [-15] = 0, [-14] = 13, [-13] = 27, [-12] = 39, [-11] = 57, [-10] = 62, [-9] = 156,&lt;br /&gt;
			[-8] = 85, [-7] = 163, [-6] = 201, [-5] = 212, [-4] = 158, [-3] = 119, [-2] = 133, [-1] = 46, [0] = 38&lt;br /&gt;
	}, {&lt;br /&gt;
		124, 113, 35, 35, 25, 39, 47, 23, 38, 35, 35, 38, 34, 38, 46, [-15] = 0, [-14] = 13, [-13] = 25, [-12] = 80, [-11] = 93, [-10] = 42, [-9] = 77,&lt;br /&gt;
			[-8] = 86, [-7] = 329, [-6] = 277, [-5] = 180, [-4] = 102, [-3] = 119, [-2] = 113, [-1] = 69, [0] = 74&lt;br /&gt;
	}, {&lt;br /&gt;
		71, 74, 30, 34, 55, 63, 73, 75, 38, 124, 35, 31, 35, 38, 41, [-15] = 0, [-14] = 13, [-13] = 25, [-12] = 34, [-11] = 40, [-10] = 46, [-9] = 54,&lt;br /&gt;
			[-8] = 76, [-7] = 131, [-6] = 131, [-5] = 84, [-4] = 112, [-3] = 139, [-2] = 172, [-1] = 165, [0] = 59&lt;br /&gt;
	}, {&lt;br /&gt;
		79, 71, 38, 38, 58, 76, 75, 75, 127, 130, 38, 165, 34, 45, 51, [-15] = 0, [-14] = 13, [-13] = 25, [-12] = 27, [-11] = 29, [-10] = 44, [-9] = 42,&lt;br /&gt;
			[-8] = 40, [-7] = 84, [-6] = 86, [-5] = 107, [-4] = 217, [-3] = 213, [-2] = 115, [-1] = 33, [0] = 77&lt;br /&gt;
	}, {&lt;br /&gt;
		64, 68, 16, 35, 85, 85, 65, 107, 100, 99, 103, 74, 31, 26, 35, [-15] = 0, [-14] = 25, [-13] = 32, [-12] = 44, [-11] = 26, [-10] = 39, [-9] = 41,&lt;br /&gt;
			[-8] = 50, [-7] = 52, [-6] = 52, [-5] = 115, [-4] = 200, [-3] = 225, [-2] = 131, [-1] = 63, [0] = 42&lt;br /&gt;
	}, {&lt;br /&gt;
		127, 104, 16, 31, 85, 96, 73, 68, 77, 99, 103, 91, 68, 38, 47, [-15] = 0, [-14] = 36, [-13] = 41, [-12] = 38, [-11] = 61, [-10] = 39, [-9] = 40,&lt;br /&gt;
			[-8] = 50, [-7] = 59, [-6] = 66, [-5] = 101, [-4] = 223, [-3] = 222, [-2] = 130, [-1] = 121, [0] = 51&lt;br /&gt;
	}, {&lt;br /&gt;
		153, 125, 11, 38, 57, 32, 77, 38, 38, 38, 79, 54, 114, 128, 38, [-15] = 0, [-14] = 38, [-13] = 38, [-12] = 49, [-11] = 62, [-10] = 53, [-9] = 46,&lt;br /&gt;
			[-8] = 50, [-7] = 80, [-6] = 93, [-5] = 105, [-4] = 140, [-3] = 168, [-2] = 169, [-1] = 141, [0] = 86&lt;br /&gt;
	}, {&lt;br /&gt;
		71, 19, 40, 40, 38, 35, 31, 30, 31, 25, 35, 38, 61, 78, 41, [-15] = 0, [-14] = 0, [-13] = 38, [-12] = 48, [-11] = 62, [-10] = 46, [-9] = 43,&lt;br /&gt;
			[-8] = 56, [-7] = 80, [-6] = 93, [-5] = 94, [-4] = 84, [-3] = 100, [-2] = 57, [-1] = 46, [0] = 54&lt;br /&gt;
	}, {&lt;br /&gt;
		0, 0, 32, 35, 34, 41, 45, 46, 34, 40, 29, 36, 36, 39, 32, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 2, [-10] = 3, [-9] = 8, [-8] = 33,&lt;br /&gt;
			[-7] = 37, [-6] = 12, [-5] = 11, [-4] = 11, [-3] = 17, [-2] = 10, [-1] = 0, [0] = 20&lt;br /&gt;
	}, [-15] = {&lt;br /&gt;
		4, 6, 26, 40, 45, 35, 0, 0, 0, 68, 135, 227, 227, 236, 0, [-15] = 0, [-14] = 0, [-13] = 0, [-12] = 0, [-11] = 0, [-10] = 36, [-9] = 69, [-8] = 127,&lt;br /&gt;
			[-7] = 127, [-6] = 32, [-5] = 32, [-4] = 14, [-3] = 11, [-2] = 5, [-1] = 3, [0] = 4&lt;br /&gt;
	}, [-14] = {&lt;br /&gt;
		22, 48, 104, 80, 79, 60, 66, 225, 109, 225, 197, 252, 283, 293, 31, [-15] = 0, [-14] = 12, [-13] = 11, [-12] = 17, [-11] = 36, [-10] = 135,&lt;br /&gt;
			[-9] = 252, [-8] = 343, [-7] = 342, [-6] = 157, [-5] = 48, [-4] = 59, [-3] = 64, [-2] = 71, [-1] = 24, [0] = 19&lt;br /&gt;
	}, [-13] = {&lt;br /&gt;
		55, 104, 104, 98, 87, 64, 66, 225, 109, 225, 78, 74, 118, 223, 95, [-15] = 0, [-14] = 40, [-13] = 69, [-12] = 46, [-11] = 124, [-10] = 298,&lt;br /&gt;
			[-9] = 414, [-8] = 442, [-7] = 383, [-6] = 293, [-5] = 176, [-4] = 316, [-3] = 316, [-2] = 98, [-1] = 44, [0] = 55&lt;br /&gt;
	}, [-12] = {&lt;br /&gt;
		76, 88, 76, 93, 93, 79, 37, 55, 0, 0, 20, 42, 89, 198, 42, [-15] = 0, [-14] = 57, [-13] = 73, [-12] = 126, [-11] = 119, [-10] = 404, [-9] = 485,&lt;br /&gt;
			[-8] = 526, [-7] = 422, [-6] = 312, [-5] = 187, [-4] = 316, [-3] = 279, [-2] = 111, [-1] = 68, [0] = 68&lt;br /&gt;
	}, [-11] = {&lt;br /&gt;
		68, 111, 91, 97, 108, 110, 28, 8, 0, 0, 14, 49, 179, 197, 71, [-15] = 0, [-14] = 72, [-13] = 82, [-12] = 81, [-11] = 110, [-10] = 329, [-9] = 487,&lt;br /&gt;
			[-8] = 483, [-7] = 400, [-6] = 272, [-5] = 113, [-4] = 92, [-3] = 111, [-2] = 85, [-1] = 62, [0] = 68&lt;br /&gt;
	}, [-10] = {&lt;br /&gt;
		71, 159, 209, 145, 95, 90, 30, 15, 0, 0, 35, 83, 177, 175, 122, [-15] = 0, [-14] = 68, [-13] = 127, [-12] = 138, [-11] = 174, [-10] = 185,&lt;br /&gt;
			[-9] = 273, [-8] = 268, [-7] = 243, [-6] = 78, [-5] = 66, [-4] = 66, [-3] = 71, [-2] = 74, [-1] = 63, [0] = 56&lt;br /&gt;
	}, [-9] = {&lt;br /&gt;
		48, 115, 332, 295, 201, 93, 61, 17, 54, 59, 51, 115, 115, 129, 64, [-15] = 0, [-14] = 53, [-13] = 79, [-12] = 139, [-11] = 182, [-10] = 199,&lt;br /&gt;
			[-9] = 176, [-8] = 47, [-7] = 76, [-6] = 88, [-5] = 176, [-4] = 158, [-3] = 53, [-2] = 53, [-1] = 52, [0] = 89&lt;br /&gt;
	}, [-8] = {&lt;br /&gt;
		53, 53, 147, 139, 139, 93, 20, 3, 66, 69, 56, 97, 103, 108, 87, [-15] = 40, [-14] = 61, [-13] = 163, [-12] = 198, [-11] = 127, [-10] = 140,&lt;br /&gt;
			[-9] = 175, [-8] = 137, [-7] = 146, [-6] = 169, [-5] = 189, [-4] = 186, [-3] = 41, [-2] = 15, [-1] = 31, [0] = 55&lt;br /&gt;
	}, [-7] = {&lt;br /&gt;
		53, 60, 109, 105, 109, 17, 21, 18, 74, 75, 130, 130, 93, 109, 96, [-15] = 53, [-14] = 167, [-13] = 161, [-12] = 137, [-11] = 133, [-10] = 125,&lt;br /&gt;
			[-9] = 145, [-8] = 196, [-7] = 194, [-6] = 180, [-5] = 205, [-4] = 194, [-3] = 41, [-2] = 39, [-1] = 39, [0] = 15&lt;br /&gt;
	}, [-6] = {&lt;br /&gt;
		18, 34, 17, 83, 147, 42, 32, 41, 87, 144, 132, 132, 114, 107, 90, [-15] = 67, [-14] = 107, [-13] = 142, [-12] = 142, [-11] = 124, [-10] = 78,&lt;br /&gt;
			[-9] = 152, [-8] = 182, [-7] = 207, [-6] = 173, [-5] = 184, [-4] = 173, [-3] = 72, [-2] = 32, [-1] = 39, [0] = 72&lt;br /&gt;
	}, [-5] = {&lt;br /&gt;
		0, 19, 0, 74, 63, 65, 65, 46, 155, 143, 103, 94, 80, 90, 73, [-15] = 57, [-14] = 187, [-13] = 182, [-12] = 184, [-11] = 166, [-10] = 148,&lt;br /&gt;
			[-9] = 115, [-8] = 169, [-7] = 231, [-6] = 231, [-5] = 225, [-4] = 171, [-3] = 135, [-2] = 74, [-1] = 104, [0] = 57&lt;br /&gt;
	}, [-4] = {&lt;br /&gt;
		69, 0, 18, 50, 72, 63, 77, 82, 139, 139, 153, 161, 135, 91, 69, [-15] = 5, [-14] = 187, [-13] = 190, [-12] = 171, [-11] = 168, [-10] = 147,&lt;br /&gt;
			[-9] = 173, [-8] = 200, [-7] = 206, [-6] = 139, [-5] = 156, [-4] = 247, [-3] = 209, [-2] = 125, [-1] = 154, [0] = 101&lt;br /&gt;
	}, [-3] = {&lt;br /&gt;
		105, 1, 16, 15, 46, 37, 78, 86, 143, 126, 135, 161, 152, 94, 72, [-15] = 0, [-14] = 153, [-13] = 175, [-12] = 149, [-11] = 172, [-10] = 149,&lt;br /&gt;
			[-9] = 104, [-8] = 73, [-7] = 116, [-6] = 116, [-5] = 206, [-4] = 205, [-3] = 83, [-2] = 113, [-1] = 167, [0] = 162&lt;br /&gt;
	}, [-2] = {&lt;br /&gt;
		25, 1, 34, 33, 30, 57, 82, 165, 132, 131, 133, 123, 123, 113, 103, [-15] = 0, [-14] = 169, [-13] = 168, [-12] = 117, [-11] = 174, [-10] = 180,&lt;br /&gt;
			[-9] = 112, [-8] = 114, [-7] = 80, [-6] = 80, [-5] = 151, [-4] = 138, [-3] = 116, [-2] = 58, [-1] = 171, [0] = 146&lt;br /&gt;
	}, [-1] = {&lt;br /&gt;
		27, 27, 24, 27, 31, 54, 172, 79, 127, 128, 121, 111, 80, 97, 96, [-15] = 38, [-14] = 162, [-13] = 162, [-12] = 143, [-11] = 68, [-10] = 112,&lt;br /&gt;
			[-9] = 26, [-8] = 59, [-7] = 46, [-6] = 64, [-5] = 81, [-4] = 79, [-3] = 4, [-2] = 39, [-1] = 93, [0] = 26&lt;br /&gt;
	}, [0] = {&lt;br /&gt;
		25, 5, 23, 38, 32, 31, 57, 56, 27, 29, 126, 39, 78, 85, 52, [-15] = 30, [-14] = 159, [-13] = 177, [-12] = 131, [-11] = 0, [-10] = 0, [-9] = 10,&lt;br /&gt;
			[-8] = 48, [-7] = 37, [-6] = 102, [-5] = 59, [-4] = 101, [-3] = 116, [-2] = 46, [-1] = 79, [0] = 25&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=Template:Useful_Functions&amp;diff=72981</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=72981"/>
		<updated>2021-10-31T15:05:12Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: Add gender function&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;
*[[table.toStringArray]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function converts '''array''' 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;
&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.&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;
&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;
&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;
&lt;br /&gt;
=== Element functions === &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;
&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;
*[[getClipboard]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This event returns the contents of the clipboard by pressing ctrl + v / ctrl + V. Event triggered ONLY if cursor is showing.&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;
&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;
*[[getDistance]] &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;
*[[getDistanceBetweenElements]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» Esta funcion sirve para obtener la distancia entre dos elementos.&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;
*[[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;
*[[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;
*[[guiGridListSetColumnsFixedWidth]] &amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function makes a gridlist have all its columns fixed width.&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;
&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;
*[[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;
&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;
*[[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;
*[[warpToPlayer]]&amp;lt;span style=&amp;quot;color:gray; font-size:smaller;&amp;quot;&amp;gt;» This function make player warp to another player.&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;
*[[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;
&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;
&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;
*[[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;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Useful Functions]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetPedGender&amp;diff=72980</id>
		<title>GetPedGender</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetPedGender&amp;diff=72980"/>
		<updated>2021-10-31T14:57:49Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: /* Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
Get the gender of peds and players.&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 = getPedGender(element ped)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''ped:''' The ped/player you want the gender of.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns 1 value:&lt;br /&gt;
* '''gender:''' The gender of the ped/player. Possible values: &amp;quot;male&amp;quot;, &amp;quot;female&amp;quot; (or &amp;quot;unknown&amp;quot;). Returns false if no player/ped element is provided.&lt;br /&gt;
&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;false&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local maleSkins = {&lt;br /&gt;
	[0]=true,[7]=true,[14]=true,[15]=true,[16]=true,[17]=true,[18]=true,[19]=true,[20]=true,[21]=true,[22]=true,[23]=true,&lt;br /&gt;
	[24]=true,[25]=true,[26]=true,[27]=true,[28]=true,[29]=true,[30]=true,[32]=true,[33]=true,[34]=true,[35]=true,[36]=true,&lt;br /&gt;
	[37]=true,[43]=true,[44]=true,[45]=true,[46]=true,[47]=true,[48]=true,[49]=true,[50]=true,[51]=true,[52]=true,[57]=true,&lt;br /&gt;
	[58]=true,[59]=true,[60]=true,[61]=true,[62]=true,[66]=true,[67]=true,[68]=true,[70]=true,[71]=true,[72]=true,[73]=true,&lt;br /&gt;
	[78]=true,[79]=true,[80]=true,[81]=true,[82]=true,[83]=true,[84]=true,[94]=true,[95]=true,[96]=true,[97]=true,[98]=true,&lt;br /&gt;
	[99]=true,[100]=true,[101]=true,[102]=true,[103]=true,[104]=true,[105]=true,[106]=true,[107]=true,[108]=true,[109]=true,&lt;br /&gt;
	[110]=true,[111]=true,[112]=true,[113]=true,[114]=true,[115]=true,[116]=true,[117]=true,[118]=true,[120]=true,[121]=true,&lt;br /&gt;
	[122]=true,[123]=true,[124]=true,[125]=true,[126]=true,[127]=true,[128]=true,[132]=true,[133]=true,[134]=true,[135]=true,&lt;br /&gt;
	[136]=true,[137]=true,[142]=true,[143]=true,[144]=true,[146]=true,[147]=true,[153]=true,[154]=true,[155]=true,[156]=true,&lt;br /&gt;
	[158]=true,[159]=true,[160]=true,[161]=true,[162]=true,[163]=true,[164]=true,[165]=true,[166]=true,[167]=true,[168]=true,&lt;br /&gt;
	[170]=true,[171]=true,[173]=true,[174]=true,[175]=true,[176]=true,[177]=true,[179]=true,[180]=true,[181]=true,[182]=true,&lt;br /&gt;
	[183]=true,[184]=true,[185]=true,[186]=true,[187]=true,[188]=true,[189]=true,[200]=true,[202]=true,[203]=true,[204]=true,&lt;br /&gt;
	[206]=true,[209]=true,[210]=true,[212]=true,[213]=true,[217]=true,[220]=true,[221]=true,[222]=true,[223]=true,[227]=true,&lt;br /&gt;
	[228]=true,[229]=true,[230]=true,[234]=true,[235]=true,[236]=true,[239]=true,[240]=true,[241]=true,[242]=true,[247]=true,&lt;br /&gt;
	[248]=true,[249]=true,[250]=true,[252]=true,[253]=true,[254]=true,[255]=true,[258]=true,[259]=true,[260]=true,[261]=true,&lt;br /&gt;
	[262]=true,[264]=true,[265]=true,[266]=true,[267]=true,[268]=true,[269]=true,[270]=true,[271]=true,[272]=true,[274]=true,&lt;br /&gt;
	[275]=true,[276]=true,[277]=true,[278]=true,[279]=true,[280]=true,[281]=true,[282]=true,[283]=true,[284]=true,[285]=true,&lt;br /&gt;
	[286]=true,[287]=true,[288]=true,[290]=true,[291]=true,[292]=true,[293]=true,[294]=true,[295]=true,[296]=true,[297]=true,&lt;br /&gt;
	[299]=true,[300]=true,[301]=true,[302]=true,[303]=true,[305]=true,[306]=true,[307]=true,[308]=true,[309]=true,[310]=true,&lt;br /&gt;
	[311]=true,[312]=true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local femaleSkins = {&lt;br /&gt;
	[9]=true,[10]=true,[11]=true,[12]=true,[13]=true,[31]=true,[38]=true,[39]=true,[40]=true,[41]=true,[53]=true,[54]=true,&lt;br /&gt;
	[55]=true,[56]=true,[63]=true,[64]=true,[69]=true,[75]=true,[76]=true,[77]=true,[85]=true,[87]=true,[88]=true,[89]=true,&lt;br /&gt;
	[90]=true,[91]=true,[92]=true,[93]=true,[129]=true,[130]=true,[131]=true,[138]=true,[139]=true,[140]=true,[141]=true,&lt;br /&gt;
	[145]=true,[148]=true,[150]=true,[151]=true,[152]=true,[157]=true,[169]=true,[172]=true,[178]=true,[190]=true,[191]=true,&lt;br /&gt;
	[192]=true,[193]=true,[194]=true,[195]=true,[196]=true,[197]=true,[198]=true,[199]=true,[201]=true,[205]=true,[207]=true,&lt;br /&gt;
	[211]=true,[214]=true,[215]=true,[216]=true,[218]=true,[219]=true,[224]=true,[225]=true,[226]=true,[231]=true,[232]=true,&lt;br /&gt;
	[233]=true,[237]=true,[238]=true,[243]=true,[244]=true,[245]=true,[246]=true,[251]=true,[256]=true,[257]=true,[263]=true,&lt;br /&gt;
	[298]=true,[304]=true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local pedElementTypes = {&lt;br /&gt;
	ped = true,&lt;br /&gt;
	player = true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function getPedGender(ped)&lt;br /&gt;
	if not (isElement(ped) and pedElementTypes[getElementType(ped)]) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	local model = getElementModel(ped)&lt;br /&gt;
	return getSkinGender(model)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getSkinGender(model)&lt;br /&gt;
	return maleSkins[model] and &amp;quot;male&amp;quot; or femaleSkins[model] and &amp;quot;female&amp;quot; or &amp;quot;unknown&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Client&amp;quot; class=&amp;quot;client&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
--[[&lt;br /&gt;
&lt;br /&gt;
The command /gender will display the gender of your player element.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
addCommandHandler(&amp;quot;gender&amp;quot;, &lt;br /&gt;
function () &lt;br /&gt;
	outputChatBox(&amp;quot;My gender: &amp;quot; .. tostring(getPedGender(localPlayer)))&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Author: IIYAMA.&lt;br /&gt;
Dataset by: Lexr128&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetPedGender&amp;diff=72979</id>
		<title>GetPedGender</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetPedGender&amp;diff=72979"/>
		<updated>2021-10-31T14:57:36Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: /* Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
Get the gender of peds and players.&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 = getPedGender(element ped)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''ped:''' The ped/player you want the gender of.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns 1 value:&lt;br /&gt;
* '''gender:''' The gender of the ped/player. Possible values: &amp;quot;male&amp;quot;, &amp;quot;female&amp;quot; (or &amp;quot;unknown&amp;quot;). Returns false if no player/ped element is provided.&lt;br /&gt;
&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;false&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local maleSkins = {&lt;br /&gt;
	[0]=true,[7]=true,[14]=true,[15]=true,[16]=true,[17]=true,[18]=true,[19]=true,[20]=true,[21]=true,[22]=true,[23]=true,&lt;br /&gt;
	[24]=true,[25]=true,[26]=true,[27]=true,[28]=true,[29]=true,[30]=true,[32]=true,[33]=true,[34]=true,[35]=true,[36]=true,&lt;br /&gt;
	[37]=true,[43]=true,[44]=true,[45]=true,[46]=true,[47]=true,[48]=true,[49]=true,[50]=true,[51]=true,[52]=true,[57]=true,&lt;br /&gt;
	[58]=true,[59]=true,[60]=true,[61]=true,[62]=true,[66]=true,[67]=true,[68]=true,[70]=true,[71]=true,[72]=true,[73]=true,&lt;br /&gt;
	[78]=true,[79]=true,[80]=true,[81]=true,[82]=true,[83]=true,[84]=true,[94]=true,[95]=true,[96]=true,[97]=true,[98]=true,&lt;br /&gt;
	[99]=true,[100]=true,[101]=true,[102]=true,[103]=true,[104]=true,[105]=true,[106]=true,[107]=true,[108]=true,[109]=true,&lt;br /&gt;
	[110]=true,[111]=true,[112]=true,[113]=true,[114]=true,[115]=true,[116]=true,[117]=true,[118]=true,[120]=true,[121]=true,&lt;br /&gt;
	[122]=true,[123]=true,[124]=true,[125]=true,[126]=true,[127]=true,[128]=true,[132]=true,[133]=true,[134]=true,[135]=true,&lt;br /&gt;
	[136]=true,[137]=true,[142]=true,[143]=true,[144]=true,[146]=true,[147]=true,[153]=true,[154]=true,[155]=true,[156]=true,&lt;br /&gt;
	[158]=true,[159]=true,[160]=true,[161]=true,[162]=true,[163]=true,[164]=true,[165]=true,[166]=true,[167]=true,[168]=true,&lt;br /&gt;
	[170]=true,[171]=true,[173]=true,[174]=true,[175]=true,[176]=true,[177]=true,[179]=true,[180]=true,[181]=true,[182]=true,&lt;br /&gt;
	[183]=true,[184]=true,[185]=true,[186]=true,[187]=true,[188]=true,[189]=true,[200]=true,[202]=true,[203]=true,[204]=true,&lt;br /&gt;
	[206]=true,[209]=true,[210]=true,[212]=true,[213]=true,[217]=true,[220]=true,[221]=true,[222]=true,[223]=true,[227]=true,&lt;br /&gt;
	[228]=true,[229]=true,[230]=true,[234]=true,[235]=true,[236]=true,[239]=true,[240]=true,[241]=true,[242]=true,[247]=true,&lt;br /&gt;
	[248]=true,[249]=true,[250]=true,[252]=true,[253]=true,[254]=true,[255]=true,[258]=true,[259]=true,[260]=true,[261]=true,&lt;br /&gt;
	[262]=true,[264]=true,[265]=true,[266]=true,[267]=true,[268]=true,[269]=true,[270]=true,[271]=true,[272]=true,[274]=true,&lt;br /&gt;
	[275]=true,[276]=true,[277]=true,[278]=true,[279]=true,[280]=true,[281]=true,[282]=true,[283]=true,[284]=true,[285]=true,&lt;br /&gt;
	[286]=true,[287]=true,[288]=true,[290]=true,[291]=true,[292]=true,[293]=true,[294]=true,[295]=true,[296]=true,[297]=true,&lt;br /&gt;
	[299]=true,[300]=true,[301]=true,[302]=true,[303]=true,[305]=true,[306]=true,[307]=true,[308]=true,[309]=true,[310]=true,&lt;br /&gt;
	[311]=true,[312]=true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local femaleSkins = {&lt;br /&gt;
	[9]=true,[10]=true,[11]=true,[12]=true,[13]=true,[31]=true,[38]=true,[39]=true,[40]=true,[41]=true,[53]=true,[54]=true,&lt;br /&gt;
	[55]=true,[56]=true,[63]=true,[64]=true,[69]=true,[75]=true,[76]=true,[77]=true,[85]=true,[87]=true,[88]=true,[89]=true,&lt;br /&gt;
	[90]=true,[91]=true,[92]=true,[93]=true,[129]=true,[130]=true,[131]=true,[138]=true,[139]=true,[140]=true,[141]=true,&lt;br /&gt;
	[145]=true,[148]=true,[150]=true,[151]=true,[152]=true,[157]=true,[169]=true,[172]=true,[178]=true,[190]=true,[191]=true,&lt;br /&gt;
	[192]=true,[193]=true,[194]=true,[195]=true,[196]=true,[197]=true,[198]=true,[199]=true,[201]=true,[205]=true,[207]=true,&lt;br /&gt;
	[211]=true,[214]=true,[215]=true,[216]=true,[218]=true,[219]=true,[224]=true,[225]=true,[226]=true,[231]=true,[232]=true,&lt;br /&gt;
	[233]=true,[237]=true,[238]=true,[243]=true,[244]=true,[245]=true,[246]=true,[251]=true,[256]=true,[257]=true,[263]=true,&lt;br /&gt;
	[298]=true,[304]=true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local pedElementTypes = {&lt;br /&gt;
	ped = true,&lt;br /&gt;
	player = true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function getPedGender(ped)&lt;br /&gt;
	if not (isElement(ped) and pedElementTypes[getElementType(ped)]) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	local model = getElementModel(ped)&lt;br /&gt;
	return getSkinGender(model)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getSkinGender(model)&lt;br /&gt;
	return maleSkins[model] and &amp;quot;male&amp;quot; or femaleSkins[model] and &amp;quot;female&amp;quot; or &amp;quot;unknown&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Client&amp;quot; class=&amp;quot;client&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
--[[&lt;br /&gt;
&lt;br /&gt;
The command /gender will display the gender of your player element.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
addCommandHandler(&amp;quot;gender&amp;quot;, &lt;br /&gt;
function () &lt;br /&gt;
	outputChatBox(&amp;quot;My gender: &amp;quot; .. tostring(getPedGender(localPlayer)))&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
Dataset by: Lexr128&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetPedGender&amp;diff=72978</id>
		<title>GetPedGender</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetPedGender&amp;diff=72978"/>
		<updated>2021-10-31T14:54:51Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: /* Returns */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
Get the gender of peds and players.&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 = getPedGender(element ped)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''ped:''' The ped/player you want the gender of.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns 1 value:&lt;br /&gt;
* '''gender:''' The gender of the ped/player. Possible values: &amp;quot;male&amp;quot;, &amp;quot;female&amp;quot; (or &amp;quot;unknown&amp;quot;). Returns false if no player/ped element is provided.&lt;br /&gt;
&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;false&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local maleSkins = {&lt;br /&gt;
	[0]=true,[7]=true,[14]=true,[15]=true,[16]=true,[17]=true,[18]=true,[19]=true,[20]=true,[21]=true,[22]=true,[23]=true,&lt;br /&gt;
	[24]=true,[25]=true,[26]=true,[27]=true,[28]=true,[29]=true,[30]=true,[32]=true,[33]=true,[34]=true,[35]=true,[36]=true,&lt;br /&gt;
	[37]=true,[43]=true,[44]=true,[45]=true,[46]=true,[47]=true,[48]=true,[49]=true,[50]=true,[51]=true,[52]=true,[57]=true,&lt;br /&gt;
	[58]=true,[59]=true,[60]=true,[61]=true,[62]=true,[66]=true,[67]=true,[68]=true,[70]=true,[71]=true,[72]=true,[73]=true,&lt;br /&gt;
	[78]=true,[79]=true,[80]=true,[81]=true,[82]=true,[83]=true,[84]=true,[94]=true,[95]=true,[96]=true,[97]=true,[98]=true,&lt;br /&gt;
	[99]=true,[100]=true,[101]=true,[102]=true,[103]=true,[104]=true,[105]=true,[106]=true,[107]=true,[108]=true,[109]=true,&lt;br /&gt;
	[110]=true,[111]=true,[112]=true,[113]=true,[114]=true,[115]=true,[116]=true,[117]=true,[118]=true,[120]=true,[121]=true,&lt;br /&gt;
	[122]=true,[123]=true,[124]=true,[125]=true,[126]=true,[127]=true,[128]=true,[132]=true,[133]=true,[134]=true,[135]=true,&lt;br /&gt;
	[136]=true,[137]=true,[142]=true,[143]=true,[144]=true,[146]=true,[147]=true,[153]=true,[154]=true,[155]=true,[156]=true,&lt;br /&gt;
	[158]=true,[159]=true,[160]=true,[161]=true,[162]=true,[163]=true,[164]=true,[165]=true,[166]=true,[167]=true,[168]=true,&lt;br /&gt;
	[170]=true,[171]=true,[173]=true,[174]=true,[175]=true,[176]=true,[177]=true,[179]=true,[180]=true,[181]=true,[182]=true,&lt;br /&gt;
	[183]=true,[184]=true,[185]=true,[186]=true,[187]=true,[188]=true,[189]=true,[200]=true,[202]=true,[203]=true,[204]=true,&lt;br /&gt;
	[206]=true,[209]=true,[210]=true,[212]=true,[213]=true,[217]=true,[220]=true,[221]=true,[222]=true,[223]=true,[227]=true,&lt;br /&gt;
	[228]=true,[229]=true,[230]=true,[234]=true,[235]=true,[236]=true,[239]=true,[240]=true,[241]=true,[242]=true,[247]=true,&lt;br /&gt;
	[248]=true,[249]=true,[250]=true,[252]=true,[253]=true,[254]=true,[255]=true,[258]=true,[259]=true,[260]=true,[261]=true,&lt;br /&gt;
	[262]=true,[264]=true,[265]=true,[266]=true,[267]=true,[268]=true,[269]=true,[270]=true,[271]=true,[272]=true,[274]=true,&lt;br /&gt;
	[275]=true,[276]=true,[277]=true,[278]=true,[279]=true,[280]=true,[281]=true,[282]=true,[283]=true,[284]=true,[285]=true,&lt;br /&gt;
	[286]=true,[287]=true,[288]=true,[290]=true,[291]=true,[292]=true,[293]=true,[294]=true,[295]=true,[296]=true,[297]=true,&lt;br /&gt;
	[299]=true,[300]=true,[301]=true,[302]=true,[303]=true,[305]=true,[306]=true,[307]=true,[308]=true,[309]=true,[310]=true,&lt;br /&gt;
	[311]=true,[312]=true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local femaleSkins = {&lt;br /&gt;
	[9]=true,[10]=true,[11]=true,[12]=true,[13]=true,[31]=true,[38]=true,[39]=true,[40]=true,[41]=true,[53]=true,[54]=true,&lt;br /&gt;
	[55]=true,[56]=true,[63]=true,[64]=true,[69]=true,[75]=true,[76]=true,[77]=true,[85]=true,[87]=true,[88]=true,[89]=true,&lt;br /&gt;
	[90]=true,[91]=true,[92]=true,[93]=true,[129]=true,[130]=true,[131]=true,[138]=true,[139]=true,[140]=true,[141]=true,&lt;br /&gt;
	[145]=true,[148]=true,[150]=true,[151]=true,[152]=true,[157]=true,[169]=true,[172]=true,[178]=true,[190]=true,[191]=true,&lt;br /&gt;
	[192]=true,[193]=true,[194]=true,[195]=true,[196]=true,[197]=true,[198]=true,[199]=true,[201]=true,[205]=true,[207]=true,&lt;br /&gt;
	[211]=true,[214]=true,[215]=true,[216]=true,[218]=true,[219]=true,[224]=true,[225]=true,[226]=true,[231]=true,[232]=true,&lt;br /&gt;
	[233]=true,[237]=true,[238]=true,[243]=true,[244]=true,[245]=true,[246]=true,[251]=true,[256]=true,[257]=true,[263]=true,&lt;br /&gt;
	[298]=true,[304]=true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local pedElementTypes = {&lt;br /&gt;
	ped = true,&lt;br /&gt;
	player = true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function getPedGender(ped)&lt;br /&gt;
	if not (isElement(ped) and pedElementTypes[getElementType(ped)]) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	local model = getElementModel(ped)&lt;br /&gt;
	return getSkinGender(model)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getSkinGender(model)&lt;br /&gt;
	return maleSkins[model] and &amp;quot;male&amp;quot; or femaleSkins[model] and &amp;quot;female&amp;quot; or &amp;quot;unknown&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Client&amp;quot; class=&amp;quot;client&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
--[[&lt;br /&gt;
&lt;br /&gt;
The command /gender will display the gender of your player element.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
addCommandHandler(&amp;quot;gender&amp;quot;, &lt;br /&gt;
function () &lt;br /&gt;
	outputChatBox(&amp;quot;My gender: &amp;quot; .. tostring(getPedGender(localPlayer)))&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetPedGender&amp;diff=72977</id>
		<title>GetPedGender</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetPedGender&amp;diff=72977"/>
		<updated>2021-10-31T14:53:41Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: Created page with &amp;quot;__NOTOC__ {{Useful Function}}  Get the gender of peds and players.  ==Syntax== &amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt; string = getPedGender(element ped) &amp;lt;/syntaxhighlight&amp;gt;  ===Required...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
Get the gender of peds and players.&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 = getPedGender(element ped)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''ped:''' The ped/player you want the gender of.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns 1 value:&lt;br /&gt;
* '''gender:''' The gender of the ped/player. values: &amp;quot;male&amp;quot;, &amp;quot;female&amp;quot; (or &amp;quot;unknown&amp;quot;). Returns false if no player/ped element is provided.&lt;br /&gt;
&lt;br /&gt;
&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;false&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local maleSkins = {&lt;br /&gt;
	[0]=true,[7]=true,[14]=true,[15]=true,[16]=true,[17]=true,[18]=true,[19]=true,[20]=true,[21]=true,[22]=true,[23]=true,&lt;br /&gt;
	[24]=true,[25]=true,[26]=true,[27]=true,[28]=true,[29]=true,[30]=true,[32]=true,[33]=true,[34]=true,[35]=true,[36]=true,&lt;br /&gt;
	[37]=true,[43]=true,[44]=true,[45]=true,[46]=true,[47]=true,[48]=true,[49]=true,[50]=true,[51]=true,[52]=true,[57]=true,&lt;br /&gt;
	[58]=true,[59]=true,[60]=true,[61]=true,[62]=true,[66]=true,[67]=true,[68]=true,[70]=true,[71]=true,[72]=true,[73]=true,&lt;br /&gt;
	[78]=true,[79]=true,[80]=true,[81]=true,[82]=true,[83]=true,[84]=true,[94]=true,[95]=true,[96]=true,[97]=true,[98]=true,&lt;br /&gt;
	[99]=true,[100]=true,[101]=true,[102]=true,[103]=true,[104]=true,[105]=true,[106]=true,[107]=true,[108]=true,[109]=true,&lt;br /&gt;
	[110]=true,[111]=true,[112]=true,[113]=true,[114]=true,[115]=true,[116]=true,[117]=true,[118]=true,[120]=true,[121]=true,&lt;br /&gt;
	[122]=true,[123]=true,[124]=true,[125]=true,[126]=true,[127]=true,[128]=true,[132]=true,[133]=true,[134]=true,[135]=true,&lt;br /&gt;
	[136]=true,[137]=true,[142]=true,[143]=true,[144]=true,[146]=true,[147]=true,[153]=true,[154]=true,[155]=true,[156]=true,&lt;br /&gt;
	[158]=true,[159]=true,[160]=true,[161]=true,[162]=true,[163]=true,[164]=true,[165]=true,[166]=true,[167]=true,[168]=true,&lt;br /&gt;
	[170]=true,[171]=true,[173]=true,[174]=true,[175]=true,[176]=true,[177]=true,[179]=true,[180]=true,[181]=true,[182]=true,&lt;br /&gt;
	[183]=true,[184]=true,[185]=true,[186]=true,[187]=true,[188]=true,[189]=true,[200]=true,[202]=true,[203]=true,[204]=true,&lt;br /&gt;
	[206]=true,[209]=true,[210]=true,[212]=true,[213]=true,[217]=true,[220]=true,[221]=true,[222]=true,[223]=true,[227]=true,&lt;br /&gt;
	[228]=true,[229]=true,[230]=true,[234]=true,[235]=true,[236]=true,[239]=true,[240]=true,[241]=true,[242]=true,[247]=true,&lt;br /&gt;
	[248]=true,[249]=true,[250]=true,[252]=true,[253]=true,[254]=true,[255]=true,[258]=true,[259]=true,[260]=true,[261]=true,&lt;br /&gt;
	[262]=true,[264]=true,[265]=true,[266]=true,[267]=true,[268]=true,[269]=true,[270]=true,[271]=true,[272]=true,[274]=true,&lt;br /&gt;
	[275]=true,[276]=true,[277]=true,[278]=true,[279]=true,[280]=true,[281]=true,[282]=true,[283]=true,[284]=true,[285]=true,&lt;br /&gt;
	[286]=true,[287]=true,[288]=true,[290]=true,[291]=true,[292]=true,[293]=true,[294]=true,[295]=true,[296]=true,[297]=true,&lt;br /&gt;
	[299]=true,[300]=true,[301]=true,[302]=true,[303]=true,[305]=true,[306]=true,[307]=true,[308]=true,[309]=true,[310]=true,&lt;br /&gt;
	[311]=true,[312]=true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local femaleSkins = {&lt;br /&gt;
	[9]=true,[10]=true,[11]=true,[12]=true,[13]=true,[31]=true,[38]=true,[39]=true,[40]=true,[41]=true,[53]=true,[54]=true,&lt;br /&gt;
	[55]=true,[56]=true,[63]=true,[64]=true,[69]=true,[75]=true,[76]=true,[77]=true,[85]=true,[87]=true,[88]=true,[89]=true,&lt;br /&gt;
	[90]=true,[91]=true,[92]=true,[93]=true,[129]=true,[130]=true,[131]=true,[138]=true,[139]=true,[140]=true,[141]=true,&lt;br /&gt;
	[145]=true,[148]=true,[150]=true,[151]=true,[152]=true,[157]=true,[169]=true,[172]=true,[178]=true,[190]=true,[191]=true,&lt;br /&gt;
	[192]=true,[193]=true,[194]=true,[195]=true,[196]=true,[197]=true,[198]=true,[199]=true,[201]=true,[205]=true,[207]=true,&lt;br /&gt;
	[211]=true,[214]=true,[215]=true,[216]=true,[218]=true,[219]=true,[224]=true,[225]=true,[226]=true,[231]=true,[232]=true,&lt;br /&gt;
	[233]=true,[237]=true,[238]=true,[243]=true,[244]=true,[245]=true,[246]=true,[251]=true,[256]=true,[257]=true,[263]=true,&lt;br /&gt;
	[298]=true,[304]=true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local pedElementTypes = {&lt;br /&gt;
	ped = true,&lt;br /&gt;
	player = true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function getPedGender(ped)&lt;br /&gt;
	if not (isElement(ped) and pedElementTypes[getElementType(ped)]) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	local model = getElementModel(ped)&lt;br /&gt;
	return getSkinGender(model)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getSkinGender(model)&lt;br /&gt;
	return maleSkins[model] and &amp;quot;male&amp;quot; or femaleSkins[model] and &amp;quot;female&amp;quot; or &amp;quot;unknown&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Client&amp;quot; class=&amp;quot;client&amp;quot; show=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
--[[&lt;br /&gt;
&lt;br /&gt;
The command /gender will display the gender of your player element.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
addCommandHandler(&amp;quot;gender&amp;quot;, &lt;br /&gt;
function () &lt;br /&gt;
	outputChatBox(&amp;quot;My gender: &amp;quot; .. tostring(getPedGender(localPlayer)))&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=69529</id>
		<title>GetScreenStartPositionFromBox</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=69529"/>
		<updated>2021-02-28T22:13:24Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: /* Required Arguments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function can be used to position dx-effects on your screen. The function requires you to create a box. This box exist out of the dimensions width/height and a X/Y position. The box is used to help with positioning dx-effects that do have an width/height. The box can have 0 width and 0 height, but it is recommended to fill those in with the dimensions of the dx-effect you want to draw.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
float startX, float startY = getScreenStartPositionFromBox(float width, float height, float offsetX, float offsetY, [string startIndicationX = &amp;quot;left&amp;quot;, string startIndicationY = &amp;quot;top&amp;quot;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''width:''' The width of the box.&lt;br /&gt;
* '''height:''' The height of the box.&lt;br /&gt;
* '''offsetX:'''The offset from it's current position. (&amp;quot;left&amp;quot;/&amp;quot;center&amp;quot; startIndicationX = offset added.) (&amp;quot;right&amp;quot; startIndicationX = offset subtracted.)&lt;br /&gt;
* '''offsetY:''' The offset from it's current position. (&amp;quot;top&amp;quot;/&amp;quot;center&amp;quot; startIndicationY = offset added.) (&amp;quot;bottom&amp;quot; startIndicationY = offset subtracted.)&lt;br /&gt;
* '''startIndicationX:''' The X position of the box: &amp;quot;left&amp;quot;, &amp;quot;right&amp;quot;, &amp;quot;center&amp;quot;&lt;br /&gt;
* '''startIndicationY:''' The Y position of the box: &amp;quot;top&amp;quot;, &amp;quot;bottom&amp;quot;, &amp;quot;center&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns 2 values:&lt;br /&gt;
* '''startX:''' Start X position&lt;br /&gt;
* '''startY:''' Start Y position&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Clientside Script&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;
do&lt;br /&gt;
	local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
	function getScreenStartPositionFromBox (width, height, offsetX, offsetY, startIndicationX, startIndicationY)&lt;br /&gt;
	&lt;br /&gt;
		if type(width) ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			width = 0&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if type(height) ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			height = 0&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if type(offsetX) ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			offsetX = 0&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if type(offsetY) ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			offsetY = 0&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local startX = offsetX &lt;br /&gt;
		local startY = offsetY&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationX == &amp;quot;right&amp;quot; then&lt;br /&gt;
			startX = screenX - (width + offsetX)&lt;br /&gt;
		elseif startIndicationX == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startX = screenX / 2 - width / 2 + offsetX&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationY == &amp;quot;bottom&amp;quot; then&lt;br /&gt;
			startY = screenY - (height + offsetY)&lt;br /&gt;
		elseif startIndicationY == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startY = screenY / 2 - height / 2 + offsetY&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return startX, startY&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
--[[&lt;br /&gt;
	Draw a rectangle on the left-bottom of the screen.&lt;br /&gt;
	The offset from the bottom and left is 100 pixels.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	-- Note: The following values are not scaled. See second example for how to scale it for all screen resolutions.&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400, 200&lt;br /&gt;
	&lt;br /&gt;
	local startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 100, 100, &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
--[[&lt;br /&gt;
	- Scaled version for all screen resolutions&lt;br /&gt;
	- Multiple rectangles&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Prepare the scale multiplier:&lt;br /&gt;
]]&lt;br /&gt;
-- Your resolution as developer.&lt;br /&gt;
local devScreenX = 1920&lt;br /&gt;
local devScreenY = 1080&lt;br /&gt;
&lt;br /&gt;
-- The current resolution of the client&lt;br /&gt;
local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
-- Get the scale value&lt;br /&gt;
local scaleValue = screenY / devScreenY&lt;br /&gt;
&lt;br /&gt;
-- Set an upper limit, so that it isn't scaled too small.&lt;br /&gt;
scaleValue = math.max(scaleValue, 0.65)&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Start drawing:&lt;br /&gt;
]]&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	-- Scale the dimensions:&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400 * scaleValue, 200 * scaleValue &lt;br /&gt;
	local offSetX, offsetY = 50 * scaleValue, 50 * scaleValue&lt;br /&gt;
	&lt;br /&gt;
	-- Start drawing at the correct position:&lt;br /&gt;
	local startX, startY &lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; top&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;left&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; top&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;right&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; bottom&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; bottom&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;left&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; center&lt;br /&gt;
		Note: offsetY is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, 0, &amp;quot;left&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; center&lt;br /&gt;
		Note: offsetY is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, 0, &amp;quot;right&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; top&lt;br /&gt;
		Note: offsetX is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, offsetY, &amp;quot;center&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; bottom&lt;br /&gt;
		Note: offsetX is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, offsetY, &amp;quot;center&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; center&lt;br /&gt;
		Note: offsetX and offsetY are 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, 0, &amp;quot;center&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), 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;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=Template:Useful_Functions&amp;diff=69528</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=69528"/>
		<updated>2021-02-28T18:36:03Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: /* Drawing functions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
=== Table functions ===&lt;br /&gt;
*[[isValueInTable]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[setTableToSql]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[getTableFromSql]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[rangeToTable]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[Sort_Functions]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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.empty]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function checks whether a table is empty.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[table.map]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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.getRandomRows]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function returns random rows from table.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[table.element]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[pairsByKeys]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function sort pairs table.&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-family:'Georgia',sans-serif; 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;
*[[getPlayersInACLGroup]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function returns all players in an ACL group.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getPlayerAcls]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[isPlayerInACL]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[getAccountsRanks]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
&lt;br /&gt;
=== Account functions ===&lt;br /&gt;
*[[getPlayerFromAccountName]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function allows you to create a cinematic camera flight.&lt;br /&gt;
&lt;br /&gt;
=== Cursor functions ===&lt;br /&gt;
*[[getCursorMovedOn]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
&lt;br /&gt;
=== Drawing functions ===&lt;br /&gt;
*[[dxDrawAnimWindow]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function draws a line with dashes.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawRing]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function draws a ring with dx lines.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawTextOnRectangle]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» Esta funcion crea un rectangle con un texto dentro.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawGifImage]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function draws a 3D image in GTA world.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawSprite]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function draw a sprite in the 3D world.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawImageOnElement]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function draws a custom polygon on the screen.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawRectangle3D]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function draws a 3D rectangle in GTA world.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawProgressBar]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function simulates a progress bar drawed using DirectDraw.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawTextOnElement]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function draws a text on any element.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawTriangle]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function calculates the height of a font.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[wordWrap]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[dxDrawRombo]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function creates a Rhombus.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getScreenStartPositionFromBox]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
&lt;br /&gt;
=== Effects functions ===&lt;br /&gt;
*[[attachEffect]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
&lt;br /&gt;
=== Element functions === &lt;br /&gt;
*[[getElementSpeed]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[getElementsInDimension]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[getElementsWithinMarker]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[getNearestElement]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[multi_check]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[attachElementToBone]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
&lt;br /&gt;
=== Events ===&lt;br /&gt;
*[[onVehicleWeaponFire]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[getClipboard]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This event returns the contents of the clipboard by pressing ctrl + v / ctrl + V. Event triggered ONLY if cursor is showing.&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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function capitalizes a given string.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[convertServerTickToTimeStamp]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[findRotation]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[findRotation3D]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[formatDate]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function formats large numbers by adding commas.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[generateString]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function generates a random string with any characters.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[generateRandomASCIIString]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[getDistance]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» Returns the distance between two elements.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getAge]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function calculates the age of a given birthday.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getDistanceBetweenPointAndSegment2D]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[getKeyFromValueInTable]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[getRealMonthH]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function convert english months to arabic months&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getRealMonthM]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function gives you the real months 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[isLeapYear]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[secondsToTimeDesc]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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.insert]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[string.explode]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[switch]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[toHex]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[getDistanceBetweenElements]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» Esta funcion sirve para obtener la distancia entre dos elementos.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getFreeDimension]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function get free dimension.&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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function moves guiElement by/like using moveObject.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isMouseOnGUICloseButton]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[guiSetStaticImageMovable]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
=====Comboboxes=====&lt;br /&gt;
*[[guiComboBoxAdjustHeight]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[guiGridListAddPlayers]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[guiGridListSetColumnNonSortable]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function makes a gridlist column become non-sortable.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[guiGridListSetColumnsFixedWidth]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function makes a gridlist have all its columns fixed width.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[guiGridListGetSelectedText]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[getGridListRowIndexFromText]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[isTextInGridList]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[convertGridListToText]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function converts grid list contents to text.&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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[mathNumber]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[math.hypot]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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.percent]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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.round]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[reMap]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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.isPointInPolygon]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» Check if point is inside polygon or not.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[math.polygonArea]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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.lerp]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» Get val between two integer.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[math.getBezierPoint]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» Get N-th order bezier point.&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-family:'Georgia',sans-serif; 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;
&lt;br /&gt;
=== Ped functions ===&lt;br /&gt;
*[[getAlivePlayers (Client)|getAlivePlayers]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[getPlayersInVehicles]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[getGuestPlayers]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function allows you to get peds eyes position.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getPedMaxHealth]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[getPlayerFromNamePart]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[isPedAiming]]&amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[isPedDrivingVehicle]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
&lt;br /&gt;
=== Player functions ===&lt;br /&gt;
*[[countPlayersInRange]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[isPlayerHitByVehicle]]&amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[warpToPlayer]]&amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function make player warp to another player.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getPlayersInRange]]&amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
&lt;br /&gt;
=== Resource functions ===&lt;br /&gt;
*[[getResourceScripts]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function returns a table of the resource scripts.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getResourceSize]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[getResourceSettings]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function returns a table of the resource settings.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[refreshResource]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function set resource download priority group.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getFilesInResourceFolder]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
&lt;br /&gt;
=== Sound functions ===&lt;br /&gt;
*[[isSoundFinished]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[isVehicleEmpty]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function checks whether vehicle is on roof.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isVehicleReversing]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[getVehicleTurnVelocityCenterOfMass]]&amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[setVehicleTurnVelocityCenterOfMass]]&amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
&lt;br /&gt;
=== Weapon functions === &lt;br /&gt;
*[[getJetpackWeaponsEnabled]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[getPreviousAndNextWeapon]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function returns the next weapon and previous.&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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[getBanFromName]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[IfElse]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[isMouseInCircle]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[isCharInString]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[iterElements]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[vector3:compare]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[preprocessor]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function allow you to use gcc macros.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[PlotTrajectoryAtTime]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» Calculate projectile/water trajectory.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getSkinNameFromID]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Useful Functions]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=Template:Useful_Functions&amp;diff=69527</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=69527"/>
		<updated>2021-02-28T18:35:47Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: /* Drawing functions */ add getScreenStartPositionFromBox&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
=== Table functions ===&lt;br /&gt;
*[[isValueInTable]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[setTableToSql]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[getTableFromSql]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[rangeToTable]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[Sort_Functions]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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.empty]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function checks whether a table is empty.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[table.map]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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.getRandomRows]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function returns random rows from table.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[table.element]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[pairsByKeys]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function sort pairs table.&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-family:'Georgia',sans-serif; 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;
*[[getPlayersInACLGroup]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function returns all players in an ACL group.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getPlayerAcls]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[isPlayerInACL]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[getAccountsRanks]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
&lt;br /&gt;
=== Account functions ===&lt;br /&gt;
*[[getPlayerFromAccountName]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function allows you to create a cinematic camera flight.&lt;br /&gt;
&lt;br /&gt;
=== Cursor functions ===&lt;br /&gt;
*[[getCursorMovedOn]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
&lt;br /&gt;
=== Drawing functions ===&lt;br /&gt;
*[[dxDrawAnimWindow]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function draws a line with dashes.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawRing]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function draws a ring with dx lines.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawTextOnRectangle]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» Esta funcion crea un rectangle con un texto dentro.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawGifImage]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function draws a 3D image in GTA world.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawSprite]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function draw a sprite in the 3D world.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawImageOnElement]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function draws a custom polygon on the screen.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawRectangle3D]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function draws a 3D rectangle in GTA world.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawProgressBar]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function simulates a progress bar drawed using DirectDraw.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawTextOnElement]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function draws a text on any element.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[dxDrawTriangle]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function calculates the height of a font.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[wordWrap]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[dxDrawRombo]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function creates a Rhombus.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getScreenStartPositionFromBox]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This helps with getting the correct position for your dx-effects.&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-family:'Georgia',sans-serif; 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;
&lt;br /&gt;
=== Element functions === &lt;br /&gt;
*[[getElementSpeed]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[getElementsInDimension]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[getElementsWithinMarker]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[getNearestElement]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[multi_check]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[attachElementToBone]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
&lt;br /&gt;
=== Events ===&lt;br /&gt;
*[[onVehicleWeaponFire]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[getClipboard]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This event returns the contents of the clipboard by pressing ctrl + v / ctrl + V. Event triggered ONLY if cursor is showing.&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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function capitalizes a given string.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[convertServerTickToTimeStamp]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[findRotation]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[findRotation3D]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[formatDate]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function formats large numbers by adding commas.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[generateString]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function generates a random string with any characters.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[generateRandomASCIIString]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[getDistance]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» Returns the distance between two elements.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getAge]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function calculates the age of a given birthday.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getDistanceBetweenPointAndSegment2D]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[getKeyFromValueInTable]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[getRealMonthH]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function convert english months to arabic months&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getRealMonthM]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function gives you the real months 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[isLeapYear]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[secondsToTimeDesc]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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.insert]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[string.explode]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[switch]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[toHex]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[getDistanceBetweenElements]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» Esta funcion sirve para obtener la distancia entre dos elementos.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getFreeDimension]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function get free dimension.&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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function moves guiElement by/like using moveObject.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isMouseOnGUICloseButton]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[guiSetStaticImageMovable]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
=====Comboboxes=====&lt;br /&gt;
*[[guiComboBoxAdjustHeight]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[guiGridListAddPlayers]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[guiGridListSetColumnNonSortable]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function makes a gridlist column become non-sortable.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[guiGridListSetColumnsFixedWidth]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function makes a gridlist have all its columns fixed width.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[guiGridListGetSelectedText]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[getGridListRowIndexFromText]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[isTextInGridList]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[convertGridListToText]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function converts grid list contents to text.&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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[mathNumber]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[math.hypot]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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.percent]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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.round]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[reMap]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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.isPointInPolygon]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» Check if point is inside polygon or not.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[math.polygonArea]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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.lerp]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» Get val between two integer.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[math.getBezierPoint]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» Get N-th order bezier point.&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-family:'Georgia',sans-serif; 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;
&lt;br /&gt;
=== Ped functions ===&lt;br /&gt;
*[[getAlivePlayers (Client)|getAlivePlayers]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[getPlayersInVehicles]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[getGuestPlayers]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function allows you to get peds eyes position.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getPedMaxHealth]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[getPlayerFromNamePart]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[isPedAiming]]&amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[isPedDrivingVehicle]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
&lt;br /&gt;
=== Player functions ===&lt;br /&gt;
*[[countPlayersInRange]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[isPlayerHitByVehicle]]&amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[warpToPlayer]]&amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function make player warp to another player.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getPlayersInRange]]&amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
&lt;br /&gt;
=== Resource functions ===&lt;br /&gt;
*[[getResourceScripts]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function returns a table of the resource scripts.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getResourceSize]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[getResourceSettings]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function returns a table of the resource settings.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[refreshResource]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function set resource download priority group.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getFilesInResourceFolder]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
&lt;br /&gt;
=== Sound functions ===&lt;br /&gt;
*[[isSoundFinished]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[isVehicleEmpty]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function checks whether vehicle is on roof.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[isVehicleReversing]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[getVehicleTurnVelocityCenterOfMass]]&amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[setVehicleTurnVelocityCenterOfMass]]&amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
&lt;br /&gt;
=== Weapon functions === &lt;br /&gt;
*[[getJetpackWeaponsEnabled]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[getPreviousAndNextWeapon]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function returns the next weapon and previous.&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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[getBanFromName]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[IfElse]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[isMouseInCircle]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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-family:'Georgia',sans-serif; 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;
*[[isCharInString]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[iterElements]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[vector3:compare]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
*[[preprocessor]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» This function allow you to use gcc macros.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[PlotTrajectoryAtTime]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; font-size:smaller;&amp;quot;&amp;gt;» Calculate projectile/water trajectory.&amp;lt;/span&amp;gt;&lt;br /&gt;
*[[getSkinNameFromID]] &amp;lt;span style=&amp;quot;color:gray; font-family:'Georgia',sans-serif; 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;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;[[Category:Useful Functions]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=69526</id>
		<title>GetScreenStartPositionFromBox</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=69526"/>
		<updated>2021-02-28T18:26:11Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: Updated required arguments. Improving the readability.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function can be used to position dx-effects on your screen. The function requires you to create a box. This box exist out of the dimensions width/height and a X/Y position. The box is used to help with positioning dx-effects that do have an width/height. The box can have 0 width and 0 height, but it is recommended to fill those in with the dimensions of the dx-effect you want to draw.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
float startX, float startY = getScreenStartPositionFromBox(float width, float height, float offsetX, float offsetY, [string startIndicationX = &amp;quot;left&amp;quot;, string startIndicationY = &amp;quot;top&amp;quot;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''width:''' The width of the box.&lt;br /&gt;
* '''height:''' The height of the box.&lt;br /&gt;
* '''offsetX:'''The offset from it's current position. (&amp;quot;left&amp;quot;/&amp;quot;center&amp;quot; startIndicationX = offset added.) (&amp;quot;right&amp;quot; startIndicationX = offset subtracted.)&lt;br /&gt;
* '''offsetY:''' The offset from it's current position. (&amp;quot;top&amp;quot;/&amp;quot;center&amp;quot; startIndicationY = offset added.) (&amp;quot;bottom&amp;quot; startIndicationY = offset subtracted.)&lt;br /&gt;
* '''startIndicationX:''' The X position of the box.&lt;br /&gt;
* '''startIndicationY:''' The Y position of the box.&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns 2 values:&lt;br /&gt;
* '''startX:''' Start X position&lt;br /&gt;
* '''startY:''' Start Y position&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Clientside Script&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;
do&lt;br /&gt;
	local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
	function getScreenStartPositionFromBox (width, height, offsetX, offsetY, startIndicationX, startIndicationY)&lt;br /&gt;
	&lt;br /&gt;
		if type(width) ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			width = 0&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if type(height) ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			height = 0&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if type(offsetX) ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			offsetX = 0&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if type(offsetY) ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			offsetY = 0&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local startX = offsetX &lt;br /&gt;
		local startY = offsetY&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationX == &amp;quot;right&amp;quot; then&lt;br /&gt;
			startX = screenX - (width + offsetX)&lt;br /&gt;
		elseif startIndicationX == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startX = screenX / 2 - width / 2 + offsetX&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationY == &amp;quot;bottom&amp;quot; then&lt;br /&gt;
			startY = screenY - (height + offsetY)&lt;br /&gt;
		elseif startIndicationY == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startY = screenY / 2 - height / 2 + offsetY&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return startX, startY&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
--[[&lt;br /&gt;
	Draw a rectangle on the left-bottom of the screen.&lt;br /&gt;
	The offset from the bottom and left is 100 pixels.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	-- Note: The following values are not scaled. See second example for how to scale it for all screen resolutions.&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400, 200&lt;br /&gt;
	&lt;br /&gt;
	local startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 100, 100, &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
--[[&lt;br /&gt;
	- Scaled version for all screen resolutions&lt;br /&gt;
	- Multiple rectangles&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Prepare the scale multiplier:&lt;br /&gt;
]]&lt;br /&gt;
-- Your resolution as developer.&lt;br /&gt;
local devScreenX = 1920&lt;br /&gt;
local devScreenY = 1080&lt;br /&gt;
&lt;br /&gt;
-- The current resolution of the client&lt;br /&gt;
local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
-- Get the scale value&lt;br /&gt;
local scaleValue = screenY / devScreenY&lt;br /&gt;
&lt;br /&gt;
-- Set an upper limit, so that it isn't scaled too small.&lt;br /&gt;
scaleValue = math.max(scaleValue, 0.65)&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Start drawing:&lt;br /&gt;
]]&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	-- Scale the dimensions:&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400 * scaleValue, 200 * scaleValue &lt;br /&gt;
	local offSetX, offsetY = 50 * scaleValue, 50 * scaleValue&lt;br /&gt;
	&lt;br /&gt;
	-- Start drawing at the correct position:&lt;br /&gt;
	local startX, startY &lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; top&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;left&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; top&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;right&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; bottom&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; bottom&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;left&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; center&lt;br /&gt;
		Note: offsetY is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, 0, &amp;quot;left&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; center&lt;br /&gt;
		Note: offsetY is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, 0, &amp;quot;right&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; top&lt;br /&gt;
		Note: offsetX is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, offsetY, &amp;quot;center&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; bottom&lt;br /&gt;
		Note: offsetX is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, offsetY, &amp;quot;center&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; center&lt;br /&gt;
		Note: offsetX and offsetY are 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, 0, &amp;quot;center&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), 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;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=69525</id>
		<title>GetScreenStartPositionFromBox</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=69525"/>
		<updated>2021-02-28T18:17:28Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: last notes... :(&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function can be used to position dx-effects on your screen. The function requires you to create a box. This box exist out of the dimensions width/height and a X/Y position. The box is used to help with positioning dx-effects that do have an width/height. The box can have 0 width and 0 height, but it is recommended to fill those in with the dimensions of the dx-effect you want to draw.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
float startX, float startY = getScreenStartPositionFromBox(float width, float height, float offsetX, float offsetY, [string startIndicationX = &amp;quot;left&amp;quot;, string startIndicationY = &amp;quot;top&amp;quot;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''width:''' The width of the box.&lt;br /&gt;
* '''height:''' The height of the box.&lt;br /&gt;
* '''offsetX:''' The offset from it's current position. Left startIndicationX = offset added. Right startIndicationX = offset subtracted. (If center is used, the offset is applied from the left.)&lt;br /&gt;
* '''offsetY:''' The offset from it's current position. Top startIndicationY = offset added. Bottom startIndicationY = offset subtracted. (If center is used, the offset is applied from the top.)&lt;br /&gt;
* '''startIndicationX:''' The X position of the box.&lt;br /&gt;
* '''startIndicationY:''' The Y position of the box.&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns 2 values:&lt;br /&gt;
* '''startX:''' Start X position&lt;br /&gt;
* '''startY:''' Start Y position&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Clientside Script&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;
do&lt;br /&gt;
	local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
	function getScreenStartPositionFromBox (width, height, offsetX, offsetY, startIndicationX, startIndicationY)&lt;br /&gt;
	&lt;br /&gt;
		if type(width) ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			width = 0&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if type(height) ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			height = 0&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if type(offsetX) ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			offsetX = 0&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if type(offsetY) ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			offsetY = 0&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local startX = offsetX &lt;br /&gt;
		local startY = offsetY&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationX == &amp;quot;right&amp;quot; then&lt;br /&gt;
			startX = screenX - (width + offsetX)&lt;br /&gt;
		elseif startIndicationX == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startX = screenX / 2 - width / 2 + offsetX&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationY == &amp;quot;bottom&amp;quot; then&lt;br /&gt;
			startY = screenY - (height + offsetY)&lt;br /&gt;
		elseif startIndicationY == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startY = screenY / 2 - height / 2 + offsetY&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return startX, startY&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
--[[&lt;br /&gt;
	Draw a rectangle on the left-bottom of the screen.&lt;br /&gt;
	The offset from the bottom and left is 100 pixels.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	-- Note: The following values are not scaled. See second example for how to scale it for all screen resolutions.&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400, 200&lt;br /&gt;
	&lt;br /&gt;
	local startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 100, 100, &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
--[[&lt;br /&gt;
	- Scaled version for all screen resolutions&lt;br /&gt;
	- Multiple rectangles&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Prepare the scale multiplier:&lt;br /&gt;
]]&lt;br /&gt;
-- Your resolution as developer.&lt;br /&gt;
local devScreenX = 1920&lt;br /&gt;
local devScreenY = 1080&lt;br /&gt;
&lt;br /&gt;
-- The current resolution of the client&lt;br /&gt;
local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
-- Get the scale value&lt;br /&gt;
local scaleValue = screenY / devScreenY&lt;br /&gt;
&lt;br /&gt;
-- Set an upper limit, so that it isn't scaled too small.&lt;br /&gt;
scaleValue = math.max(scaleValue, 0.65)&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Start drawing:&lt;br /&gt;
]]&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	-- Scale the dimensions:&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400 * scaleValue, 200 * scaleValue &lt;br /&gt;
	local offSetX, offsetY = 50 * scaleValue, 50 * scaleValue&lt;br /&gt;
	&lt;br /&gt;
	-- Start drawing at the correct position:&lt;br /&gt;
	local startX, startY &lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; top&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;left&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; top&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;right&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; bottom&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; bottom&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY, &amp;quot;left&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; center&lt;br /&gt;
		Note: offsetY is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, 0, &amp;quot;left&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; center&lt;br /&gt;
		Note: offsetY is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, 0, &amp;quot;right&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; top&lt;br /&gt;
		Note: offsetX is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, offsetY, &amp;quot;center&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; bottom&lt;br /&gt;
		Note: offsetX is 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, offsetY, &amp;quot;center&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; center&lt;br /&gt;
		Note: offsetX and offsetY are 0.&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, 0, &amp;quot;center&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), 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;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=69524</id>
		<title>GetScreenStartPositionFromBox</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=69524"/>
		<updated>2021-02-28T18:14:20Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: Add more comments.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function can be used to position dx-effects on your screen. The function requires you to create a box. This box exist out of the dimensions width/height and a X/Y position. The box is used to help with positioning dx-effects that do have an width/height. The box can have 0 width and 0 height, but it is recommended to fill those in with the dimensions of the dx-effect you want to draw.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
float startX, float startY = getScreenStartPositionFromBox(float width, float height, float offsetX, float offsetY, [string startIndicationX = &amp;quot;left&amp;quot;, string startIndicationY = &amp;quot;top&amp;quot;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''width:''' The width of the box.&lt;br /&gt;
* '''height:''' The height of the box.&lt;br /&gt;
* '''offsetX:''' The offset from it's current position. Left startIndicationX = offset added. Right startIndicationX = offset subtracted. (If center is used, the offset is applied from the left.)&lt;br /&gt;
* '''offsetY:''' The offset from it's current position. Top startIndicationY = offset added. Bottom startIndicationY = offset subtracted. (If center is used, the offset is applied from the top.)&lt;br /&gt;
* '''startIndicationX:''' The X position of the box.&lt;br /&gt;
* '''startIndicationY:''' The Y position of the box.&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns 2 values:&lt;br /&gt;
* '''startX:''' Start X position&lt;br /&gt;
* '''startY:''' Start Y position&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Clientside Script&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;
do&lt;br /&gt;
	local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
	function getScreenStartPositionFromBox (width, height, offsetX, offsetY, startIndicationX, startIndicationY)&lt;br /&gt;
	&lt;br /&gt;
		if type(width) ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			width = 0&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if type(height) ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			height = 0&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if type(offsetX) ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			offsetX = 0&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if type(offsetY) ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			offsetY = 0&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local startX = offsetX &lt;br /&gt;
		local startY = offsetY&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationX == &amp;quot;right&amp;quot; then&lt;br /&gt;
			startX = screenX - (width + offsetX)&lt;br /&gt;
		elseif startIndicationX == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startX = screenX / 2 - width / 2 + offsetX&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationY == &amp;quot;bottom&amp;quot; then&lt;br /&gt;
			startY = screenY - (height + offsetY)&lt;br /&gt;
		elseif startIndicationY == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startY = screenY / 2 - height / 2 + offsetY&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return startX, startY&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
--[[&lt;br /&gt;
	Draw a rectangle on the left-bottom of the screen.&lt;br /&gt;
	The offset from the bottom and left is 100 pixels.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	-- Note: The following values are not scaled. See second example for how to scale it for all screen resolutions.&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400, 200&lt;br /&gt;
	&lt;br /&gt;
	local startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 100, 100, &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
&lt;br /&gt;
--[[&lt;br /&gt;
	- Scaled version for all screen resolutions&lt;br /&gt;
	- Multiple rectangles&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Prepare the scale multiplier:&lt;br /&gt;
]]&lt;br /&gt;
-- Your resolution as developer.&lt;br /&gt;
local devScreenX = 1920&lt;br /&gt;
local devScreenY = 1080&lt;br /&gt;
&lt;br /&gt;
-- The current resolution of the client&lt;br /&gt;
local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
-- Get the scale value&lt;br /&gt;
local scaleValue = screenY / devScreenY&lt;br /&gt;
&lt;br /&gt;
-- Set an upper limit, so that it isn't scaled too small.&lt;br /&gt;
scaleValue = math.max(scaleValue, 0.65)&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Start drawing:&lt;br /&gt;
]]&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	-- Scale the dimensions:&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400 * scaleValue, 200 * scaleValue &lt;br /&gt;
	local offSetX, offsetY = 50 * scaleValue, 50 * scaleValue&lt;br /&gt;
	&lt;br /&gt;
	-- Start drawing at the correct position:&lt;br /&gt;
&lt;br /&gt;
	local startX, startY &lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; top&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY  , &amp;quot;left&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; top&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY  , &amp;quot;right&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; bottom&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY  , &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; bottom&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY  , &amp;quot;left&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; center&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, 0  , &amp;quot;left&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; center&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, 0  , &amp;quot;right&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; top&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, offsetY, &amp;quot;center&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; bottom&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, offsetY, &amp;quot;center&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; center&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, 0, &amp;quot;center&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), 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;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=69523</id>
		<title>GetScreenStartPositionFromBox</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=69523"/>
		<updated>2021-02-28T18:11:12Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: Add value validation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function can be used to position dx-effects on your screen. The function requires you to create a box. This box exist out of the dimensions width/height and a X/Y position. The box is used to help with positioning dx-effects that do have an width/height. The box can have 0 width and 0 height, but it is recommended to fill those in with the dimensions of the dx-effect you want to draw.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
float startX, float startY = getScreenStartPositionFromBox(float width, float height, float offsetX, float offsetY, [string startIndicationX = &amp;quot;left&amp;quot;, string startIndicationY = &amp;quot;top&amp;quot;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''width:''' The width of the box.&lt;br /&gt;
* '''height:''' The height of the box.&lt;br /&gt;
* '''offsetX:''' The offset from it's current position. Left startIndicationX = offset added. Right startIndicationX = offset subtracted. (If center is used, the offset is applied from the left.)&lt;br /&gt;
* '''offsetY:''' The offset from it's current position. Top startIndicationY = offset added. Bottom startIndicationY = offset subtracted. (If center is used, the offset is applied from the top.)&lt;br /&gt;
* '''startIndicationX:''' The X position of the box.&lt;br /&gt;
* '''startIndicationY:''' The Y position of the box.&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns 2 values:&lt;br /&gt;
* '''startX:''' Start X position&lt;br /&gt;
* '''startY:''' Start Y position&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Clientside Script&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;
do&lt;br /&gt;
	local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
	function getScreenStartPositionFromBox (width, height, offsetX, offsetY, startIndicationX, startIndicationY)&lt;br /&gt;
	&lt;br /&gt;
		if type(width) ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			width = 0&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if type(height) ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			height = 0&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if type(offsetX) ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			offsetX = 0&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if type(offsetY) ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			offsetY = 0&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local startX = offsetX &lt;br /&gt;
		local startY = offsetY&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationX == &amp;quot;right&amp;quot; then&lt;br /&gt;
			startX = screenX - (width + offsetX)&lt;br /&gt;
		elseif startIndicationX == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startX = screenX / 2 - width / 2 + offsetX&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationY == &amp;quot;bottom&amp;quot; then&lt;br /&gt;
			startY = screenY - (height + offsetY)&lt;br /&gt;
		elseif startIndicationY == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startY = screenY / 2 - height / 2 + offsetY&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return startX, startY&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
--[[&lt;br /&gt;
	Draw a rectangle on the left-bottom of the screen.&lt;br /&gt;
	The offset from the bottom and left is 100 pixels.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	-- Note: The following values are not scaled. See second example for how to scale it for all screen resolutions.&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400, 200&lt;br /&gt;
	&lt;br /&gt;
	local startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 100, 100, &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
&lt;br /&gt;
--[[&lt;br /&gt;
	- Scaled version for all screen resolutions&lt;br /&gt;
	- Multiple rectangles&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Prepare the scale multiplier:&lt;br /&gt;
]]&lt;br /&gt;
-- Your resolution as developer.&lt;br /&gt;
local devScreenX = 1920&lt;br /&gt;
local devScreenY = 1080&lt;br /&gt;
&lt;br /&gt;
-- The current resolution of the client&lt;br /&gt;
local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
-- Get the scale value&lt;br /&gt;
local scaleValue = screenY / devScreenY&lt;br /&gt;
&lt;br /&gt;
-- Set an upper limit, so that it isn't scaled too small.&lt;br /&gt;
scaleValue = math.max(scaleValue, 0.65)&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Start drawing:&lt;br /&gt;
]]&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400 * scaleValue, 200 * scaleValue &lt;br /&gt;
	local offSetX, offsetY = 50 * scaleValue, 50 * scaleValue&lt;br /&gt;
	&lt;br /&gt;
	local startX, startY &lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; top&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY  , &amp;quot;left&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; top&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY  , &amp;quot;right&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; bottom&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY  , &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; bottom&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY  , &amp;quot;left&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; center&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, 0  , &amp;quot;left&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; center&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, 0  , &amp;quot;right&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; top&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, offsetY, &amp;quot;center&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; bottom&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, offsetY, &amp;quot;center&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; center&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, 0, &amp;quot;center&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), 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;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=69522</id>
		<title>GetScreenStartPositionFromBox</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=69522"/>
		<updated>2021-02-28T18:07:51Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: Add big example&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function can be used to position dx-effects on your screen. The function requires you to create a box. This box exist out of the dimensions width/height and a X/Y position. The box is used to help with positioning dx-effects that do have an width/height. The box can have 0 width and 0 height, but it is recommended to fill those in with the dimensions of the dx-effect you want to draw.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
float startX, float startY = getScreenStartPositionFromBox(float width, float height, float offsetX, float offsetY, [string startIndicationX = &amp;quot;left&amp;quot;, string startIndicationY = &amp;quot;top&amp;quot;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''width:''' The width of the box.&lt;br /&gt;
* '''height:''' The height of the box.&lt;br /&gt;
* '''offsetX:''' The offset from it's current position. Left startIndicationX = offset added. Right startIndicationX = offset subtracted. (If center is used, the offset is applied from the left.)&lt;br /&gt;
* '''offsetY:''' The offset from it's current position. Top startIndicationY = offset added. Bottom startIndicationY = offset subtracted. (If center is used, the offset is applied from the top.)&lt;br /&gt;
* '''startIndicationX:''' The X position of the box.&lt;br /&gt;
* '''startIndicationY:''' The Y position of the box.&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns 2 values:&lt;br /&gt;
* '''startX:''' Start X position&lt;br /&gt;
* '''startY:''' Start Y position&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Clientside Script&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;
do&lt;br /&gt;
	local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
	function getScreenStartPositionFromBox (width, height, offsetX, offsetY, startIndicationX, startIndicationY)&lt;br /&gt;
		local startX = offsetX &lt;br /&gt;
		local startY = offsetY&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationX == &amp;quot;right&amp;quot; then&lt;br /&gt;
			startX = screenX - (width + offsetX)&lt;br /&gt;
		elseif startIndicationX == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startX = screenX / 2 - width / 2 + offsetX&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationY == &amp;quot;bottom&amp;quot; then&lt;br /&gt;
			startY = screenY - (height + offsetY)&lt;br /&gt;
		elseif startIndicationY == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startY = screenY / 2 - height / 2 + offsetY&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return startX, startY&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
--[[&lt;br /&gt;
	Draw a rectangle on the left-bottom of the screen.&lt;br /&gt;
	The offset from the bottom and left is 100 pixels.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	-- Note: The following values are not scaled. See second example for how to scale it for all screen resolutions.&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400, 200&lt;br /&gt;
	&lt;br /&gt;
	local startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 100, 100, &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
&lt;br /&gt;
--[[&lt;br /&gt;
	- Scaled version for all screen resolutions&lt;br /&gt;
	- Multiple rectangles&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Prepare the scale multiplier:&lt;br /&gt;
]]&lt;br /&gt;
-- Your resolution as developer.&lt;br /&gt;
local devScreenX = 1920&lt;br /&gt;
local devScreenY = 1080&lt;br /&gt;
&lt;br /&gt;
-- The current resolution of the client&lt;br /&gt;
local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
-- Get the scale value&lt;br /&gt;
local scaleValue = screenY / devScreenY&lt;br /&gt;
&lt;br /&gt;
-- Set an upper limit, so that it isn't scaled too small.&lt;br /&gt;
scaleValue = math.max(scaleValue, 0.65)&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Start drawing:&lt;br /&gt;
]]&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400 * scaleValue, 200 * scaleValue &lt;br /&gt;
	local offSetX, offsetY = 50 * scaleValue, 50 * scaleValue&lt;br /&gt;
	&lt;br /&gt;
	local startX, startY &lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; top&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY  , &amp;quot;left&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; top&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY  , &amp;quot;right&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; bottom&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY  , &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; bottom&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY  , &amp;quot;left&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; center&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, 0  , &amp;quot;left&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; center&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, 0  , &amp;quot;right&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; top&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, offsetY, &amp;quot;center&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; bottom&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, offsetY, &amp;quot;center&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; center&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, 0, &amp;quot;center&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), 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;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=69521</id>
		<title>GetScreenStartPositionFromBox</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=69521"/>
		<updated>2021-02-28T18:01:25Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: Add big example&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function can be used to position dx-effects on your screen. The function requires you to create a box. This box exist out of the dimensions width/height and a X/Y position. The box is used to help with positioning dx-effects that do have an width/height. The box can have 0 width and 0 height, but it is recommended to fill those in with the dimensions of the dx-effect you want to draw.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
float startX, float startY = getScreenStartPositionFromBox(float width, float height, float offsetX, float offsetY, [string startIndicationX = &amp;quot;left&amp;quot;, string startIndicationY = &amp;quot;top&amp;quot;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''width:''' The width of the box.&lt;br /&gt;
* '''height:''' The height of the box.&lt;br /&gt;
* '''offsetX:''' The offset from it's current position. Left startIndicationX = offset added. Right startIndicationX = offset subtracted. (If center is used, the offset is applied from the left.)&lt;br /&gt;
* '''offsetY:''' The offset from it's current position. Top startIndicationY = offset added. Bottom startIndicationY = offset subtracted. (If center is used, the offset is applied from the top.)&lt;br /&gt;
* '''startIndicationX:''' The X position of the box.&lt;br /&gt;
* '''startIndicationY:''' The Y position of the box.&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns 2 values:&lt;br /&gt;
* '''startX:''' Start X position&lt;br /&gt;
* '''startY:''' Start Y position&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Clientside Script&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;
do&lt;br /&gt;
	local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
	function getScreenStartPositionFromBox (width, height, offsetX, offsetY, startIndicationX, startIndicationY)&lt;br /&gt;
		local startX = offsetX &lt;br /&gt;
		local startY = offsetY&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationX == &amp;quot;right&amp;quot; then&lt;br /&gt;
			startX = screenX - (width + offsetX)&lt;br /&gt;
		elseif startIndicationX == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startX = screenX / 2 - width / 2 + offsetX&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationY == &amp;quot;bottom&amp;quot; then&lt;br /&gt;
			startY = screenY - (height + offsetY)&lt;br /&gt;
		elseif startIndicationY == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startY = screenY / 2 - height / 2 + offsetY&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return startX, startY&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
--[[&lt;br /&gt;
	Draw a rectangle on the left-bottom of the screen.&lt;br /&gt;
	The offset from the bottom and left is 100 pixels.&lt;br /&gt;
]]&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400, 200&lt;br /&gt;
	&lt;br /&gt;
	local startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 100, 100, &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;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;
--[[&lt;br /&gt;
	The same example, except it is now scaled correctly for all other screen resolutions.&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
-- Your resolution as developer.&lt;br /&gt;
local devScreenX = 1920&lt;br /&gt;
local devScreenY = 1080&lt;br /&gt;
&lt;br /&gt;
local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
local scaleValue = screenY / devScreenY&lt;br /&gt;
&lt;br /&gt;
scaleValue = math.max(scaleValue, 0.65)&lt;br /&gt;
&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400 * scaleValue, 200 * scaleValue &lt;br /&gt;
	&lt;br /&gt;
	local startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 100 * scaleValue, 100 * scaleValue , &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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;
-- Your resolution as developer.&lt;br /&gt;
local devScreenX = 1920&lt;br /&gt;
local devScreenY = 1080&lt;br /&gt;
&lt;br /&gt;
local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
local scaleValue = screenY / devScreenY&lt;br /&gt;
&lt;br /&gt;
scaleValue = math.max(scaleValue, 0.65)&lt;br /&gt;
&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400 * scaleValue, 200 * scaleValue &lt;br /&gt;
	local offSetX, offsetY = 50 * scaleValue, 50 * scaleValue&lt;br /&gt;
	&lt;br /&gt;
	local startX, startY &lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; top&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY  , &amp;quot;left&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; top&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY  , &amp;quot;right&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; bottom&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY  , &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; bottom&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, offsetY  , &amp;quot;left&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		left &amp;amp; center&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, 0  , &amp;quot;left&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		right &amp;amp; center&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, offSetX, 0  , &amp;quot;right&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; top&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, offsetY, &amp;quot;center&amp;quot;, &amp;quot;top&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; bottom&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, offsetY, &amp;quot;center&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		center &amp;amp; center&lt;br /&gt;
	]]&lt;br /&gt;
	startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 0, 0, &amp;quot;center&amp;quot;, &amp;quot;center&amp;quot;)&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), 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;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=69520</id>
		<title>GetScreenStartPositionFromBox</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=69520"/>
		<updated>2021-02-28T17:33:08Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: Add example description.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function can be used to position dx-effects on your screen. The function requires you to create a box. This box exist out of the dimensions width/height and a X/Y position. The box is used to help with positioning dx-effects that do have an width/height. The box can have 0 width and 0 height, but it is recommended to fill those in with the dimensions of the dx-effect you want to draw.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
float startX, float startY = getScreenStartPositionFromBox(float width, float height, float offsetX, float offsetY, [string startIndicationX = &amp;quot;left&amp;quot;, string startIndicationY = &amp;quot;top&amp;quot;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''width:''' The width of the box.&lt;br /&gt;
* '''height:''' The height of the box.&lt;br /&gt;
* '''offsetX:''' The offset from it's current position. Left startIndicationX = offset added. Right startIndicationX = offset subtracted. (If center is used, the offset is applied from the left.)&lt;br /&gt;
* '''offsetY:''' The offset from it's current position. Top startIndicationY = offset added. Bottom startIndicationY = offset subtracted. (If center is used, the offset is applied from the top.)&lt;br /&gt;
* '''startIndicationX:''' The X position of the box.&lt;br /&gt;
* '''startIndicationY:''' The Y position of the box.&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns 2 values:&lt;br /&gt;
* '''startX:''' Start X position&lt;br /&gt;
* '''startY:''' Start Y position&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Clientside Script&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;
do&lt;br /&gt;
	local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
	function getScreenStartPositionFromBox (width, height, offsetX, offsetY, startIndicationX, startIndicationY)&lt;br /&gt;
		local startX = offsetX &lt;br /&gt;
		local startY = offsetY&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationX == &amp;quot;right&amp;quot; then&lt;br /&gt;
			startX = screenX - (width + offsetX)&lt;br /&gt;
		elseif startIndicationX == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startX = screenX / 2 - width / 2 + offsetX&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationY == &amp;quot;bottom&amp;quot; then&lt;br /&gt;
			startY = screenY - (height + offsetY)&lt;br /&gt;
		elseif startIndicationY == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startY = screenY / 2 - height / 2 + offsetY&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return startX, startY&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
--[[&lt;br /&gt;
	Draw a rectangle on the left-bottom of the screen.&lt;br /&gt;
	The offset from the bottom and left is 100 pixels.&lt;br /&gt;
]]&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400, 200&lt;br /&gt;
	&lt;br /&gt;
	local startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 100, 100, &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=69519</id>
		<title>GetScreenStartPositionFromBox</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=69519"/>
		<updated>2021-02-28T17:31:31Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: Making the example square smaller&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function can be used to position dx-effects on your screen. The function requires you to create a box. This box exist out of the dimensions width/height and a X/Y position. The box is used to help with positioning dx-effects that do have an width/height. The box can have 0 width and 0 height, but it is recommended to fill those in with the dimensions of the dx-effect you want to draw.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
float startX, float startY = getScreenStartPositionFromBox(float width, float height, float offsetX, float offsetY, [string startIndicationX = &amp;quot;left&amp;quot;, string startIndicationY = &amp;quot;top&amp;quot;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''width:''' The width of the box.&lt;br /&gt;
* '''height:''' The height of the box.&lt;br /&gt;
* '''offsetX:''' The offset from it's current position. Left startIndicationX = offset added. Right startIndicationX = offset subtracted. (If center is used, the offset is applied from the left.)&lt;br /&gt;
* '''offsetY:''' The offset from it's current position. Top startIndicationY = offset added. Bottom startIndicationY = offset subtracted. (If center is used, the offset is applied from the top.)&lt;br /&gt;
* '''startIndicationX:''' The X position of the box.&lt;br /&gt;
* '''startIndicationY:''' The Y position of the box.&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns 2 values:&lt;br /&gt;
* '''startX:''' Start X position&lt;br /&gt;
* '''startY:''' Start Y position&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Clientside Script&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;
do&lt;br /&gt;
	local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
	function getScreenStartPositionFromBox (width, height, offsetX, offsetY, startIndicationX, startIndicationY)&lt;br /&gt;
		local startX = offsetX &lt;br /&gt;
		local startY = offsetY&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationX == &amp;quot;right&amp;quot; then&lt;br /&gt;
			startX = screenX - (width + offsetX)&lt;br /&gt;
		elseif startIndicationX == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startX = screenX / 2 - width / 2 + offsetX&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationY == &amp;quot;bottom&amp;quot; then&lt;br /&gt;
			startY = screenY - (height + offsetY)&lt;br /&gt;
		elseif startIndicationY == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startY = screenY / 2 - height / 2 + offsetY&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return startX, startY&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 400, 200&lt;br /&gt;
	&lt;br /&gt;
	local startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 100, 100, &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=69518</id>
		<title>GetScreenStartPositionFromBox</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=69518"/>
		<updated>2021-02-28T17:29:23Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: Fixed broken example&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function can be used to position dx-effects on your screen. The function requires you to create a box. This box exist out of the dimensions width/height and a X/Y position. The box is used to help with positioning dx-effects that do have an width/height. The box can have 0 width and 0 height, but it is recommended to fill those in with the dimensions of the dx-effect you want to draw.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
float startX, float startY = getScreenStartPositionFromBox(float width, float height, float offsetX, float offsetY, [string startIndicationX = &amp;quot;left&amp;quot;, string startIndicationY = &amp;quot;top&amp;quot;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''width:''' The width of the box.&lt;br /&gt;
* '''height:''' The height of the box.&lt;br /&gt;
* '''offsetX:''' The offset from it's current position. Left startIndicationX = offset added. Right startIndicationX = offset subtracted. (If center is used, the offset is applied from the left.)&lt;br /&gt;
* '''offsetY:''' The offset from it's current position. Top startIndicationY = offset added. Bottom startIndicationY = offset subtracted. (If center is used, the offset is applied from the top.)&lt;br /&gt;
* '''startIndicationX:''' The X position of the box.&lt;br /&gt;
* '''startIndicationY:''' The Y position of the box.&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns 2 values:&lt;br /&gt;
* '''startX:''' Start X position&lt;br /&gt;
* '''startY:''' Start Y position&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Clientside Script&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;
do&lt;br /&gt;
	local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
	function getScreenStartPositionFromBox (width, height, offsetX, offsetY, startIndicationX, startIndicationY)&lt;br /&gt;
		local startX = offsetX &lt;br /&gt;
		local startY = offsetY&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationX == &amp;quot;right&amp;quot; then&lt;br /&gt;
			startX = screenX - (width + offsetX)&lt;br /&gt;
		elseif startIndicationX == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startX = screenX / 2 - width / 2 + offsetX&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationY == &amp;quot;bottom&amp;quot; then&lt;br /&gt;
			startY = screenY - (height + offsetY)&lt;br /&gt;
		elseif startIndicationY == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startY = screenY / 2 - height / 2 + offsetY&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return startX, startY&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
-- to-do: test this code...&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;,root, &lt;br /&gt;
function ()&lt;br /&gt;
	&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 800, 400&lt;br /&gt;
	&lt;br /&gt;
	local startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 100, 100, &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=69517</id>
		<title>GetScreenStartPositionFromBox</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=69517"/>
		<updated>2021-02-28T17:23:15Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: Improving the summary of the function.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function can be used to position dx-effects on your screen. The function requires you to create a box. This box exist out of the dimensions width/height and a X/Y position. The box is used to help with positioning dx-effects that do have an width/height. The box can have 0 width and 0 height, but it is recommended to fill those in with the dimensions of the dx-effect you want to draw.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
float startX, float startY = getScreenStartPositionFromBox(float width, float height, float offsetX, float offsetY, [string startIndicationX = &amp;quot;left&amp;quot;, string startIndicationY = &amp;quot;top&amp;quot;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''width:''' The width of the box.&lt;br /&gt;
* '''height:''' The height of the box.&lt;br /&gt;
* '''offsetX:''' The offset from it's current position. Left startIndicationX = offset added. Right startIndicationX = offset subtracted. (If center is used, the offset is applied from the left.)&lt;br /&gt;
* '''offsetY:''' The offset from it's current position. Top startIndicationY = offset added. Bottom startIndicationY = offset subtracted. (If center is used, the offset is applied from the top.)&lt;br /&gt;
* '''startIndicationX:''' The X position of the box.&lt;br /&gt;
* '''startIndicationY:''' The Y position of the box.&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns 2 values:&lt;br /&gt;
* '''startX:''' Start X position&lt;br /&gt;
* '''startY:''' Start Y position&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Clientside Script&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;
do&lt;br /&gt;
	local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
	function getScreenStartPositionFromBox (width, height, offsetX, offsetY, startIndicationX, startIndicationY)&lt;br /&gt;
		local startX = offsetX &lt;br /&gt;
		local startY = offsetY&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationX == &amp;quot;right&amp;quot; then&lt;br /&gt;
			startX = screenX - (width + offsetX)&lt;br /&gt;
		elseif startIndicationX == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startX = screenX / 2 - width / 2 + offsetX&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationY == &amp;quot;bottom&amp;quot; then&lt;br /&gt;
			startY = screenY - (height + offsetY)&lt;br /&gt;
		elseif startIndicationY == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startY = screenY / 2 - height / 2 + offsetY&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return startX, startY&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
-- to-do: test this code...&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;, &lt;br /&gt;
function ()&lt;br /&gt;
	&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 800, 400&lt;br /&gt;
	&lt;br /&gt;
	local startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 100, 100, &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=69516</id>
		<title>GetScreenStartPositionFromBox</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=GetScreenStartPositionFromBox&amp;diff=69516"/>
		<updated>2021-02-28T16:05:34Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: First upload useful function&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function can be used to position dx-effects on your screen. The function requires you to create a box. This box exist out of the dimensions width/height and a X/Y position. The box is used to help with positioning dx-effects that do have an width/height. The box can have 0 width and 0 height, but it is recommended to fill those in.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
float startX, float startY = getScreenStartPositionFromBox(float width, float height, float offsetX, float offsetY, [string startIndicationX = &amp;quot;left&amp;quot;, string startIndicationY = &amp;quot;top&amp;quot;])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''width:''' The width of the box.&lt;br /&gt;
* '''height:''' The height of the box.&lt;br /&gt;
* '''offsetX:''' The offset from it's current position. Left startIndicationX = offset added. Right startIndicationX = offset subtracted. (If center is used, the offset is applied from the left.)&lt;br /&gt;
* '''offsetY:''' The offset from it's current position. Top startIndicationY = offset added. Bottom startIndicationY = offset subtracted. (If center is used, the offset is applied from the top.)&lt;br /&gt;
* '''startIndicationX:''' The X position of the box.&lt;br /&gt;
* '''startIndicationY:''' The Y position of the box.&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns 2 values:&lt;br /&gt;
* '''startX:''' Start X position&lt;br /&gt;
* '''startY:''' Start Y position&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Clientside Script&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;
do&lt;br /&gt;
	local screenX, screenY = guiGetScreenSize()&lt;br /&gt;
&lt;br /&gt;
	function getScreenStartPositionFromBox (width, height, offsetX, offsetY, startIndicationX, startIndicationY)&lt;br /&gt;
		local startX = offsetX &lt;br /&gt;
		local startY = offsetY&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationX == &amp;quot;right&amp;quot; then&lt;br /&gt;
			startX = screenX - (width + offsetX)&lt;br /&gt;
		elseif startIndicationX == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startX = screenX / 2 - width / 2 + offsetX&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if startIndicationY == &amp;quot;bottom&amp;quot; then&lt;br /&gt;
			startY = screenY - (height + offsetY)&lt;br /&gt;
		elseif startIndicationY == &amp;quot;center&amp;quot; then&lt;br /&gt;
			startY = screenY / 2 - height / 2 + offsetY&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return startX, startY&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
-- to-do: test this code...&lt;br /&gt;
addEventHandler(&amp;quot;onClientRender&amp;quot;, &lt;br /&gt;
function ()&lt;br /&gt;
	&lt;br /&gt;
	local rectangleWidth, rectangleHeight = 800, 400&lt;br /&gt;
	&lt;br /&gt;
	local startX, startY = getScreenStartPositionFromBox(rectangleWidth, rectangleHeight, 100, 100, &amp;quot;right&amp;quot;, &amp;quot;bottom&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	dxDrawRectangle ( startX, startY, rectangleWidth, rectangleHeight, tocolor(0, 150, 0), false )&lt;br /&gt;
&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=CheckPassiveTimer&amp;diff=68422</id>
		<title>CheckPassiveTimer</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=CheckPassiveTimer&amp;diff=68422"/>
		<updated>2021-01-26T19:13:55Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: Adding a double dots to split a sentence.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function allows you to use passive timers in your conditions. For example: you want to prevent players repeatedly using a command.&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, int checkPassiveTimer ( string timerName, mixed key, int timeInterval )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''timerName:''' The timer name.&lt;br /&gt;
* '''key:''' The timer key is used as secondary dimension, it can be any value (players/vehicles/strings/numbers/...) except for ''nil''. If there is no specific key required, just use ''true''.&lt;br /&gt;
* '''timeInterval:''' Number value used as timer delay. It doesn't matter if it is a ''float'' or ''int''. (Strings that can be converted to numbers are accepted)&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns 2 values:&lt;br /&gt;
* '''timerState:''' The returned value is ''true'' if there is no passive timer or if that specific passive timer is expired, false otherwise.&lt;br /&gt;
* '''remainingTime:''' The returned value is the remaining time in milliseconds. If there is no passive timer or the timer has been expired it will return the value 0.&lt;br /&gt;
&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;false&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
do&lt;br /&gt;
	local passiveTimerGroups = {}&lt;br /&gt;
	local cleanUpInterval = 240000&lt;br /&gt;
	local nextCleanUpCycle = getTickCount() + cleanUpInterval&lt;br /&gt;
	&lt;br /&gt;
	local onElementDestroyEventName = triggerServerEvent and &amp;quot;onClientElementDestroy&amp;quot; or &amp;quot;onElementDestroy&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local function isEventHandlerAdded( eventName, elementAttachedTo, func ) -- https://wiki.multitheftauto.com/wiki/GetEventHandlers&lt;br /&gt;
		local attachedFunctions = getEventHandlers( eventName, elementAttachedTo )&lt;br /&gt;
		if #attachedFunctions &amp;gt; 0 then&lt;br /&gt;
			for i=1, #attachedFunctions do&lt;br /&gt;
				if attachedFunctions[i] == func then&lt;br /&gt;
					return true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	--[[&lt;br /&gt;
		Remove passive timers of elements that are destroyed&lt;br /&gt;
	]]&lt;br /&gt;
	local function removeDeletedElementTimer ()&lt;br /&gt;
		for timerName, passiveTimers in pairs(passiveTimerGroups) do&lt;br /&gt;
			if passiveTimers[this] then&lt;br /&gt;
				passiveTimers[this] = nil&lt;br /&gt;
				if not next(passiveTimers) then&lt;br /&gt;
					passiveTimerGroups[timerName] = nil&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		removeEventHandler(onElementDestroyEventName, this, removeDeletedElementTimer)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		Make a clean up cycle to prevent a memory leak&lt;br /&gt;
	]]&lt;br /&gt;
	local function checkCleanUpCycle (timeNow)&lt;br /&gt;
		if timeNow &amp;gt; nextCleanUpCycle then&lt;br /&gt;
			nextCleanUpCycle = timeNow + cleanUpInterval&lt;br /&gt;
			local maxExecutionTime = timeNow + 3&lt;br /&gt;
			for timerName, passiveTimers in pairs(passiveTimerGroups) do&lt;br /&gt;
				for key, executionTime in pairs(passiveTimers) do&lt;br /&gt;
					if timeNow &amp;gt; executionTime then&lt;br /&gt;
						if isElement(key) and isEventHandlerAdded(onElementDestroyEventName, key, removeDeletedElementTimer) then&lt;br /&gt;
							removeEventHandler(onElementDestroyEventName, key, removeDeletedElementTimer)&lt;br /&gt;
						end&lt;br /&gt;
						passiveTimers[key] = nil&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if not next(passiveTimers) then&lt;br /&gt;
					passiveTimerGroups[timerName] = nil&lt;br /&gt;
				end&lt;br /&gt;
				--[[&lt;br /&gt;
					Just making sure that during the clean-up cycle no lag spike occur.&lt;br /&gt;
				]]&lt;br /&gt;
				if getTickCount() &amp;gt;= maxExecutionTime then&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function checkPassiveTimer (timerName, key, timeInterval)&lt;br /&gt;
		if type(timerName) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected string at argument 1, got &amp;quot; .. type(timerName) .. &amp;quot;]&amp;quot;, 2)&lt;br /&gt;
		elseif key == nil then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected anything except for nil at argument 2, got nil]&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local intervalType = type(timeInterval)&lt;br /&gt;
		if intervalType == &amp;quot;string&amp;quot; then&lt;br /&gt;
			timeInterval = tonumber(timeInterval)&lt;br /&gt;
			if not timeInterval then&lt;br /&gt;
				error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected a convertible string at argument 3]&amp;quot;, 2)&lt;br /&gt;
			end&lt;br /&gt;
		elseif intervalType ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected number at argument 3, got &amp;quot; .. type(timeInterval) .. &amp;quot;]&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		--[[&lt;br /&gt;
			Set-up the timer&lt;br /&gt;
		]]&lt;br /&gt;
		local passiveTimers = passiveTimerGroups[timerName]&lt;br /&gt;
		if not passiveTimers then&lt;br /&gt;
			passiveTimers = {}&lt;br /&gt;
			passiveTimerGroups[timerName] = passiveTimers&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local timeNow = getTickCount()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		local executionTime = passiveTimers[key]&lt;br /&gt;
		if executionTime then&lt;br /&gt;
			if timeNow &amp;gt; executionTime then&lt;br /&gt;
				passiveTimers[key] = timeNow + timeInterval&lt;br /&gt;
				checkCleanUpCycle(timeNow)&lt;br /&gt;
				return true, 0&lt;br /&gt;
			end&lt;br /&gt;
			checkCleanUpCycle(timeNow)&lt;br /&gt;
			return false, executionTime - timeNow&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if isElement(key) and not isEventHandlerAdded(onElementDestroyEventName, key, removeDeletedElementTimer) then&lt;br /&gt;
			addEventHandler(onElementDestroyEventName, key, removeDeletedElementTimer, false, &amp;quot;high&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		passiveTimers[key] = timeNow + timeInterval&lt;br /&gt;
		&lt;br /&gt;
		checkCleanUpCycle(timeNow)&lt;br /&gt;
		return true, 0&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function ()&lt;br /&gt;
	if checkPassiveTimer(&amp;quot;candy timer&amp;quot;, true, 5000) then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU!&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function ()&lt;br /&gt;
	local status, remainingTime = checkPassiveTimer(&amp;quot;candy timer 2&amp;quot;, true, 5000) &lt;br /&gt;
	if status then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU! You will have to wait &amp;quot; .. math.ceil(remainingTime / 1000) .. &amp;quot; seconds.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function (player)&lt;br /&gt;
	if checkPassiveTimer(&amp;quot;candy timer&amp;quot;, player, 5000) then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;, player)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU!&amp;quot;, player)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=IsVehicleEmpty&amp;diff=67893</id>
		<title>IsVehicleEmpty</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=IsVehicleEmpty&amp;diff=67893"/>
		<updated>2020-12-04T09:43:54Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: Add another version of this function.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Useful Function}}&lt;br /&gt;
&amp;lt;lowercasetitle/&amp;gt;&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
This function checks whether a vehicle is empty.&lt;br /&gt;
&lt;br /&gt;
==Syntax==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;bool isVehicleEmpty ( vehicle theVehicle )&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''theVehicle''': The vehicle that you want to check.&lt;br /&gt;
&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;section name=&amp;quot;Serverside/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 isVehicleEmpty( vehicle )&lt;br /&gt;
	if not isElement( vehicle ) or getElementType( vehicle ) ~= &amp;quot;vehicle&amp;quot; then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local passengers = getVehicleMaxPassengers( vehicle )&lt;br /&gt;
	if type( passengers ) == 'number' then&lt;br /&gt;
		for seat = 0, passengers do&lt;br /&gt;
			if getVehicleOccupant( vehicle, seat ) then&lt;br /&gt;
				return false&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;section name=&amp;quot;Serverside/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 isVehicleEmpty( vehicle )&lt;br /&gt;
	if not isElement( vehicle ) or getElementType( vehicle ) ~= &amp;quot;vehicle&amp;quot; then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return not (next(getVehicleOccupants(vehicle)) and true 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;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=CheckPassiveTimer&amp;diff=67748</id>
		<title>CheckPassiveTimer</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=CheckPassiveTimer&amp;diff=67748"/>
		<updated>2020-11-17T10:48:01Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: Rewritten incorrect comment&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function allows you to use passive timers in your conditions. For example you want to prevent players repeatedly using a command.&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, int checkPassiveTimer ( string timerName, mixed key, int timeInterval )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''timerName:''' The timer name.&lt;br /&gt;
* '''key:''' The timer key is used as secondary dimension, it can be any value (players/vehicles/strings/numbers/...) except for ''nil''. If there is no specific key required, just use ''true''.&lt;br /&gt;
* '''timeInterval:''' Number value used as timer delay. It doesn't matter if it is a ''float'' or ''int''. (Strings that can be converted to numbers are accepted)&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns 2 values:&lt;br /&gt;
* '''timerState:''' The returned value is ''true'' if there is no passive timer or if that specific passive timer is expired, false otherwise.&lt;br /&gt;
* '''remainingTime:''' The returned value is the remaining time in milliseconds. If there is no passive timer or the timer has been expired it will return the value 0.&lt;br /&gt;
&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;false&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
do&lt;br /&gt;
	local passiveTimerGroups = {}&lt;br /&gt;
	local cleanUpInterval = 240000&lt;br /&gt;
	local nextCleanUpCycle = getTickCount() + cleanUpInterval&lt;br /&gt;
	&lt;br /&gt;
	local onElementDestroyEventName = triggerServerEvent and &amp;quot;onClientElementDestroy&amp;quot; or &amp;quot;onElementDestroy&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local function isEventHandlerAdded( eventName, elementAttachedTo, func ) -- https://wiki.multitheftauto.com/wiki/GetEventHandlers&lt;br /&gt;
		local attachedFunctions = getEventHandlers( eventName, elementAttachedTo )&lt;br /&gt;
		if #attachedFunctions &amp;gt; 0 then&lt;br /&gt;
			for i=1, #attachedFunctions do&lt;br /&gt;
				if attachedFunctions[i] == func then&lt;br /&gt;
					return true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	--[[&lt;br /&gt;
		Remove passive timers of elements that are destroyed&lt;br /&gt;
	]]&lt;br /&gt;
	local function removeDeletedElementTimer ()&lt;br /&gt;
		for timerName, passiveTimers in pairs(passiveTimerGroups) do&lt;br /&gt;
			if passiveTimers[this] then&lt;br /&gt;
				passiveTimers[this] = nil&lt;br /&gt;
				if not next(passiveTimers) then&lt;br /&gt;
					passiveTimerGroups[timerName] = nil&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		removeEventHandler(onElementDestroyEventName, this, removeDeletedElementTimer)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		Make a clean up cycle to prevent a memory leak&lt;br /&gt;
	]]&lt;br /&gt;
	local function checkCleanUpCycle (timeNow)&lt;br /&gt;
		if timeNow &amp;gt; nextCleanUpCycle then&lt;br /&gt;
			nextCleanUpCycle = timeNow + cleanUpInterval&lt;br /&gt;
			local maxExecutionTime = timeNow + 3&lt;br /&gt;
			for timerName, passiveTimers in pairs(passiveTimerGroups) do&lt;br /&gt;
				for key, executionTime in pairs(passiveTimers) do&lt;br /&gt;
					if timeNow &amp;gt; executionTime then&lt;br /&gt;
						if isElement(key) and isEventHandlerAdded(onElementDestroyEventName, key, removeDeletedElementTimer) then&lt;br /&gt;
							removeEventHandler(onElementDestroyEventName, key, removeDeletedElementTimer)&lt;br /&gt;
						end&lt;br /&gt;
						passiveTimers[key] = nil&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if not next(passiveTimers) then&lt;br /&gt;
					passiveTimerGroups[timerName] = nil&lt;br /&gt;
				end&lt;br /&gt;
				--[[&lt;br /&gt;
					Just making sure that during the clean-up cycle no lag spike occur.&lt;br /&gt;
				]]&lt;br /&gt;
				if getTickCount() &amp;gt;= maxExecutionTime then&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function checkPassiveTimer (timerName, key, timeInterval)&lt;br /&gt;
		if type(timerName) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected string at argument 1, got &amp;quot; .. type(timerName) .. &amp;quot;]&amp;quot;, 2)&lt;br /&gt;
		elseif key == nil then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected anything except for nil at argument 2, got nil]&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local intervalType = type(timeInterval)&lt;br /&gt;
		if intervalType == &amp;quot;string&amp;quot; then&lt;br /&gt;
			timeInterval = tonumber(timeInterval)&lt;br /&gt;
			if not timeInterval then&lt;br /&gt;
				error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected a convertible string at argument 3]&amp;quot;, 2)&lt;br /&gt;
			end&lt;br /&gt;
		elseif intervalType ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected number at argument 3, got &amp;quot; .. type(timeInterval) .. &amp;quot;]&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		--[[&lt;br /&gt;
			Set-up the timer&lt;br /&gt;
		]]&lt;br /&gt;
		local passiveTimers = passiveTimerGroups[timerName]&lt;br /&gt;
		if not passiveTimers then&lt;br /&gt;
			passiveTimers = {}&lt;br /&gt;
			passiveTimerGroups[timerName] = passiveTimers&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local timeNow = getTickCount()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		local executionTime = passiveTimers[key]&lt;br /&gt;
		if executionTime then&lt;br /&gt;
			if timeNow &amp;gt; executionTime then&lt;br /&gt;
				passiveTimers[key] = timeNow + timeInterval&lt;br /&gt;
				checkCleanUpCycle(timeNow)&lt;br /&gt;
				return true, 0&lt;br /&gt;
			end&lt;br /&gt;
			checkCleanUpCycle(timeNow)&lt;br /&gt;
			return false, executionTime - timeNow&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if isElement(key) and not isEventHandlerAdded(onElementDestroyEventName, key, removeDeletedElementTimer) then&lt;br /&gt;
			addEventHandler(onElementDestroyEventName, key, removeDeletedElementTimer, false, &amp;quot;high&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		passiveTimers[key] = timeNow + timeInterval&lt;br /&gt;
		&lt;br /&gt;
		checkCleanUpCycle(timeNow)&lt;br /&gt;
		return true, 0&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function ()&lt;br /&gt;
	if checkPassiveTimer(&amp;quot;candy timer&amp;quot;, true, 5000) then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU!&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function ()&lt;br /&gt;
	local status, remainingTime = checkPassiveTimer(&amp;quot;candy timer 2&amp;quot;, true, 5000) &lt;br /&gt;
	if status then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU! You will have to wait &amp;quot; .. math.ceil(remainingTime / 1000) .. &amp;quot; seconds.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function (player)&lt;br /&gt;
	if checkPassiveTimer(&amp;quot;candy timer&amp;quot;, player, 5000) then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;, player)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU!&amp;quot;, player)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=CheckPassiveTimer&amp;diff=67306</id>
		<title>CheckPassiveTimer</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=CheckPassiveTimer&amp;diff=67306"/>
		<updated>2020-08-23T10:49:04Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: /* Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function allows you to use passive timers in your conditions. For example you want to prevent players repeatedly using a command.&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, int checkPassiveTimer ( string timerName, mixed key, int timeInterval )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''timerName:''' The timer name.&lt;br /&gt;
* '''key:''' The timer key is used as secondary dimension, it can be any value (players/vehicles/strings/numbers/...) except for ''nil''. If there is no specific key required, just use ''true''.&lt;br /&gt;
* '''timeInterval:''' Number value used as timer delay. It doesn't matter if it is a ''float'' or ''int''. (Strings that can be converted to numbers are accepted)&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns 2 values:&lt;br /&gt;
* '''timerState:''' The returned value is ''true'' if there is no passive timer or if that specific passive timer is expired, false otherwise.&lt;br /&gt;
* '''remainingTime:''' The returned value is the remaining time in milliseconds. If there is no passive timer or the timer has been expired it will return the value 0.&lt;br /&gt;
&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;false&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
do&lt;br /&gt;
	local passiveTimerGroups = {}&lt;br /&gt;
	local cleanUpInterval = 240000&lt;br /&gt;
	local nextCleanUpCycle = getTickCount() + cleanUpInterval&lt;br /&gt;
	&lt;br /&gt;
	local onElementDestroyEventName = triggerServerEvent and &amp;quot;onClientElementDestroy&amp;quot; or &amp;quot;onElementDestroy&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local function isEventHandlerAdded( eventName, elementAttachedTo, func ) -- https://wiki.multitheftauto.com/wiki/GetEventHandlers&lt;br /&gt;
		local attachedFunctions = getEventHandlers( eventName, elementAttachedTo )&lt;br /&gt;
		if #attachedFunctions &amp;gt; 0 then&lt;br /&gt;
			for i=1, #attachedFunctions do&lt;br /&gt;
				if attachedFunctions[i] == func then&lt;br /&gt;
					return true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	--[[&lt;br /&gt;
		Remove elements that are destroyed&lt;br /&gt;
	]]&lt;br /&gt;
	local function removeDeletedElementTimer ()&lt;br /&gt;
		for timerName, passiveTimers in pairs(passiveTimerGroups) do&lt;br /&gt;
			if passiveTimers[this] then&lt;br /&gt;
				passiveTimers[this] = nil&lt;br /&gt;
				if not next(passiveTimers) then&lt;br /&gt;
					passiveTimerGroups[timerName] = nil&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		removeEventHandler(onElementDestroyEventName, this, removeDeletedElementTimer)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		Make a clean up cycle to prevent a memory leak&lt;br /&gt;
	]]&lt;br /&gt;
	local function checkCleanUpCycle (timeNow)&lt;br /&gt;
		if timeNow &amp;gt; nextCleanUpCycle then&lt;br /&gt;
			nextCleanUpCycle = timeNow + cleanUpInterval&lt;br /&gt;
			local maxExecutionTime = timeNow + 3&lt;br /&gt;
			for timerName, passiveTimers in pairs(passiveTimerGroups) do&lt;br /&gt;
				for key, executionTime in pairs(passiveTimers) do&lt;br /&gt;
					if timeNow &amp;gt; executionTime then&lt;br /&gt;
						if isElement(key) and isEventHandlerAdded(onElementDestroyEventName, key, removeDeletedElementTimer) then&lt;br /&gt;
							removeEventHandler(onElementDestroyEventName, key, removeDeletedElementTimer)&lt;br /&gt;
						end&lt;br /&gt;
						passiveTimers[key] = nil&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if not next(passiveTimers) then&lt;br /&gt;
					passiveTimerGroups[timerName] = nil&lt;br /&gt;
				end&lt;br /&gt;
				--[[&lt;br /&gt;
					Just making sure that during the clean-up cycle no lag spike occur.&lt;br /&gt;
				]]&lt;br /&gt;
				if getTickCount() &amp;gt;= maxExecutionTime then&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function checkPassiveTimer (timerName, key, timeInterval)&lt;br /&gt;
		if type(timerName) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected string at argument 1, got &amp;quot; .. type(timerName) .. &amp;quot;]&amp;quot;, 2)&lt;br /&gt;
		elseif key == nil then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected anything except for nil at argument 2, got nil]&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local intervalType = type(timeInterval)&lt;br /&gt;
		if intervalType == &amp;quot;string&amp;quot; then&lt;br /&gt;
			timeInterval = tonumber(timeInterval)&lt;br /&gt;
			if not timeInterval then&lt;br /&gt;
				error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected a convertible string at argument 3]&amp;quot;, 2)&lt;br /&gt;
			end&lt;br /&gt;
		elseif intervalType ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected number at argument 3, got &amp;quot; .. type(timeInterval) .. &amp;quot;]&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		--[[&lt;br /&gt;
			Set-up the timer&lt;br /&gt;
		]]&lt;br /&gt;
		local passiveTimers = passiveTimerGroups[timerName]&lt;br /&gt;
		if not passiveTimers then&lt;br /&gt;
			passiveTimers = {}&lt;br /&gt;
			passiveTimerGroups[timerName] = passiveTimers&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local timeNow = getTickCount()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		local executionTime = passiveTimers[key]&lt;br /&gt;
		if executionTime then&lt;br /&gt;
			if timeNow &amp;gt; executionTime then&lt;br /&gt;
				passiveTimers[key] = timeNow + timeInterval&lt;br /&gt;
				checkCleanUpCycle(timeNow)&lt;br /&gt;
				return true, 0&lt;br /&gt;
			end&lt;br /&gt;
			checkCleanUpCycle(timeNow)&lt;br /&gt;
			return false, executionTime - timeNow&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if isElement(key) and not isEventHandlerAdded(onElementDestroyEventName, key, removeDeletedElementTimer) then&lt;br /&gt;
			addEventHandler(onElementDestroyEventName, key, removeDeletedElementTimer, false, &amp;quot;high&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		passiveTimers[key] = timeNow + timeInterval&lt;br /&gt;
		&lt;br /&gt;
		checkCleanUpCycle(timeNow)&lt;br /&gt;
		return true, 0&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function ()&lt;br /&gt;
	if checkPassiveTimer(&amp;quot;candy timer&amp;quot;, true, 5000) then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU!&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function ()&lt;br /&gt;
	local status, remainingTime = checkPassiveTimer(&amp;quot;candy timer 2&amp;quot;, true, 5000) &lt;br /&gt;
	if status then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU! You will have to wait &amp;quot; .. math.ceil(remainingTime / 1000) .. &amp;quot; seconds.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function (player)&lt;br /&gt;
	if checkPassiveTimer(&amp;quot;candy timer&amp;quot;, player, 5000) then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;, player)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU!&amp;quot;, player)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=CheckPassiveTimer&amp;diff=67305</id>
		<title>CheckPassiveTimer</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=CheckPassiveTimer&amp;diff=67305"/>
		<updated>2020-08-23T10:48:01Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: /* Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function allows you to use passive timers in your conditions. For example you want to prevent players repeatedly using a command.&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, int checkPassiveTimer ( string timerName, mixed key, int timeInterval )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''timerName:''' The timer name.&lt;br /&gt;
* '''key:''' The timer key is used as secondary dimension, it can be any value (players/vehicles/strings/numbers/...) except for ''nil''. If there is no specific key required, just use ''true''.&lt;br /&gt;
* '''timeInterval:''' Number value used as timer delay. It doesn't matter if it is a ''float'' or ''int''. (Strings that can be converted to numbers are accepted)&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns 2 values:&lt;br /&gt;
* '''timerState:''' The returned value is ''true'' if there is no passive timer or if that specific passive timer is expired, false otherwise.&lt;br /&gt;
* '''remainingTime:''' The returned value is the remaining time in milliseconds. If there is no passive timer or the timer has been expired it will return the value 0.&lt;br /&gt;
&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;false&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
do&lt;br /&gt;
	local passiveTimerGroups = {}&lt;br /&gt;
	local cleanUpInterval = 240000&lt;br /&gt;
	local nextCleanUpCycle = getTickCount() + cleanUpInterval&lt;br /&gt;
	&lt;br /&gt;
	local onElementDestroyEventName = triggerServerEvent and &amp;quot;onClientElementDestroy&amp;quot; or &amp;quot;onElementDestroy&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local function isEventHandlerAdded( eventName, elementAttachedTo, func ) -- https://wiki.multitheftauto.com/wiki/GetEventHandlers&lt;br /&gt;
		local attachedFunctions = getEventHandlers( eventName, elementAttachedTo )&lt;br /&gt;
		if #attachedFunctions &amp;gt; 0 then&lt;br /&gt;
			for i=1, #attachedFunctions do&lt;br /&gt;
				if attachedFunctions[i] == func then&lt;br /&gt;
					return true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	--[[&lt;br /&gt;
		Remove elements that are destroyed&lt;br /&gt;
	]]&lt;br /&gt;
	local function removeDeletedElementTimer ()&lt;br /&gt;
		for timerName, passiveTimers in pairs(passiveTimerGroups) do&lt;br /&gt;
			if passiveTimers[this] then&lt;br /&gt;
				passiveTimers[this] = nil&lt;br /&gt;
				if not next(passiveTimers) then&lt;br /&gt;
					passiveTimerGroups[timerName] = nil&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		removeEventHandler(onElementDestroyEventName, this, removeDeletedElementTimer)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		Make a clean up cycle to prevent a memory leak&lt;br /&gt;
	]]&lt;br /&gt;
	local function checkCleanUpCycle (timeNow)&lt;br /&gt;
		if timeNow &amp;gt; nextCleanUpCycle then&lt;br /&gt;
			nextCleanUpCycle = timeNow + cleanUpInterval&lt;br /&gt;
			local maxExecutionTime = timeNow + 3&lt;br /&gt;
			for timerName, passiveTimers in pairs(passiveTimerGroups) do&lt;br /&gt;
				for key, executionTime in pairs(passiveTimers) do&lt;br /&gt;
					if timeNow &amp;gt; executionTime then&lt;br /&gt;
						if isElement(key) and isEventHandlerAdded(onElementDestroyEventName, key, removeDeletedElementTimer) then&lt;br /&gt;
							removeEventHandler(onElementDestroyEventName, key, removeDeletedElementTimer)&lt;br /&gt;
						end&lt;br /&gt;
						passiveTimers[key] = nil&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if not next(passiveTimers) then&lt;br /&gt;
					passiveTimerGroups[timerName] = nil&lt;br /&gt;
				end&lt;br /&gt;
				--[[&lt;br /&gt;
					Just making sure that during the clean-up cycle no lag spike occur.&lt;br /&gt;
				]]&lt;br /&gt;
				if getTickCount() &amp;gt;= maxExecutionTime then&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function checkPassiveTimer (timerName, key, timeInterval)&lt;br /&gt;
		if type(timerName) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected string at argument 1, got &amp;quot; .. type(timerName) .. &amp;quot;]&amp;quot;, 2)&lt;br /&gt;
		elseif key == nil then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected anything except for nil at argument 2, got nil]&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local intervalType = type(timeInterval)&lt;br /&gt;
		if intervalType == &amp;quot;string&amp;quot; then&lt;br /&gt;
			timeInterval = tonumber(timeInterval)&lt;br /&gt;
			if not timeInterval then&lt;br /&gt;
				error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected a convertible string at argument 3]&amp;quot;, 2)&lt;br /&gt;
			end&lt;br /&gt;
		elseif intervalType ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected number at argument 3, got &amp;quot; .. type(timeInterval) .. &amp;quot;]&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		--[[&lt;br /&gt;
			Set-up the timer&lt;br /&gt;
		]]&lt;br /&gt;
		local passiveTimers = passiveTimerGroups[timerName]&lt;br /&gt;
		if not passiveTimers then&lt;br /&gt;
			passiveTimers = {}&lt;br /&gt;
			passiveTimerGroups[timerName] = passiveTimers&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local timeNow = getTickCount()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		local executionTime = passiveTimers[key]&lt;br /&gt;
		if executionTime then&lt;br /&gt;
			if timeNow &amp;gt; executionTime then&lt;br /&gt;
				passiveTimers[key] = timeNow + timeInterval&lt;br /&gt;
				checkCleanUpCycle(timeNow)&lt;br /&gt;
				return true, 0&lt;br /&gt;
			end&lt;br /&gt;
			checkCleanUpCycle(timeNow)&lt;br /&gt;
			return false, executionTime - timeNow&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if isElement(key) and not isEventHandlerAdded(onElementDestroyEventName, key, removeDeletedElementTimer) then&lt;br /&gt;
			addEventHandler(onElementDestroyEventName, key, removeDeletedElementTimer, false, &amp;quot;high&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		passiveTimers[key] = timeNow + timeInterval&lt;br /&gt;
		&lt;br /&gt;
		checkCleanUpCycle(timeNow)&lt;br /&gt;
		return true, 0&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function ()&lt;br /&gt;
	if checkPassiveTimer(&amp;quot;candy timer&amp;quot;, true, 5000) then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU!&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function ()&lt;br /&gt;
	local status, remainingTime = checkPassiveTimer(&amp;quot;myTimer&amp;quot;, true, 5000) &lt;br /&gt;
	if status then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU! You will have to wait &amp;quot; .. math.ceil(remainingTime / 1000) .. &amp;quot; seconds.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function (player)&lt;br /&gt;
	if checkPassiveTimer(&amp;quot;candy timer&amp;quot;, player, 5000) then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;, player)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU!&amp;quot;, player)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=CheckPassiveTimer&amp;diff=67304</id>
		<title>CheckPassiveTimer</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=CheckPassiveTimer&amp;diff=67304"/>
		<updated>2020-08-23T10:47:45Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: /* Returns */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function allows you to use passive timers in your conditions. For example you want to prevent players repeatedly using a command.&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, int checkPassiveTimer ( string timerName, mixed key, int timeInterval )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''timerName:''' The timer name.&lt;br /&gt;
* '''key:''' The timer key is used as secondary dimension, it can be any value (players/vehicles/strings/numbers/...) except for ''nil''. If there is no specific key required, just use ''true''.&lt;br /&gt;
* '''timeInterval:''' Number value used as timer delay. It doesn't matter if it is a ''float'' or ''int''. (Strings that can be converted to numbers are accepted)&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns 2 values:&lt;br /&gt;
* '''timerState:''' The returned value is ''true'' if there is no passive timer or if that specific passive timer is expired, false otherwise.&lt;br /&gt;
* '''remainingTime:''' The returned value is the remaining time in milliseconds. If there is no passive timer or the timer has been expired it will return the value 0.&lt;br /&gt;
&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;false&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
do&lt;br /&gt;
	local passiveTimerGroups = {}&lt;br /&gt;
	local cleanUpInterval = 240000&lt;br /&gt;
	local nextCleanUpCycle = getTickCount() + cleanUpInterval&lt;br /&gt;
	&lt;br /&gt;
	local onElementDestroyEventName = triggerServerEvent and &amp;quot;onClientElementDestroy&amp;quot; or &amp;quot;onElementDestroy&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local function isEventHandlerAdded( eventName, elementAttachedTo, func ) -- https://wiki.multitheftauto.com/wiki/GetEventHandlers&lt;br /&gt;
		local attachedFunctions = getEventHandlers( eventName, elementAttachedTo )&lt;br /&gt;
		if #attachedFunctions &amp;gt; 0 then&lt;br /&gt;
			for i=1, #attachedFunctions do&lt;br /&gt;
				if attachedFunctions[i] == func then&lt;br /&gt;
					return true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	--[[&lt;br /&gt;
		Remove elements that are destroyed&lt;br /&gt;
	]]&lt;br /&gt;
	local function removeDeletedElementTimer ()&lt;br /&gt;
		for timerName, passiveTimers in pairs(passiveTimerGroups) do&lt;br /&gt;
			if passiveTimers[this] then&lt;br /&gt;
				passiveTimers[this] = nil&lt;br /&gt;
				if not next(passiveTimers) then&lt;br /&gt;
					passiveTimerGroups[timerName] = nil&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		removeEventHandler(onElementDestroyEventName, this, removeDeletedElementTimer)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		Make a clean up cycle to prevent a memory leak&lt;br /&gt;
	]]&lt;br /&gt;
	local function checkCleanUpCycle (timeNow)&lt;br /&gt;
		if timeNow &amp;gt; nextCleanUpCycle then&lt;br /&gt;
			nextCleanUpCycle = timeNow + cleanUpInterval&lt;br /&gt;
			local maxExecutionTime = timeNow + 3&lt;br /&gt;
			for timerName, passiveTimers in pairs(passiveTimerGroups) do&lt;br /&gt;
				for key, executionTime in pairs(passiveTimers) do&lt;br /&gt;
					if timeNow &amp;gt; executionTime then&lt;br /&gt;
						if isElement(key) and isEventHandlerAdded(onElementDestroyEventName, key, removeDeletedElementTimer) then&lt;br /&gt;
							removeEventHandler(onElementDestroyEventName, key, removeDeletedElementTimer)&lt;br /&gt;
						end&lt;br /&gt;
						passiveTimers[key] = nil&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if not next(passiveTimers) then&lt;br /&gt;
					passiveTimerGroups[timerName] = nil&lt;br /&gt;
				end&lt;br /&gt;
				--[[&lt;br /&gt;
					Just making sure that during the clean-up cycle no lag spike occur.&lt;br /&gt;
				]]&lt;br /&gt;
				if getTickCount() &amp;gt;= maxExecutionTime then&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function checkPassiveTimer (timerName, key, timeInterval)&lt;br /&gt;
		if type(timerName) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected string at argument 1, got &amp;quot; .. type(timerName) .. &amp;quot;]&amp;quot;, 2)&lt;br /&gt;
		elseif key == nil then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected anything except for nil at argument 2, got nil]&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local intervalType = type(timeInterval)&lt;br /&gt;
		if intervalType == &amp;quot;string&amp;quot; then&lt;br /&gt;
			timeInterval = tonumber(timeInterval)&lt;br /&gt;
			if not timeInterval then&lt;br /&gt;
				error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected a convertible string at argument 3]&amp;quot;, 2)&lt;br /&gt;
			end&lt;br /&gt;
		elseif intervalType ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected number at argument 3, got &amp;quot; .. type(timeInterval) .. &amp;quot;]&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		--[[&lt;br /&gt;
			Set-up the timer&lt;br /&gt;
		]]&lt;br /&gt;
		local passiveTimers = passiveTimerGroups[timerName]&lt;br /&gt;
		if not passiveTimers then&lt;br /&gt;
			passiveTimers = {}&lt;br /&gt;
			passiveTimerGroups[timerName] = passiveTimers&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local timeNow = getTickCount()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		local executionTime = passiveTimers[key]&lt;br /&gt;
		if executionTime then&lt;br /&gt;
			if timeNow &amp;gt; executionTime then&lt;br /&gt;
				passiveTimers[key] = timeNow + timeInterval&lt;br /&gt;
				checkCleanUpCycle(timeNow)&lt;br /&gt;
				return true, 0&lt;br /&gt;
			end&lt;br /&gt;
			checkCleanUpCycle(timeNow)&lt;br /&gt;
			return false, executionTime - timeNow&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if isElement(key) and not isEventHandlerAdded(onElementDestroyEventName, key, removeDeletedElementTimer) then&lt;br /&gt;
			addEventHandler(onElementDestroyEventName, key, removeDeletedElementTimer, false, &amp;quot;high&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		passiveTimers[key] = timeNow + timeInterval&lt;br /&gt;
		&lt;br /&gt;
		checkCleanUpCycle(timeNow)&lt;br /&gt;
		return true, 0&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function ()&lt;br /&gt;
	if checkPassiveTimer(&amp;quot;candy timer&amp;quot;, true, 5000) then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU!&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function ()&lt;br /&gt;
	local status, remainingTime = checkPassiveTimer(&amp;quot;myTimer&amp;quot;, true, 5000) &lt;br /&gt;
	if status then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU! You will have to wait &amp;quot; .. math.ceil(remainingTime / 1000) .. &amp;quot; seconds.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function (player)&lt;br /&gt;
	if checkPassiveTimer(&amp;quot;candy timer&amp;quot;, player, 5000) then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;, player)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU!&amp;quot;, player)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=CheckPassiveTimer&amp;diff=67303</id>
		<title>CheckPassiveTimer</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=CheckPassiveTimer&amp;diff=67303"/>
		<updated>2020-08-23T10:46:14Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: /* Example */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function allows you to use passive timers in your conditions. For example you want to prevent players repeatedly using a command.&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, int checkPassiveTimer ( string timerName, mixed key, int timeInterval )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''timerName:''' The timer name.&lt;br /&gt;
* '''key:''' The timer key is used as secondary dimension, it can be any value (players/vehicles/strings/numbers/...) except for ''nil''. If there is no specific key required, just use ''true''.&lt;br /&gt;
* '''timeInterval:''' Number value used as timer delay. It doesn't matter if it is a ''float'' or ''int''. (Strings that can be converted to numbers are accepted)&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns 2 values:&lt;br /&gt;
* '''timerState:''' The returned value is ''true'' if there is no passive timer or if that specific passive timer is expired, false otherwise.&lt;br /&gt;
* '''remainingTime:''' If there is no passive timer or the timer has been expired it will return the value 0.&lt;br /&gt;
&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;false&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
do&lt;br /&gt;
	local passiveTimerGroups = {}&lt;br /&gt;
	local cleanUpInterval = 240000&lt;br /&gt;
	local nextCleanUpCycle = getTickCount() + cleanUpInterval&lt;br /&gt;
	&lt;br /&gt;
	local onElementDestroyEventName = triggerServerEvent and &amp;quot;onClientElementDestroy&amp;quot; or &amp;quot;onElementDestroy&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local function isEventHandlerAdded( eventName, elementAttachedTo, func ) -- https://wiki.multitheftauto.com/wiki/GetEventHandlers&lt;br /&gt;
		local attachedFunctions = getEventHandlers( eventName, elementAttachedTo )&lt;br /&gt;
		if #attachedFunctions &amp;gt; 0 then&lt;br /&gt;
			for i=1, #attachedFunctions do&lt;br /&gt;
				if attachedFunctions[i] == func then&lt;br /&gt;
					return true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	--[[&lt;br /&gt;
		Remove elements that are destroyed&lt;br /&gt;
	]]&lt;br /&gt;
	local function removeDeletedElementTimer ()&lt;br /&gt;
		for timerName, passiveTimers in pairs(passiveTimerGroups) do&lt;br /&gt;
			if passiveTimers[this] then&lt;br /&gt;
				passiveTimers[this] = nil&lt;br /&gt;
				if not next(passiveTimers) then&lt;br /&gt;
					passiveTimerGroups[timerName] = nil&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		removeEventHandler(onElementDestroyEventName, this, removeDeletedElementTimer)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		Make a clean up cycle to prevent a memory leak&lt;br /&gt;
	]]&lt;br /&gt;
	local function checkCleanUpCycle (timeNow)&lt;br /&gt;
		if timeNow &amp;gt; nextCleanUpCycle then&lt;br /&gt;
			nextCleanUpCycle = timeNow + cleanUpInterval&lt;br /&gt;
			local maxExecutionTime = timeNow + 3&lt;br /&gt;
			for timerName, passiveTimers in pairs(passiveTimerGroups) do&lt;br /&gt;
				for key, executionTime in pairs(passiveTimers) do&lt;br /&gt;
					if timeNow &amp;gt; executionTime then&lt;br /&gt;
						if isElement(key) and isEventHandlerAdded(onElementDestroyEventName, key, removeDeletedElementTimer) then&lt;br /&gt;
							removeEventHandler(onElementDestroyEventName, key, removeDeletedElementTimer)&lt;br /&gt;
						end&lt;br /&gt;
						passiveTimers[key] = nil&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if not next(passiveTimers) then&lt;br /&gt;
					passiveTimerGroups[timerName] = nil&lt;br /&gt;
				end&lt;br /&gt;
				--[[&lt;br /&gt;
					Just making sure that during the clean-up cycle no lag spike occur.&lt;br /&gt;
				]]&lt;br /&gt;
				if getTickCount() &amp;gt;= maxExecutionTime then&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function checkPassiveTimer (timerName, key, timeInterval)&lt;br /&gt;
		if type(timerName) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected string at argument 1, got &amp;quot; .. type(timerName) .. &amp;quot;]&amp;quot;, 2)&lt;br /&gt;
		elseif key == nil then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected anything except for nil at argument 2, got nil]&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local intervalType = type(timeInterval)&lt;br /&gt;
		if intervalType == &amp;quot;string&amp;quot; then&lt;br /&gt;
			timeInterval = tonumber(timeInterval)&lt;br /&gt;
			if not timeInterval then&lt;br /&gt;
				error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected a convertible string at argument 3]&amp;quot;, 2)&lt;br /&gt;
			end&lt;br /&gt;
		elseif intervalType ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected number at argument 3, got &amp;quot; .. type(timeInterval) .. &amp;quot;]&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		--[[&lt;br /&gt;
			Set-up the timer&lt;br /&gt;
		]]&lt;br /&gt;
		local passiveTimers = passiveTimerGroups[timerName]&lt;br /&gt;
		if not passiveTimers then&lt;br /&gt;
			passiveTimers = {}&lt;br /&gt;
			passiveTimerGroups[timerName] = passiveTimers&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local timeNow = getTickCount()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		local executionTime = passiveTimers[key]&lt;br /&gt;
		if executionTime then&lt;br /&gt;
			if timeNow &amp;gt; executionTime then&lt;br /&gt;
				passiveTimers[key] = timeNow + timeInterval&lt;br /&gt;
				checkCleanUpCycle(timeNow)&lt;br /&gt;
				return true, 0&lt;br /&gt;
			end&lt;br /&gt;
			checkCleanUpCycle(timeNow)&lt;br /&gt;
			return false, executionTime - timeNow&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if isElement(key) and not isEventHandlerAdded(onElementDestroyEventName, key, removeDeletedElementTimer) then&lt;br /&gt;
			addEventHandler(onElementDestroyEventName, key, removeDeletedElementTimer, false, &amp;quot;high&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		passiveTimers[key] = timeNow + timeInterval&lt;br /&gt;
		&lt;br /&gt;
		checkCleanUpCycle(timeNow)&lt;br /&gt;
		return true, 0&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function ()&lt;br /&gt;
	if checkPassiveTimer(&amp;quot;candy timer&amp;quot;, true, 5000) then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU!&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function ()&lt;br /&gt;
	local status, remainingTime = checkPassiveTimer(&amp;quot;myTimer&amp;quot;, true, 5000) &lt;br /&gt;
	if status then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU! You will have to wait &amp;quot; .. math.ceil(remainingTime / 1000) .. &amp;quot; seconds.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function (player)&lt;br /&gt;
	if checkPassiveTimer(&amp;quot;candy timer&amp;quot;, player, 5000) then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;, player)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU!&amp;quot;, player)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=CheckPassiveTimer&amp;diff=67302</id>
		<title>CheckPassiveTimer</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=CheckPassiveTimer&amp;diff=67302"/>
		<updated>2020-08-23T10:45:18Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: /* Syntax */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function allows you to use passive timers in your conditions. For example you want to prevent players repeatedly using a command.&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, int checkPassiveTimer ( string timerName, mixed key, int timeInterval )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''timerName:''' The timer name.&lt;br /&gt;
* '''key:''' The timer key is used as secondary dimension, it can be any value (players/vehicles/strings/numbers/...) except for ''nil''. If there is no specific key required, just use ''true''.&lt;br /&gt;
* '''timeInterval:''' Number value used as timer delay. It doesn't matter if it is a ''float'' or ''int''. (Strings that can be converted to numbers are accepted)&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns 2 values:&lt;br /&gt;
* '''timerState:''' The returned value is ''true'' if there is no passive timer or if that specific passive timer is expired, false otherwise.&lt;br /&gt;
* '''remainingTime:''' If there is no passive timer or the timer has been expired it will return the value 0.&lt;br /&gt;
&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;false&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
do&lt;br /&gt;
	local passiveTimerGroups = {}&lt;br /&gt;
	local cleanUpInterval = 240000&lt;br /&gt;
	local nextCleanUpCycle = getTickCount() + cleanUpInterval&lt;br /&gt;
	&lt;br /&gt;
	local onElementDestroyEventName = triggerServerEvent and &amp;quot;onClientElementDestroy&amp;quot; or &amp;quot;onElementDestroy&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local function isEventHandlerAdded( eventName, elementAttachedTo, func ) -- https://wiki.multitheftauto.com/wiki/GetEventHandlers&lt;br /&gt;
		local attachedFunctions = getEventHandlers( eventName, elementAttachedTo )&lt;br /&gt;
		if #attachedFunctions &amp;gt; 0 then&lt;br /&gt;
			for i=1, #attachedFunctions do&lt;br /&gt;
				if attachedFunctions[i] == func then&lt;br /&gt;
					return true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	--[[&lt;br /&gt;
		Remove elements that are destroyed&lt;br /&gt;
	]]&lt;br /&gt;
	local function removeDeletedElementTimer ()&lt;br /&gt;
		for timerName, passiveTimers in pairs(passiveTimerGroups) do&lt;br /&gt;
			if passiveTimers[this] then&lt;br /&gt;
				passiveTimers[this] = nil&lt;br /&gt;
				if not next(passiveTimers) then&lt;br /&gt;
					passiveTimerGroups[timerName] = nil&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		removeEventHandler(onElementDestroyEventName, this, removeDeletedElementTimer)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		Make a clean up cycle to prevent a memory leak&lt;br /&gt;
	]]&lt;br /&gt;
	local function checkCleanUpCycle (timeNow)&lt;br /&gt;
		if timeNow &amp;gt; nextCleanUpCycle then&lt;br /&gt;
			nextCleanUpCycle = timeNow + cleanUpInterval&lt;br /&gt;
			local maxExecutionTime = timeNow + 3&lt;br /&gt;
			for timerName, passiveTimers in pairs(passiveTimerGroups) do&lt;br /&gt;
				for key, executionTime in pairs(passiveTimers) do&lt;br /&gt;
					if timeNow &amp;gt; executionTime then&lt;br /&gt;
						if isElement(key) and isEventHandlerAdded(onElementDestroyEventName, key, removeDeletedElementTimer) then&lt;br /&gt;
							removeEventHandler(onElementDestroyEventName, key, removeDeletedElementTimer)&lt;br /&gt;
						end&lt;br /&gt;
						passiveTimers[key] = nil&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if not next(passiveTimers) then&lt;br /&gt;
					passiveTimerGroups[timerName] = nil&lt;br /&gt;
				end&lt;br /&gt;
				--[[&lt;br /&gt;
					Just making sure that during the clean-up cycle no lag spike occur.&lt;br /&gt;
				]]&lt;br /&gt;
				if getTickCount() &amp;gt;= maxExecutionTime then&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function checkPassiveTimer (timerName, key, timeInterval)&lt;br /&gt;
		if type(timerName) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected string at argument 1, got &amp;quot; .. type(timerName) .. &amp;quot;]&amp;quot;, 2)&lt;br /&gt;
		elseif key == nil then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected anything except for nil at argument 2, got nil]&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local intervalType = type(timeInterval)&lt;br /&gt;
		if intervalType == &amp;quot;string&amp;quot; then&lt;br /&gt;
			timeInterval = tonumber(timeInterval)&lt;br /&gt;
			if not timeInterval then&lt;br /&gt;
				error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected a convertible string at argument 3]&amp;quot;, 2)&lt;br /&gt;
			end&lt;br /&gt;
		elseif intervalType ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected number at argument 3, got &amp;quot; .. type(timeInterval) .. &amp;quot;]&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		--[[&lt;br /&gt;
			Set-up the timer&lt;br /&gt;
		]]&lt;br /&gt;
		local passiveTimers = passiveTimerGroups[timerName]&lt;br /&gt;
		if not passiveTimers then&lt;br /&gt;
			passiveTimers = {}&lt;br /&gt;
			passiveTimerGroups[timerName] = passiveTimers&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local timeNow = getTickCount()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		local executionTime = passiveTimers[key]&lt;br /&gt;
		if executionTime then&lt;br /&gt;
			if timeNow &amp;gt; executionTime then&lt;br /&gt;
				passiveTimers[key] = timeNow + timeInterval&lt;br /&gt;
				checkCleanUpCycle(timeNow)&lt;br /&gt;
				return true, 0&lt;br /&gt;
			end&lt;br /&gt;
			checkCleanUpCycle(timeNow)&lt;br /&gt;
			return false, executionTime - timeNow&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if isElement(key) and not isEventHandlerAdded(onElementDestroyEventName, key, removeDeletedElementTimer) then&lt;br /&gt;
			addEventHandler(onElementDestroyEventName, key, removeDeletedElementTimer, false, &amp;quot;high&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		passiveTimers[key] = timeNow + timeInterval&lt;br /&gt;
		&lt;br /&gt;
		checkCleanUpCycle(timeNow)&lt;br /&gt;
		return true, 0&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function ()&lt;br /&gt;
	if checkPassiveTimer(&amp;quot;candy timer&amp;quot;, true, 5000) then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU!&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function (player)&lt;br /&gt;
	if checkPassiveTimer(&amp;quot;candy timer&amp;quot;, player, 5000) then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;, player)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU!&amp;quot;, player)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=CheckPassiveTimer&amp;diff=67301</id>
		<title>CheckPassiveTimer</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=CheckPassiveTimer&amp;diff=67301"/>
		<updated>2020-08-23T10:44:54Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: /* Returns */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function allows you to use passive timers in your conditions. For example you want to prevent players repeatedly using a command.&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 checkPassiveTimer ( string timerName, mixed key, int timeInterval )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''timerName:''' The timer name.&lt;br /&gt;
* '''key:''' The timer key is used as secondary dimension, it can be any value (players/vehicles/strings/numbers/...) except for ''nil''. If there is no specific key required, just use ''true''.&lt;br /&gt;
* '''timeInterval:''' Number value used as timer delay. It doesn't matter if it is a ''float'' or ''int''. (Strings that can be converted to numbers are accepted)&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns 2 values:&lt;br /&gt;
* '''timerState:''' The returned value is ''true'' if there is no passive timer or if that specific passive timer is expired, false otherwise.&lt;br /&gt;
* '''remainingTime:''' If there is no passive timer or the timer has been expired it will return the value 0.&lt;br /&gt;
&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;false&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
do&lt;br /&gt;
	local passiveTimerGroups = {}&lt;br /&gt;
	local cleanUpInterval = 240000&lt;br /&gt;
	local nextCleanUpCycle = getTickCount() + cleanUpInterval&lt;br /&gt;
	&lt;br /&gt;
	local onElementDestroyEventName = triggerServerEvent and &amp;quot;onClientElementDestroy&amp;quot; or &amp;quot;onElementDestroy&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local function isEventHandlerAdded( eventName, elementAttachedTo, func ) -- https://wiki.multitheftauto.com/wiki/GetEventHandlers&lt;br /&gt;
		local attachedFunctions = getEventHandlers( eventName, elementAttachedTo )&lt;br /&gt;
		if #attachedFunctions &amp;gt; 0 then&lt;br /&gt;
			for i=1, #attachedFunctions do&lt;br /&gt;
				if attachedFunctions[i] == func then&lt;br /&gt;
					return true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	--[[&lt;br /&gt;
		Remove elements that are destroyed&lt;br /&gt;
	]]&lt;br /&gt;
	local function removeDeletedElementTimer ()&lt;br /&gt;
		for timerName, passiveTimers in pairs(passiveTimerGroups) do&lt;br /&gt;
			if passiveTimers[this] then&lt;br /&gt;
				passiveTimers[this] = nil&lt;br /&gt;
				if not next(passiveTimers) then&lt;br /&gt;
					passiveTimerGroups[timerName] = nil&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		removeEventHandler(onElementDestroyEventName, this, removeDeletedElementTimer)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		Make a clean up cycle to prevent a memory leak&lt;br /&gt;
	]]&lt;br /&gt;
	local function checkCleanUpCycle (timeNow)&lt;br /&gt;
		if timeNow &amp;gt; nextCleanUpCycle then&lt;br /&gt;
			nextCleanUpCycle = timeNow + cleanUpInterval&lt;br /&gt;
			local maxExecutionTime = timeNow + 3&lt;br /&gt;
			for timerName, passiveTimers in pairs(passiveTimerGroups) do&lt;br /&gt;
				for key, executionTime in pairs(passiveTimers) do&lt;br /&gt;
					if timeNow &amp;gt; executionTime then&lt;br /&gt;
						if isElement(key) and isEventHandlerAdded(onElementDestroyEventName, key, removeDeletedElementTimer) then&lt;br /&gt;
							removeEventHandler(onElementDestroyEventName, key, removeDeletedElementTimer)&lt;br /&gt;
						end&lt;br /&gt;
						passiveTimers[key] = nil&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if not next(passiveTimers) then&lt;br /&gt;
					passiveTimerGroups[timerName] = nil&lt;br /&gt;
				end&lt;br /&gt;
				--[[&lt;br /&gt;
					Just making sure that during the clean-up cycle no lag spike occur.&lt;br /&gt;
				]]&lt;br /&gt;
				if getTickCount() &amp;gt;= maxExecutionTime then&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function checkPassiveTimer (timerName, key, timeInterval)&lt;br /&gt;
		if type(timerName) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected string at argument 1, got &amp;quot; .. type(timerName) .. &amp;quot;]&amp;quot;, 2)&lt;br /&gt;
		elseif key == nil then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected anything except for nil at argument 2, got nil]&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local intervalType = type(timeInterval)&lt;br /&gt;
		if intervalType == &amp;quot;string&amp;quot; then&lt;br /&gt;
			timeInterval = tonumber(timeInterval)&lt;br /&gt;
			if not timeInterval then&lt;br /&gt;
				error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected a convertible string at argument 3]&amp;quot;, 2)&lt;br /&gt;
			end&lt;br /&gt;
		elseif intervalType ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected number at argument 3, got &amp;quot; .. type(timeInterval) .. &amp;quot;]&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		--[[&lt;br /&gt;
			Set-up the timer&lt;br /&gt;
		]]&lt;br /&gt;
		local passiveTimers = passiveTimerGroups[timerName]&lt;br /&gt;
		if not passiveTimers then&lt;br /&gt;
			passiveTimers = {}&lt;br /&gt;
			passiveTimerGroups[timerName] = passiveTimers&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local timeNow = getTickCount()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		local executionTime = passiveTimers[key]&lt;br /&gt;
		if executionTime then&lt;br /&gt;
			if timeNow &amp;gt; executionTime then&lt;br /&gt;
				passiveTimers[key] = timeNow + timeInterval&lt;br /&gt;
				checkCleanUpCycle(timeNow)&lt;br /&gt;
				return true, 0&lt;br /&gt;
			end&lt;br /&gt;
			checkCleanUpCycle(timeNow)&lt;br /&gt;
			return false, executionTime - timeNow&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if isElement(key) and not isEventHandlerAdded(onElementDestroyEventName, key, removeDeletedElementTimer) then&lt;br /&gt;
			addEventHandler(onElementDestroyEventName, key, removeDeletedElementTimer, false, &amp;quot;high&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		passiveTimers[key] = timeNow + timeInterval&lt;br /&gt;
		&lt;br /&gt;
		checkCleanUpCycle(timeNow)&lt;br /&gt;
		return true, 0&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function ()&lt;br /&gt;
	if checkPassiveTimer(&amp;quot;candy timer&amp;quot;, true, 5000) then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU!&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function (player)&lt;br /&gt;
	if checkPassiveTimer(&amp;quot;candy timer&amp;quot;, player, 5000) then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;, player)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU!&amp;quot;, player)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=CheckPassiveTimer&amp;diff=67300</id>
		<title>CheckPassiveTimer</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=CheckPassiveTimer&amp;diff=67300"/>
		<updated>2020-08-23T10:44:37Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: /* Returns */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function allows you to use passive timers in your conditions. For example you want to prevent players repeatedly using a command.&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 checkPassiveTimer ( string timerName, mixed key, int timeInterval )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''timerName:''' The timer name.&lt;br /&gt;
* '''key:''' The timer key is used as secondary dimension, it can be any value (players/vehicles/strings/numbers/...) except for ''nil''. If there is no specific key required, just use ''true''.&lt;br /&gt;
* '''timeInterval:''' Number value used as timer delay. It doesn't matter if it is a ''float'' or ''int''. (Strings that can be converted to numbers are accepted)&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns 2 values:&lt;br /&gt;
* '''timerState:''' The returned value is ''true'' if there is no passive timer or if that specific passive timer is expired, false otherwise.&lt;br /&gt;
* '''Remaining time:''' If there is no passive timer or the timer has been expired it will return the value 0.&lt;br /&gt;
&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;false&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
do&lt;br /&gt;
	local passiveTimerGroups = {}&lt;br /&gt;
	local cleanUpInterval = 240000&lt;br /&gt;
	local nextCleanUpCycle = getTickCount() + cleanUpInterval&lt;br /&gt;
	&lt;br /&gt;
	local onElementDestroyEventName = triggerServerEvent and &amp;quot;onClientElementDestroy&amp;quot; or &amp;quot;onElementDestroy&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local function isEventHandlerAdded( eventName, elementAttachedTo, func ) -- https://wiki.multitheftauto.com/wiki/GetEventHandlers&lt;br /&gt;
		local attachedFunctions = getEventHandlers( eventName, elementAttachedTo )&lt;br /&gt;
		if #attachedFunctions &amp;gt; 0 then&lt;br /&gt;
			for i=1, #attachedFunctions do&lt;br /&gt;
				if attachedFunctions[i] == func then&lt;br /&gt;
					return true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	--[[&lt;br /&gt;
		Remove elements that are destroyed&lt;br /&gt;
	]]&lt;br /&gt;
	local function removeDeletedElementTimer ()&lt;br /&gt;
		for timerName, passiveTimers in pairs(passiveTimerGroups) do&lt;br /&gt;
			if passiveTimers[this] then&lt;br /&gt;
				passiveTimers[this] = nil&lt;br /&gt;
				if not next(passiveTimers) then&lt;br /&gt;
					passiveTimerGroups[timerName] = nil&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		removeEventHandler(onElementDestroyEventName, this, removeDeletedElementTimer)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		Make a clean up cycle to prevent a memory leak&lt;br /&gt;
	]]&lt;br /&gt;
	local function checkCleanUpCycle (timeNow)&lt;br /&gt;
		if timeNow &amp;gt; nextCleanUpCycle then&lt;br /&gt;
			nextCleanUpCycle = timeNow + cleanUpInterval&lt;br /&gt;
			local maxExecutionTime = timeNow + 3&lt;br /&gt;
			for timerName, passiveTimers in pairs(passiveTimerGroups) do&lt;br /&gt;
				for key, executionTime in pairs(passiveTimers) do&lt;br /&gt;
					if timeNow &amp;gt; executionTime then&lt;br /&gt;
						if isElement(key) and isEventHandlerAdded(onElementDestroyEventName, key, removeDeletedElementTimer) then&lt;br /&gt;
							removeEventHandler(onElementDestroyEventName, key, removeDeletedElementTimer)&lt;br /&gt;
						end&lt;br /&gt;
						passiveTimers[key] = nil&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if not next(passiveTimers) then&lt;br /&gt;
					passiveTimerGroups[timerName] = nil&lt;br /&gt;
				end&lt;br /&gt;
				--[[&lt;br /&gt;
					Just making sure that during the clean-up cycle no lag spike occur.&lt;br /&gt;
				]]&lt;br /&gt;
				if getTickCount() &amp;gt;= maxExecutionTime then&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function checkPassiveTimer (timerName, key, timeInterval)&lt;br /&gt;
		if type(timerName) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected string at argument 1, got &amp;quot; .. type(timerName) .. &amp;quot;]&amp;quot;, 2)&lt;br /&gt;
		elseif key == nil then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected anything except for nil at argument 2, got nil]&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local intervalType = type(timeInterval)&lt;br /&gt;
		if intervalType == &amp;quot;string&amp;quot; then&lt;br /&gt;
			timeInterval = tonumber(timeInterval)&lt;br /&gt;
			if not timeInterval then&lt;br /&gt;
				error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected a convertible string at argument 3]&amp;quot;, 2)&lt;br /&gt;
			end&lt;br /&gt;
		elseif intervalType ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected number at argument 3, got &amp;quot; .. type(timeInterval) .. &amp;quot;]&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		--[[&lt;br /&gt;
			Set-up the timer&lt;br /&gt;
		]]&lt;br /&gt;
		local passiveTimers = passiveTimerGroups[timerName]&lt;br /&gt;
		if not passiveTimers then&lt;br /&gt;
			passiveTimers = {}&lt;br /&gt;
			passiveTimerGroups[timerName] = passiveTimers&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local timeNow = getTickCount()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		local executionTime = passiveTimers[key]&lt;br /&gt;
		if executionTime then&lt;br /&gt;
			if timeNow &amp;gt; executionTime then&lt;br /&gt;
				passiveTimers[key] = timeNow + timeInterval&lt;br /&gt;
				checkCleanUpCycle(timeNow)&lt;br /&gt;
				return true, 0&lt;br /&gt;
			end&lt;br /&gt;
			checkCleanUpCycle(timeNow)&lt;br /&gt;
			return false, executionTime - timeNow&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if isElement(key) and not isEventHandlerAdded(onElementDestroyEventName, key, removeDeletedElementTimer) then&lt;br /&gt;
			addEventHandler(onElementDestroyEventName, key, removeDeletedElementTimer, false, &amp;quot;high&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		passiveTimers[key] = timeNow + timeInterval&lt;br /&gt;
		&lt;br /&gt;
		checkCleanUpCycle(timeNow)&lt;br /&gt;
		return true, 0&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function ()&lt;br /&gt;
	if checkPassiveTimer(&amp;quot;candy timer&amp;quot;, true, 5000) then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU!&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function (player)&lt;br /&gt;
	if checkPassiveTimer(&amp;quot;candy timer&amp;quot;, player, 5000) then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;, player)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU!&amp;quot;, player)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=CheckPassiveTimer&amp;diff=67299</id>
		<title>CheckPassiveTimer</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=CheckPassiveTimer&amp;diff=67299"/>
		<updated>2020-08-23T10:44:21Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: /* Returns */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function allows you to use passive timers in your conditions. For example you want to prevent players repeatedly using a command.&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 checkPassiveTimer ( string timerName, mixed key, int timeInterval )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''timerName:''' The timer name.&lt;br /&gt;
* '''key:''' The timer key is used as secondary dimension, it can be any value (players/vehicles/strings/numbers/...) except for ''nil''. If there is no specific key required, just use ''true''.&lt;br /&gt;
* '''timeInterval:''' Number value used as timer delay. It doesn't matter if it is a ''float'' or ''int''. (Strings that can be converted to numbers are accepted)&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns 2 values:&lt;br /&gt;
* '''timerState:''' The returned value is ''true'' if there is no passive timer or if that specific passive timer is expired, false otherwise. Returns also the remaining time.&lt;br /&gt;
* '''Remaining time:''' If there is no passive timer or the timer has been expired it will return the value 0.&lt;br /&gt;
&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;false&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
do&lt;br /&gt;
	local passiveTimerGroups = {}&lt;br /&gt;
	local cleanUpInterval = 240000&lt;br /&gt;
	local nextCleanUpCycle = getTickCount() + cleanUpInterval&lt;br /&gt;
	&lt;br /&gt;
	local onElementDestroyEventName = triggerServerEvent and &amp;quot;onClientElementDestroy&amp;quot; or &amp;quot;onElementDestroy&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local function isEventHandlerAdded( eventName, elementAttachedTo, func ) -- https://wiki.multitheftauto.com/wiki/GetEventHandlers&lt;br /&gt;
		local attachedFunctions = getEventHandlers( eventName, elementAttachedTo )&lt;br /&gt;
		if #attachedFunctions &amp;gt; 0 then&lt;br /&gt;
			for i=1, #attachedFunctions do&lt;br /&gt;
				if attachedFunctions[i] == func then&lt;br /&gt;
					return true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	--[[&lt;br /&gt;
		Remove elements that are destroyed&lt;br /&gt;
	]]&lt;br /&gt;
	local function removeDeletedElementTimer ()&lt;br /&gt;
		for timerName, passiveTimers in pairs(passiveTimerGroups) do&lt;br /&gt;
			if passiveTimers[this] then&lt;br /&gt;
				passiveTimers[this] = nil&lt;br /&gt;
				if not next(passiveTimers) then&lt;br /&gt;
					passiveTimerGroups[timerName] = nil&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		removeEventHandler(onElementDestroyEventName, this, removeDeletedElementTimer)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		Make a clean up cycle to prevent a memory leak&lt;br /&gt;
	]]&lt;br /&gt;
	local function checkCleanUpCycle (timeNow)&lt;br /&gt;
		if timeNow &amp;gt; nextCleanUpCycle then&lt;br /&gt;
			nextCleanUpCycle = timeNow + cleanUpInterval&lt;br /&gt;
			local maxExecutionTime = timeNow + 3&lt;br /&gt;
			for timerName, passiveTimers in pairs(passiveTimerGroups) do&lt;br /&gt;
				for key, executionTime in pairs(passiveTimers) do&lt;br /&gt;
					if timeNow &amp;gt; executionTime then&lt;br /&gt;
						if isElement(key) and isEventHandlerAdded(onElementDestroyEventName, key, removeDeletedElementTimer) then&lt;br /&gt;
							removeEventHandler(onElementDestroyEventName, key, removeDeletedElementTimer)&lt;br /&gt;
						end&lt;br /&gt;
						passiveTimers[key] = nil&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if not next(passiveTimers) then&lt;br /&gt;
					passiveTimerGroups[timerName] = nil&lt;br /&gt;
				end&lt;br /&gt;
				--[[&lt;br /&gt;
					Just making sure that during the clean-up cycle no lag spike occur.&lt;br /&gt;
				]]&lt;br /&gt;
				if getTickCount() &amp;gt;= maxExecutionTime then&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function checkPassiveTimer (timerName, key, timeInterval)&lt;br /&gt;
		if type(timerName) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected string at argument 1, got &amp;quot; .. type(timerName) .. &amp;quot;]&amp;quot;, 2)&lt;br /&gt;
		elseif key == nil then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected anything except for nil at argument 2, got nil]&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local intervalType = type(timeInterval)&lt;br /&gt;
		if intervalType == &amp;quot;string&amp;quot; then&lt;br /&gt;
			timeInterval = tonumber(timeInterval)&lt;br /&gt;
			if not timeInterval then&lt;br /&gt;
				error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected a convertible string at argument 3]&amp;quot;, 2)&lt;br /&gt;
			end&lt;br /&gt;
		elseif intervalType ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected number at argument 3, got &amp;quot; .. type(timeInterval) .. &amp;quot;]&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		--[[&lt;br /&gt;
			Set-up the timer&lt;br /&gt;
		]]&lt;br /&gt;
		local passiveTimers = passiveTimerGroups[timerName]&lt;br /&gt;
		if not passiveTimers then&lt;br /&gt;
			passiveTimers = {}&lt;br /&gt;
			passiveTimerGroups[timerName] = passiveTimers&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local timeNow = getTickCount()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		local executionTime = passiveTimers[key]&lt;br /&gt;
		if executionTime then&lt;br /&gt;
			if timeNow &amp;gt; executionTime then&lt;br /&gt;
				passiveTimers[key] = timeNow + timeInterval&lt;br /&gt;
				checkCleanUpCycle(timeNow)&lt;br /&gt;
				return true, 0&lt;br /&gt;
			end&lt;br /&gt;
			checkCleanUpCycle(timeNow)&lt;br /&gt;
			return false, executionTime - timeNow&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if isElement(key) and not isEventHandlerAdded(onElementDestroyEventName, key, removeDeletedElementTimer) then&lt;br /&gt;
			addEventHandler(onElementDestroyEventName, key, removeDeletedElementTimer, false, &amp;quot;high&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		passiveTimers[key] = timeNow + timeInterval&lt;br /&gt;
		&lt;br /&gt;
		checkCleanUpCycle(timeNow)&lt;br /&gt;
		return true, 0&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function ()&lt;br /&gt;
	if checkPassiveTimer(&amp;quot;candy timer&amp;quot;, true, 5000) then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU!&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function (player)&lt;br /&gt;
	if checkPassiveTimer(&amp;quot;candy timer&amp;quot;, player, 5000) then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;, player)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU!&amp;quot;, player)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=CheckPassiveTimer&amp;diff=67298</id>
		<title>CheckPassiveTimer</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=CheckPassiveTimer&amp;diff=67298"/>
		<updated>2020-08-23T10:43:44Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: /* Returns */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function allows you to use passive timers in your conditions. For example you want to prevent players repeatedly using a command.&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 checkPassiveTimer ( string timerName, mixed key, int timeInterval )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''timerName:''' The timer name.&lt;br /&gt;
* '''key:''' The timer key is used as secondary dimension, it can be any value (players/vehicles/strings/numbers/...) except for ''nil''. If there is no specific key required, just use ''true''.&lt;br /&gt;
* '''timeInterval:''' Number value used as timer delay. It doesn't matter if it is a ''float'' or ''int''. (Strings that can be converted to numbers are accepted)&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns 2 values:&lt;br /&gt;
* '''timerState:''' ''true'' if there is no passive timer or if that specific passive timer is expired, false otherwise. Returns also the remaining time.&lt;br /&gt;
* '''Remaining time:''' If there is no passive timer or the timer has been expired it will return the value 0.&lt;br /&gt;
&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;false&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
do&lt;br /&gt;
	local passiveTimerGroups = {}&lt;br /&gt;
	local cleanUpInterval = 240000&lt;br /&gt;
	local nextCleanUpCycle = getTickCount() + cleanUpInterval&lt;br /&gt;
	&lt;br /&gt;
	local onElementDestroyEventName = triggerServerEvent and &amp;quot;onClientElementDestroy&amp;quot; or &amp;quot;onElementDestroy&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local function isEventHandlerAdded( eventName, elementAttachedTo, func ) -- https://wiki.multitheftauto.com/wiki/GetEventHandlers&lt;br /&gt;
		local attachedFunctions = getEventHandlers( eventName, elementAttachedTo )&lt;br /&gt;
		if #attachedFunctions &amp;gt; 0 then&lt;br /&gt;
			for i=1, #attachedFunctions do&lt;br /&gt;
				if attachedFunctions[i] == func then&lt;br /&gt;
					return true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	--[[&lt;br /&gt;
		Remove elements that are destroyed&lt;br /&gt;
	]]&lt;br /&gt;
	local function removeDeletedElementTimer ()&lt;br /&gt;
		for timerName, passiveTimers in pairs(passiveTimerGroups) do&lt;br /&gt;
			if passiveTimers[this] then&lt;br /&gt;
				passiveTimers[this] = nil&lt;br /&gt;
				if not next(passiveTimers) then&lt;br /&gt;
					passiveTimerGroups[timerName] = nil&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		removeEventHandler(onElementDestroyEventName, this, removeDeletedElementTimer)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		Make a clean up cycle to prevent a memory leak&lt;br /&gt;
	]]&lt;br /&gt;
	local function checkCleanUpCycle (timeNow)&lt;br /&gt;
		if timeNow &amp;gt; nextCleanUpCycle then&lt;br /&gt;
			nextCleanUpCycle = timeNow + cleanUpInterval&lt;br /&gt;
			local maxExecutionTime = timeNow + 3&lt;br /&gt;
			for timerName, passiveTimers in pairs(passiveTimerGroups) do&lt;br /&gt;
				for key, executionTime in pairs(passiveTimers) do&lt;br /&gt;
					if timeNow &amp;gt; executionTime then&lt;br /&gt;
						if isElement(key) and isEventHandlerAdded(onElementDestroyEventName, key, removeDeletedElementTimer) then&lt;br /&gt;
							removeEventHandler(onElementDestroyEventName, key, removeDeletedElementTimer)&lt;br /&gt;
						end&lt;br /&gt;
						passiveTimers[key] = nil&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if not next(passiveTimers) then&lt;br /&gt;
					passiveTimerGroups[timerName] = nil&lt;br /&gt;
				end&lt;br /&gt;
				--[[&lt;br /&gt;
					Just making sure that during the clean-up cycle no lag spike occur.&lt;br /&gt;
				]]&lt;br /&gt;
				if getTickCount() &amp;gt;= maxExecutionTime then&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function checkPassiveTimer (timerName, key, timeInterval)&lt;br /&gt;
		if type(timerName) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected string at argument 1, got &amp;quot; .. type(timerName) .. &amp;quot;]&amp;quot;, 2)&lt;br /&gt;
		elseif key == nil then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected anything except for nil at argument 2, got nil]&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local intervalType = type(timeInterval)&lt;br /&gt;
		if intervalType == &amp;quot;string&amp;quot; then&lt;br /&gt;
			timeInterval = tonumber(timeInterval)&lt;br /&gt;
			if not timeInterval then&lt;br /&gt;
				error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected a convertible string at argument 3]&amp;quot;, 2)&lt;br /&gt;
			end&lt;br /&gt;
		elseif intervalType ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected number at argument 3, got &amp;quot; .. type(timeInterval) .. &amp;quot;]&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		--[[&lt;br /&gt;
			Set-up the timer&lt;br /&gt;
		]]&lt;br /&gt;
		local passiveTimers = passiveTimerGroups[timerName]&lt;br /&gt;
		if not passiveTimers then&lt;br /&gt;
			passiveTimers = {}&lt;br /&gt;
			passiveTimerGroups[timerName] = passiveTimers&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local timeNow = getTickCount()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		local executionTime = passiveTimers[key]&lt;br /&gt;
		if executionTime then&lt;br /&gt;
			if timeNow &amp;gt; executionTime then&lt;br /&gt;
				passiveTimers[key] = timeNow + timeInterval&lt;br /&gt;
				checkCleanUpCycle(timeNow)&lt;br /&gt;
				return true, 0&lt;br /&gt;
			end&lt;br /&gt;
			checkCleanUpCycle(timeNow)&lt;br /&gt;
			return false, executionTime - timeNow&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if isElement(key) and not isEventHandlerAdded(onElementDestroyEventName, key, removeDeletedElementTimer) then&lt;br /&gt;
			addEventHandler(onElementDestroyEventName, key, removeDeletedElementTimer, false, &amp;quot;high&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		passiveTimers[key] = timeNow + timeInterval&lt;br /&gt;
		&lt;br /&gt;
		checkCleanUpCycle(timeNow)&lt;br /&gt;
		return true, 0&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function ()&lt;br /&gt;
	if checkPassiveTimer(&amp;quot;candy timer&amp;quot;, true, 5000) then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU!&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function (player)&lt;br /&gt;
	if checkPassiveTimer(&amp;quot;candy timer&amp;quot;, player, 5000) then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;, player)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU!&amp;quot;, player)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=CheckPassiveTimer&amp;diff=67297</id>
		<title>CheckPassiveTimer</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=CheckPassiveTimer&amp;diff=67297"/>
		<updated>2020-08-23T10:43:20Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: /* Returns */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function allows you to use passive timers in your conditions. For example you want to prevent players repeatedly using a command.&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 checkPassiveTimer ( string timerName, mixed key, int timeInterval )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''timerName:''' The timer name.&lt;br /&gt;
* '''key:''' The timer key is used as secondary dimension, it can be any value (players/vehicles/strings/numbers/...) except for ''nil''. If there is no specific key required, just use ''true''.&lt;br /&gt;
* '''timeInterval:''' Number value used as timer delay. It doesn't matter if it is a ''float'' or ''int''. (Strings that can be converted to numbers are accepted)&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns 2 values:&lt;br /&gt;
* *timerState:* ''true'' if there is no passive timer or if that specific passive timer is expired, false otherwise. Returns also the remaining time.&lt;br /&gt;
* *Remaining time:* If there is no passive timer or the timer has been expired it will return the value 0.&lt;br /&gt;
&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;false&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
do&lt;br /&gt;
	local passiveTimerGroups = {}&lt;br /&gt;
	local cleanUpInterval = 240000&lt;br /&gt;
	local nextCleanUpCycle = getTickCount() + cleanUpInterval&lt;br /&gt;
	&lt;br /&gt;
	local onElementDestroyEventName = triggerServerEvent and &amp;quot;onClientElementDestroy&amp;quot; or &amp;quot;onElementDestroy&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local function isEventHandlerAdded( eventName, elementAttachedTo, func ) -- https://wiki.multitheftauto.com/wiki/GetEventHandlers&lt;br /&gt;
		local attachedFunctions = getEventHandlers( eventName, elementAttachedTo )&lt;br /&gt;
		if #attachedFunctions &amp;gt; 0 then&lt;br /&gt;
			for i=1, #attachedFunctions do&lt;br /&gt;
				if attachedFunctions[i] == func then&lt;br /&gt;
					return true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	--[[&lt;br /&gt;
		Remove elements that are destroyed&lt;br /&gt;
	]]&lt;br /&gt;
	local function removeDeletedElementTimer ()&lt;br /&gt;
		for timerName, passiveTimers in pairs(passiveTimerGroups) do&lt;br /&gt;
			if passiveTimers[this] then&lt;br /&gt;
				passiveTimers[this] = nil&lt;br /&gt;
				if not next(passiveTimers) then&lt;br /&gt;
					passiveTimerGroups[timerName] = nil&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		removeEventHandler(onElementDestroyEventName, this, removeDeletedElementTimer)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		Make a clean up cycle to prevent a memory leak&lt;br /&gt;
	]]&lt;br /&gt;
	local function checkCleanUpCycle (timeNow)&lt;br /&gt;
		if timeNow &amp;gt; nextCleanUpCycle then&lt;br /&gt;
			nextCleanUpCycle = timeNow + cleanUpInterval&lt;br /&gt;
			local maxExecutionTime = timeNow + 3&lt;br /&gt;
			for timerName, passiveTimers in pairs(passiveTimerGroups) do&lt;br /&gt;
				for key, executionTime in pairs(passiveTimers) do&lt;br /&gt;
					if timeNow &amp;gt; executionTime then&lt;br /&gt;
						if isElement(key) and isEventHandlerAdded(onElementDestroyEventName, key, removeDeletedElementTimer) then&lt;br /&gt;
							removeEventHandler(onElementDestroyEventName, key, removeDeletedElementTimer)&lt;br /&gt;
						end&lt;br /&gt;
						passiveTimers[key] = nil&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if not next(passiveTimers) then&lt;br /&gt;
					passiveTimerGroups[timerName] = nil&lt;br /&gt;
				end&lt;br /&gt;
				--[[&lt;br /&gt;
					Just making sure that during the clean-up cycle no lag spike occur.&lt;br /&gt;
				]]&lt;br /&gt;
				if getTickCount() &amp;gt;= maxExecutionTime then&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function checkPassiveTimer (timerName, key, timeInterval)&lt;br /&gt;
		if type(timerName) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected string at argument 1, got &amp;quot; .. type(timerName) .. &amp;quot;]&amp;quot;, 2)&lt;br /&gt;
		elseif key == nil then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected anything except for nil at argument 2, got nil]&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local intervalType = type(timeInterval)&lt;br /&gt;
		if intervalType == &amp;quot;string&amp;quot; then&lt;br /&gt;
			timeInterval = tonumber(timeInterval)&lt;br /&gt;
			if not timeInterval then&lt;br /&gt;
				error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected a convertible string at argument 3]&amp;quot;, 2)&lt;br /&gt;
			end&lt;br /&gt;
		elseif intervalType ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected number at argument 3, got &amp;quot; .. type(timeInterval) .. &amp;quot;]&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		--[[&lt;br /&gt;
			Set-up the timer&lt;br /&gt;
		]]&lt;br /&gt;
		local passiveTimers = passiveTimerGroups[timerName]&lt;br /&gt;
		if not passiveTimers then&lt;br /&gt;
			passiveTimers = {}&lt;br /&gt;
			passiveTimerGroups[timerName] = passiveTimers&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local timeNow = getTickCount()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		local executionTime = passiveTimers[key]&lt;br /&gt;
		if executionTime then&lt;br /&gt;
			if timeNow &amp;gt; executionTime then&lt;br /&gt;
				passiveTimers[key] = timeNow + timeInterval&lt;br /&gt;
				checkCleanUpCycle(timeNow)&lt;br /&gt;
				return true, 0&lt;br /&gt;
			end&lt;br /&gt;
			checkCleanUpCycle(timeNow)&lt;br /&gt;
			return false, executionTime - timeNow&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if isElement(key) and not isEventHandlerAdded(onElementDestroyEventName, key, removeDeletedElementTimer) then&lt;br /&gt;
			addEventHandler(onElementDestroyEventName, key, removeDeletedElementTimer, false, &amp;quot;high&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		passiveTimers[key] = timeNow + timeInterval&lt;br /&gt;
		&lt;br /&gt;
		checkCleanUpCycle(timeNow)&lt;br /&gt;
		return true, 0&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function ()&lt;br /&gt;
	if checkPassiveTimer(&amp;quot;candy timer&amp;quot;, true, 5000) then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU!&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function (player)&lt;br /&gt;
	if checkPassiveTimer(&amp;quot;candy timer&amp;quot;, player, 5000) then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;, player)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU!&amp;quot;, player)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
	<entry>
		<id>https://wiki.multitheftauto.com/index.php?title=CheckPassiveTimer&amp;diff=67296</id>
		<title>CheckPassiveTimer</title>
		<link rel="alternate" type="text/html" href="https://wiki.multitheftauto.com/index.php?title=CheckPassiveTimer&amp;diff=67296"/>
		<updated>2020-08-23T10:34:59Z</updated>

		<summary type="html">&lt;p&gt;IIYAMA: Return remaining time&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{Useful Function}}&lt;br /&gt;
&lt;br /&gt;
This function allows you to use passive timers in your conditions. For example you want to prevent players repeatedly using a command.&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 checkPassiveTimer ( string timerName, mixed key, int timeInterval )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Required Arguments===&lt;br /&gt;
* '''timerName:''' The timer name.&lt;br /&gt;
* '''key:''' The timer key is used as secondary dimension, it can be any value (players/vehicles/strings/numbers/...) except for ''nil''. If there is no specific key required, just use ''true''.&lt;br /&gt;
* '''timeInterval:''' Number value used as timer delay. It doesn't matter if it is a ''float'' or ''int''. (Strings that can be converted to numbers are accepted)&lt;br /&gt;
&lt;br /&gt;
===Returns===&lt;br /&gt;
Returns ''true'' if there is no passive timer or if that specific passive timer is expired, false otherwise.&lt;br /&gt;
&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;false&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
do&lt;br /&gt;
	local passiveTimerGroups = {}&lt;br /&gt;
	local cleanUpInterval = 240000&lt;br /&gt;
	local nextCleanUpCycle = getTickCount() + cleanUpInterval&lt;br /&gt;
	&lt;br /&gt;
	local onElementDestroyEventName = triggerServerEvent and &amp;quot;onClientElementDestroy&amp;quot; or &amp;quot;onElementDestroy&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local function isEventHandlerAdded( eventName, elementAttachedTo, func ) -- https://wiki.multitheftauto.com/wiki/GetEventHandlers&lt;br /&gt;
		local attachedFunctions = getEventHandlers( eventName, elementAttachedTo )&lt;br /&gt;
		if #attachedFunctions &amp;gt; 0 then&lt;br /&gt;
			for i=1, #attachedFunctions do&lt;br /&gt;
				if attachedFunctions[i] == func then&lt;br /&gt;
					return true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	--[[&lt;br /&gt;
		Remove elements that are destroyed&lt;br /&gt;
	]]&lt;br /&gt;
	local function removeDeletedElementTimer ()&lt;br /&gt;
		for timerName, passiveTimers in pairs(passiveTimerGroups) do&lt;br /&gt;
			if passiveTimers[this] then&lt;br /&gt;
				passiveTimers[this] = nil&lt;br /&gt;
				if not next(passiveTimers) then&lt;br /&gt;
					passiveTimerGroups[timerName] = nil&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		removeEventHandler(onElementDestroyEventName, this, removeDeletedElementTimer)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--[[&lt;br /&gt;
		Make a clean up cycle to prevent a memory leak&lt;br /&gt;
	]]&lt;br /&gt;
	local function checkCleanUpCycle (timeNow)&lt;br /&gt;
		if timeNow &amp;gt; nextCleanUpCycle then&lt;br /&gt;
			nextCleanUpCycle = timeNow + cleanUpInterval&lt;br /&gt;
			local maxExecutionTime = timeNow + 3&lt;br /&gt;
			for timerName, passiveTimers in pairs(passiveTimerGroups) do&lt;br /&gt;
				for key, executionTime in pairs(passiveTimers) do&lt;br /&gt;
					if timeNow &amp;gt; executionTime then&lt;br /&gt;
						if isElement(key) and isEventHandlerAdded(onElementDestroyEventName, key, removeDeletedElementTimer) then&lt;br /&gt;
							removeEventHandler(onElementDestroyEventName, key, removeDeletedElementTimer)&lt;br /&gt;
						end&lt;br /&gt;
						passiveTimers[key] = nil&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if not next(passiveTimers) then&lt;br /&gt;
					passiveTimerGroups[timerName] = nil&lt;br /&gt;
				end&lt;br /&gt;
				--[[&lt;br /&gt;
					Just making sure that during the clean-up cycle no lag spike occur.&lt;br /&gt;
				]]&lt;br /&gt;
				if getTickCount() &amp;gt;= maxExecutionTime then&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function checkPassiveTimer (timerName, key, timeInterval)&lt;br /&gt;
		if type(timerName) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected string at argument 1, got &amp;quot; .. type(timerName) .. &amp;quot;]&amp;quot;, 2)&lt;br /&gt;
		elseif key == nil then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected anything except for nil at argument 2, got nil]&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local intervalType = type(timeInterval)&lt;br /&gt;
		if intervalType == &amp;quot;string&amp;quot; then&lt;br /&gt;
			timeInterval = tonumber(timeInterval)&lt;br /&gt;
			if not timeInterval then&lt;br /&gt;
				error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected a convertible string at argument 3]&amp;quot;, 2)&lt;br /&gt;
			end&lt;br /&gt;
		elseif intervalType ~= &amp;quot;number&amp;quot; then&lt;br /&gt;
			error(&amp;quot;bad argument @ 'checkPassiveTimer' [Expected number at argument 3, got &amp;quot; .. type(timeInterval) .. &amp;quot;]&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		--[[&lt;br /&gt;
			Set-up the timer&lt;br /&gt;
		]]&lt;br /&gt;
		local passiveTimers = passiveTimerGroups[timerName]&lt;br /&gt;
		if not passiveTimers then&lt;br /&gt;
			passiveTimers = {}&lt;br /&gt;
			passiveTimerGroups[timerName] = passiveTimers&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local timeNow = getTickCount()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		local executionTime = passiveTimers[key]&lt;br /&gt;
		if executionTime then&lt;br /&gt;
			if timeNow &amp;gt; executionTime then&lt;br /&gt;
				passiveTimers[key] = timeNow + timeInterval&lt;br /&gt;
				checkCleanUpCycle(timeNow)&lt;br /&gt;
				return true, 0&lt;br /&gt;
			end&lt;br /&gt;
			checkCleanUpCycle(timeNow)&lt;br /&gt;
			return false, executionTime - timeNow&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if isElement(key) and not isEventHandlerAdded(onElementDestroyEventName, key, removeDeletedElementTimer) then&lt;br /&gt;
			addEventHandler(onElementDestroyEventName, key, removeDeletedElementTimer, false, &amp;quot;high&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		passiveTimers[key] = timeNow + timeInterval&lt;br /&gt;
		&lt;br /&gt;
		checkCleanUpCycle(timeNow)&lt;br /&gt;
		return true, 0&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Example==&lt;br /&gt;
&amp;lt;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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function ()&lt;br /&gt;
	if checkPassiveTimer(&amp;quot;candy timer&amp;quot;, true, 5000) then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU!&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;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;
addCommandHandler(&amp;quot;candy&amp;quot;, &lt;br /&gt;
function (player)&lt;br /&gt;
	if checkPassiveTimer(&amp;quot;candy timer&amp;quot;, player, 5000) then&lt;br /&gt;
		outputChatBox(&amp;quot;YES, EAT!&amp;quot;, player)&lt;br /&gt;
	else&lt;br /&gt;
		outputChatBox(&amp;quot;NO CANDY FOR YOU!&amp;quot;, player)&lt;br /&gt;
	end&lt;br /&gt;
end)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/section&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Author: IIYAMA&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
{{Useful_Functions}}&lt;/div&gt;</summary>
		<author><name>IIYAMA</name></author>
	</entry>
</feed>