<?xml version="1.0" encoding="windows-1251"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="https://mtadev.rusff.me/export.php?type=rss" rel="self" type="application/rss+xml" />
		<title>DevMTA - Форум по скриптингу LUA в MTA</title>
		<link>http://mtadev.rusff.me/</link>
		<description>DevMTA - Форум по скриптингу LUA в MTA</description>
		<language>ru-ru</language>
		<lastBuildDate>Wed, 25 Jan 2017 03:27:43 +0300</lastBuildDate>
		<generator>MyBB/mybb.ru</generator>
		<item>
			<title>[ Урок ] Замена звуков оружия.</title>
			<link>http://mtadev.rusff.me/viewtopic.php?pid=19#p19</link>
			<description>&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 14px&quot;&gt;Круто, все работает&lt;/span&gt;&lt;/strong&gt;&amp;#160; :cool:&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Enzo.Grand)</author>
			<pubDate>Wed, 25 Jan 2017 03:27:43 +0300</pubDate>
			<guid>http://mtadev.rusff.me/viewtopic.php?pid=19#p19</guid>
		</item>
		<item>
			<title>[Ресурс] Пак скинов из GTA Criminal Russia</title>
			<link>http://mtadev.rusff.me/viewtopic.php?pid=18#p18</link>
			<description>&lt;p&gt;Ну и рожи у них...&amp;#160; :D&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Enzo.Grand)</author>
			<pubDate>Wed, 25 Jan 2017 03:25:38 +0300</pubDate>
			<guid>http://mtadev.rusff.me/viewtopic.php?pid=18#p18</guid>
		</item>
		<item>
			<title>[Урок] Создания простого GUI окна.</title>
			<link>http://mtadev.rusff.me/viewtopic.php?pid=15#p15</link>
			<description>&lt;p&gt;&lt;strong&gt;Сейчас мы рассмотрим способ создания простого GUI окна.&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;http://cs617923.vk.me/v617923918/9af3/b3GpDTZ40B4.jpg&quot; alt=&quot;http://cs617923.vk.me/v617923918/9af3/b3GpDTZ40B4.jpg&quot; /&gt;&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Для начала давайте изучим код:&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 35em&quot;&gt;&lt;pre&gt;GUIEditor = { 
     memo = {}, 
     button = {}, 
     window = {}, 
} 

// Этот код будет выполнятся когда запускается наш ресурс
addEventHandler(&amp;quot;onClientResourceStart&amp;quot;, resourceRoot, 
     function() 
         GUIEditor.window[1] = guiCreateWindow(289, 115, 811, 461, &amp;quot;Наше GUI окно&amp;quot;,  false) -- Заголовок
         guiWindowSetSizable(GUIEditor.window[1], false) 
   
         GUIEditor.memo[1] = guiCreateMemo(31, 30, 760, 346, &amp;quot;Текст внутри окна&amp;quot;,  false, GUIEditor.window[1]) -- Тут пишем свою информацию
         GUIEditor.button[1] = guiCreateButton(34, 388, 188, 64, &amp;quot;Закрыть&amp;quot;, false,  GUIEditor.window[1])  -- Наша кнопка
         GUIESetVisible (GUIEditor.window [1], false ) 
     end 
) 

addEventHandler(&amp;quot;onClientRender&amp;quot;, root, 
     function() 
         dxDrawText(&amp;quot;&amp;quot;, 934, 515, 1174, 576, tocolor(255, 255, 255, 255), 1, &amp;quot;bankgothic&amp;quot;,  &amp;quot;left&amp;quot;, &amp;quot;top&amp;quot;, false, false, true, false, false) 
     end 
) 

function toggleVisible (  ) -- Наша функция показа gui
   guiSetVisible ( GUIEditor.window[1] , not guiGetVisible(GUIEditor.window[1]) ) 
  end 
   
bindKey( &amp;quot;F2&amp;quot;, &amp;quot;down&amp;quot;, toggleVisible)&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Пояснения: &lt;/strong&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic&quot;&gt;Наше GUI окно&lt;/span&gt; - Название окна &lt;br /&gt;&lt;span style=&quot;font-style: italic&quot;&gt;289, 115, 811, 461&lt;/span&gt; - Размеры окна &lt;br /&gt;&lt;span style=&quot;font-style: italic&quot;&gt;bindKey( &amp;quot;F2&amp;quot;, &amp;quot;down&amp;quot;, toggleVisible)&lt;/span&gt; - F2 кнопка открытия окна &lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;display: block; text-align: right&quot;&gt;&lt;span style=&quot;font-size: 14px&quot;&gt;&lt;strong&gt;Автор урока: &lt;span style=&quot;color: red&quot;&gt;jixin&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Теги: Скриптинг,Lua,MTA&lt;/p&gt;</description>
			<author>mybb@mybb.ru (DeRamirez)</author>
			<pubDate>Sun, 18 Sep 2016 14:56:27 +0300</pubDate>
			<guid>http://mtadev.rusff.me/viewtopic.php?pid=15#p15</guid>
		</item>
		<item>
			<title>[ Урок ] Переходим с PAWN на LUA</title>
			<link>http://mtadev.rusff.me/viewtopic.php?pid=14#p14</link>
			<description>&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;span style=&quot;font-size: 16px&quot;&gt;&lt;strong&gt;Народ! Сейчас я покажу вам небольшой функционал Lua в сравнении с Pawn. Начнем!&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Вначале, я скажу пару слов о Lua:&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Lua&lt;/strong&gt; — &lt;a href=&quot;https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BF%D1%80%D0%B5%D1%82%D0%B0%D1%82%D0%BE%D1%80&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;интерпретируемый&lt;/span&gt;&lt;/a&gt; язык программирования. Является свободным языком, с открытыми исходными текстами на языке Си. Что это значит? Это значит, что официального компилятора, как для P-кода, тут нет. Код можно писать в такой программе как блокнот либо Notepad++(советую) или непосредственно в самой МТА.&lt;/p&gt;
						&lt;p&gt;Начну я с переменных. Все значения в Lua могут храниться в переменных, использоваться в качестве аргументов при вызове функций и возвращаться в виде результата их выполнения.&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;span style=&quot;font-size: 14px&quot;&gt;&lt;strong&gt;Основные типы:&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;• nil (неопределенный)&lt;br /&gt;• boolean (логический)&lt;br /&gt;• number (числовой)&lt;br /&gt;• string (строковый)&lt;br /&gt;• function (функция)&lt;br /&gt;• userdata (пользовательские данные)&lt;br /&gt;• thread (поток)&lt;br /&gt;• table (таблица)&lt;/p&gt;
						&lt;p&gt;В нашем первой ознакомительном уроке, я не буду касаться каждого типа. Мы рассмотрим 2,3,4 и 5 типы данных.&lt;/p&gt;
						&lt;p&gt;Пару слов о переменных:&lt;br /&gt;Переменные в Lua (так же как и в pawn) бывают числовые, логические и строковые. Они делятся на 2 группы: Локальные и глобальные. Локальная переменная - это переменная внутри функции, которая будет использоваться только в ней. И глобальная - это переменная для всех функций.&lt;/p&gt;
						&lt;p&gt;Примеры переменных Pawn:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 19.5em&quot;&gt;&lt;pre&gt;//Глобальные переменные

new a;//Простая переменная
new a[100];//Строковая переменная
new a = 10;//Числовая переменная
new bool:a;//Логическая переменная
//Локальные переменные
main
{
        new bool:a;
}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Думаю в этом примере все понятно. Сначала переменные глобальные, а потом одна локальная. Это был пример из Pawn.&lt;/p&gt;
						&lt;p&gt;Примеры переменных Lua:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 22.5em&quot;&gt;&lt;pre&gt;//Глобальные

a = nil//Пустой тип переменной
a = 10//Значение переменной равно 10
a = 2.56//Числовое значение Float
a = &#039;String&#039;//Строка
a = &amp;quot;String&amp;quot;//Строка
a = true//Логический тип
//Локальная

function Give(thePlayer)
local id
end&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Если сравнивать Lua и Pawn, то тут явно выигрывает Lua, так как она легче. Примеры с переменными я вам показал, теперь перейдём к функциям.&lt;/p&gt;
						&lt;p&gt;В Pawn, функция обозначается &lt;em class=&quot;bbuline&quot;&gt;stock&#039;ом&lt;/em&gt; или &lt;em class=&quot;bbuline&quot;&gt;public&#039;ом&lt;/em&gt;. В Lua же это &lt;em class=&quot;bbuline&quot;&gt;function&lt;/em&gt;.&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 30em&quot;&gt;&lt;pre&gt;stock mes()
{
        new x = 10,y = 8, z = x+y,result;
        if(z &amp;gt;= x*y)
        {
                printf(&amp;quot;%d&amp;quot;,z);
        }
        else
        {
        result = z -7;
        printf(&amp;quot;%d&amp;quot;,result);
        }
}
public OnPlayerConnect(playerid)
{
    stock mes()
    return 1;
}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Это был код на Pawn думаю тут все понятно. Функция &lt;span style=&quot;font-style: italic&quot;&gt;mes&lt;/span&gt; выведется при коннекте игрока. Элементарная арифметика. А теперь, напишем точно такой же код, но на Lua:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 22.5em&quot;&gt;&lt;pre&gt;function joinHandler()
        local x = 10
        local y = 8
        local z = x+y
        local result = nil
        if(z &amp;gt;= x*y)then
        print(y)
        else
        result = z -7
        print(result)
        end
end
addEventHandler(&amp;quot;onPlayerJoin&amp;quot;, getRootElement(), joinHandler)//Это значит, что данная функция onPlayerJoin будет при коннекте&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Как мы видим, код в Lua более интересный, но код в Pawn удобный в читаемости. Кому как удобнее.&lt;/p&gt;
						&lt;p&gt;И последнее что мы разберём в Lua - это команды. Написание команд очень простое, главное просто знать константы функций, которые можно посмотреть &lt;a href=&quot;https://wiki.multitheftauto.com/wiki/Client_Scripting_Functions&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;тут&lt;/span&gt;&lt;/a&gt; и &lt;a href=&quot;https://wiki.multitheftauto.com/wiki/Server_Scripting_Functions&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;тут&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
						&lt;p&gt;Итак, теперь сама команда. Возьмем команду создания оружки для игрока:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 18em&quot;&gt;&lt;pre&gt;function GivePlayerWeapon(thePlayer,command,id,ammo)--Это название и константы функции. Название произвольное, а нативы такие: thePlayer = playerid(функция для игрока, command = это значит, что это команда, id = Это id оружия, ammo = количество патронов
        local id,ammo = giveWeapon(thePlayer,tonumber(id),tonumber(ammo))--объявим 2 переменные оружки и патронов и приравняем их к функции дать оружие, при этом,tonumber - это порядок ввода переменных. То есть thePlayer это функция для игрока, её мы не обозначаем как числовое значение. А к переменной id оружия присвоим первое значение tonumber. Значит когда игрок введет команду и введет ид оружия, сработает tonumbers и обозначит, что оружие обозначается первым. Тоже самое и с патронами, но они обозначены вторыми в списке, значит и вводить паторны нужна после ида оружия :D
        if(id == false) then--Ставим условие на то, что если игрок ввел не правильный id оружия
                outputChatBox(&amp;quot;Неправильный синтаксис функции. Вы неправильно обозначили id оружия&amp;quot;,thePlayer)--Отправим сообщение игроку
        end--объявим конец условию
        if(ammo == false) then//Поставим условие на то, если игрок ввел не правильное количество патронов
                outputChatBox(&amp;quot;Неправильный синтаксис функции.Вы неправильно обозначили количество патронов&amp;quot;,thePlayer)--Отправим сообщение игроку
        end--объявим конец условию
        
end--Объявляем конец всей функции.&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;И теперь обозначим эту функцию командой:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;addCommandHandler(&amp;quot;weap&amp;quot;, GivePlayerWeapon)--В любое место кода&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Все! Теперь синтаксис этой команды: /weap [id] [ammo].&lt;/p&gt;
						&lt;p&gt;Если писать эту же команду на Pawn, то там бы вышло в 2 раза больше строк(учитывай что здесь в MTA стоит начальный командный процессор, а в Pawb это strtok)&lt;/p&gt;
						&lt;p&gt;Вот и весь урок на сегодня.&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;display: block; text-align: right&quot;&gt;&lt;span style=&quot;font-size: 14px&quot;&gt;&lt;strong&gt;Автор урока: &lt;span style=&quot;color: fuchsia&quot;&gt;ex.Jord&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Теги: Скриптинг,Lua,MTA&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Dominik48)</author>
			<pubDate>Sun, 18 Sep 2016 14:22:24 +0300</pubDate>
			<guid>http://mtadev.rusff.me/viewtopic.php?pid=14#p14</guid>
		</item>
		<item>
			<title>[Урок] Дерево элементов MTA</title>
			<link>http://mtadev.rusff.me/viewtopic.php?pid=13#p13</link>
			<description>&lt;p&gt;&lt;strong&gt;Доброго времени суток.&lt;/p&gt;
						&lt;p&gt;Сегодня я хотел бы рассказать вам о очень удобной вещи в MTA, такой как &lt;a href=&quot;https://wiki.multitheftauto.com/wiki/RU/Element_tree&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;Дерево элементов ( Element tree )&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Для начала взгляните на картинку:&lt;/strong&gt;&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://wiki.multitheftauto.com/images/b/b3/Tre.png&quot; alt=&quot;https://wiki.multitheftauto.com/images/b/b3/Tre.png&quot; /&gt;&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;На этой картинке представлено дерево элементов.&lt;br /&gt;Как вы можете увидеть, родительский элемент - root ( &lt;a href=&quot;https://wiki.multitheftauto.com/wiki/GetRootElement&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;getRootElement()&lt;/span&gt;&lt;/a&gt; )&lt;br /&gt;Т.е всё древо исходит от него, т.е это все объекты, ресурсы, автомобили, игроки на сервере.&lt;/p&gt;
						&lt;p&gt;Итак, начнём с освоения и переваривания примеров:&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;setElementModel(source, 19)&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&amp;#9675; source - игрок [тут должен быть указан элемент]&lt;br /&gt; &amp;#9675; 19 - ID модели [тут должна быть указана модель]&lt;/p&gt;
						&lt;p&gt;Этой функцией мы установим игроку source (т.е исполняемому) скин на 19.&lt;/p&gt;
						&lt;p&gt;Итак, теперь сменим модель автомобилю:&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 6em&quot;&gt;&lt;pre&gt;local veh = createVehicle(411, 0.0, 0.0, 0.0)
setElementModel(veh, 522)&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Удобно, правда?&lt;br /&gt;Итак, таким образом мы меняем Infernus на NRG.&lt;br /&gt;Поскольку первый аргумент в функции - &lt;span style=&quot;font-style: italic&quot;&gt;the Element&lt;/span&gt;, то можно менять модель любому элементу, в том числе и объектам.&lt;/p&gt;
						&lt;p&gt;Так, теперь приведём более сложный пример.&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 12em&quot;&gt;&lt;pre&gt;n_el = createElement ( &amp;quot;need&amp;quot; ) -- Создадим элемент &amp;quot;need&amp;quot;
 
local veh = createVehicle ( 411, 0.0, 0.0, 0.0)
setElementParent(veh, n_el) -- Присвоим созданному автомобилю элемент &amp;quot;need&amp;quot;
 
guiCreateButton ( 0.0, 0.0, 0.0, 0.0, &amp;quot;Test&amp;quot;, false, n_el ) -- Создадим кнопку и присвоим ей элемент n_el  (&amp;quot;need&amp;quot;)&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;И в нужном месте вставим:&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;destroyElement ( n_el )&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;В нашем случае удалиться и кнопка, и автомобиль, потому, что мы привязали их к созданному элементу &amp;quot;need&amp;quot; (который тоже удалиться).&lt;br /&gt;Опять же, этой функцией ( &lt;a href=&quot;https://wiki.multitheftauto.com/wiki/DestroyElement&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;destroyElement()&lt;/span&gt;&lt;/a&gt; ) удалиться любой указанный нами элемент, будь то автомобиль, пед, gui, объект и пр.&lt;/p&gt;
						&lt;p&gt;Все функции элементов можно посмотреть здесь: &lt;a href=&quot;https://wiki.multitheftauto.com/wiki/Element&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;https://wiki.multitheftauto.com/wiki/Element&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;display: block; text-align: right&quot;&gt;&lt;span style=&quot;font-size: 16px&quot;&gt;&lt;strong&gt;Автор урока: &lt;span style=&quot;color: red&quot;&gt;Doc_Slove&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Теги: MTA,Element tree&lt;/p&gt;</description>
			<author>mybb@mybb.ru (DeRamirez)</author>
			<pubDate>Fri, 16 Sep 2016 15:50:15 +0300</pubDate>
			<guid>http://mtadev.rusff.me/viewtopic.php?pid=13#p13</guid>
		</item>
		<item>
			<title>[Урок] Введение в скриптинг (Часть 3)</title>
			<link>http://mtadev.rusff.me/viewtopic.php?pid=12#p12</link>
			<description>&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://mtadev.rusff.me/viewtopic.php?id=11&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&lt;span style=&quot;font-size: 12px&quot;&gt;&amp;lt;&amp;lt; &lt;/span&gt;&lt;span style=&quot;font-size: 14px&quot;&gt;Введение в скриптинг (Часть 2)&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 12px&quot;&gt; - Предыдущий урок&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;font-size: 14px&quot;&gt;&lt;strong&gt;Что вам следует знать&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Вы уже кое-что прочитали о ресурсах, обработчиках команд и поиске функций в документации в первом разделе, но многое еще предстоит узнать. Этот раздел проведет довольно краткий обзор о некоторых из этих вещей, по возможности ссылаясь на соответствующие страницы.&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;font-size: 14px&quot;&gt;&lt;strong&gt;Клиентские и серверные скрипты&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Может быть, вы уже заметили эти или схожие термины (сервер/клиент) где-либо на данной вики, наиболее вероятно, вкупе с функциями. MTA не только поддерживает работающие на сервере скрипты, предоставляет команды (типа как мы писали выше) и другие возможности, но также и скрипты, выполняющиеся на клиенте MTA, который игроки используют для подключения к серверу. Причиной этому служит то, что некоторые предоставляемые MTA функции не могут быть серверными (например, &lt;a href=&quot;https://wiki.multitheftauto.com/index.php?title=RU/Introduction_to_Scripting_the_GUI&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;GUI - Graphical User Interface&lt;/span&gt;&lt;/a&gt;, т.е. графический интерфейс пользователя), другие там просто работают лучше, но другим все же лучше быть серверными или попросту не работать на клиентской стороне.&lt;/p&gt;
						&lt;p&gt;Большинство сделанных вами скриптов (модов, карт), вероятно, будут серверными, как и та, которую мы написали в первом разделе. Если вы столкнетесь с чем-то, что не может быть реализовано на серверной стороне, возможно, вы сможете реализовать это на клиентской. Для написания клиентского скрипта, создайте обычный файл-скрипт (например, названный &lt;span style=&quot;font-style: italic&quot;&gt;client.lua&lt;/span&gt;) и укажите его в &lt;span style=&quot;font-style: italic&quot;&gt;meta.xml&lt;/span&gt; так:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;&amp;lt;script src=&amp;quot;client.lua&amp;quot; type=&amp;quot;client&amp;quot; /&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Атрибут &lt;span style=&quot;font-style: italic&quot;&gt;type&lt;/span&gt; по умолчанию установлен на &lt;span style=&quot;font-style: italic&quot;&gt;&amp;quot;server&amp;quot;&lt;/span&gt;, так что надобность указывать его существует только для клиентских скриптов. После этого, клиентский скрипт будет загружаться на компьютеры игроков при заходе.&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;font-size: 14px&quot;&gt;&lt;strong&gt;Более сложные ресурсы&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Предыдущий раздел вкратце изложил, как добавлять в ресурс клиентские скрипты, но возможностей на самом деле намного больше. Как написано в самом начале статьи, ресурсы могут быть чем угодно. Их назначение определяется тем, что они делают. Давайте теоретически вообразим некоторые ресурсы, глядя на их файлы-содержимое, &lt;span style=&quot;font-style: italic&quot;&gt;meta.xml&lt;/span&gt; и подумаем, что они могут делать.&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;font-size: 14px&quot;&gt;&lt;strong&gt;Пример №1: Вспомогательный скрипт&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 9em&quot;&gt;&lt;pre&gt;/admin_commands
/meta.xml
/commands.lua
/client.lua&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 10.5em&quot;&gt;&lt;pre&gt;&amp;lt;meta&amp;gt;
&amp;lt;info author=&amp;quot;Someguy&amp;quot; description=&amp;quot;admin commands&amp;quot; /&amp;gt;
&amp;lt;script src=&amp;quot;commands.lua&amp;quot; /&amp;gt;
&amp;lt;script src=&amp;quot;client.lua&amp;quot; type=&amp;quot;client&amp;quot; /&amp;gt;
&amp;lt;/meta&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14px&quot;&gt;&lt;strong&gt;Пример №2: Мод&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 9em&quot;&gt;&lt;pre&gt;/counterstrike
/meta.xml
/counterstrike.lua
/buymenu.lua&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 10.5em&quot;&gt;&lt;pre&gt;&amp;lt;meta&amp;gt;
&amp;lt;info author=&amp;quot;Someguy&amp;quot; description=&amp;quot;Counterstrike remake&amp;quot; type=&amp;quot;gamemode&amp;quot; /&amp;gt;
&amp;lt;script src=&amp;quot;counterstrike.lua&amp;quot; /&amp;gt;
&amp;lt;script src=&amp;quot;buymenu.lua&amp;quot; type=&amp;quot;client&amp;quot; /&amp;gt;
&amp;lt;/meta&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-style: italic&quot;&gt;counterstrike.lua&lt;/span&gt; содержит схожие с ниже перечисленными функции:&lt;/p&gt;
						&lt;p&gt;1. Позволить игрокам выбирать свою команду и спавниться&lt;br /&gt;2. Обеспечить их оружием, целями и инструкциями (возможно, взятыми из игровой карты, см. ниже)&lt;br /&gt;3. Определить правила игры, напр., когда кончается раунд, что происходит при смерти игрока&lt;br /&gt;4. И, может быть, что-то еще&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;font-style: italic&quot;&gt;buymenu.lua&lt;/span&gt; - клиентский скрипт, создающий меню для покупки оружия.&lt;/p&gt;
						&lt;p&gt;Этот образец может быть назван модом, так как не только влияет на игровой процесс, но, по сути, и задает его рамки. Атрибут type говорит о том, что этот пример работает с &lt;a href=&quot;https://wiki.multitheftauto.com/index.php?title=RU/Resource:Mapmanager&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;Map Manager&lt;/span&gt;&lt;/a&gt;, уже другим ресурсом, написанным QA Team для управлениями модами и подгрузки карт. Очень рекомендуется основывать свои моды на предоставляемом им функционале.&lt;/p&gt;
						&lt;p&gt;Это также означает, что мод, возможно, не запустится без карты. Моды всегда должны пользоваться общим функционалом настолько широко, насколько это возможно. Образец карты - в следующем примере.&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;font-size: 14px&quot;&gt;&lt;strong&gt;Пример №3: Карта&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 9em&quot;&gt;&lt;pre&gt;/cs-airport
/meta.xml
/airport.map
/airport.lua&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 9em&quot;&gt;&lt;pre&gt;&amp;lt;meta&amp;gt;&amp;lt;info author=&amp;quot;Someguy&amp;quot; description=&amp;quot;Counterstrike airport map&amp;quot; type=&amp;quot;map&amp;quot; gamemodes=&amp;quot;counterstrike&amp;quot; /&amp;gt;
&amp;lt;map src=&amp;quot;airport.map&amp;quot; /&amp;gt;
&amp;lt;script src=&amp;quot;airport.lua&amp;quot; /&amp;gt;
&amp;lt;/meta&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-style: italic&quot;&gt;airport.map - XML-файл&lt;/span&gt;, предоставляющий моду информацию о карте, что включает в себя:&lt;/p&gt;
						&lt;p&gt;1. Где игроки должны спавниться, с каким оружием, какие имеются команды.&lt;br /&gt;2. Какие имеются цели.&lt;br /&gt;3. Погода, время, ограничение по времени.&lt;br /&gt;4. Предоставляемый транспорт.&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;font-style: italic&quot;&gt;airport.lua&lt;/span&gt; - может содержать присущий данной карте функционал, что включает в себя:&lt;/p&gt;
						&lt;p&gt;1. Открытие каких-либо дверей, подрыв чего-нибудь при определенных условиях.&lt;br /&gt;2.Создание или передвижение определенных игровых объектов, или управление теми, что были созданы через .map-файл.&lt;br /&gt;3. Всё что еще угодно, связанное с картами.&lt;/p&gt;
						&lt;p&gt;Как вы уже заметили, атрибут &lt;span style=&quot;font-style: italic&quot;&gt;type&lt;/span&gt; поменялся на &lt;span style=&quot;font-style: italic&quot;&gt;&amp;quot;map&amp;quot;&lt;/span&gt;, сообщая &lt;a href=&quot;https://wiki.multitheftauto.com/index.php?title=RU/Resource:Mapmanager&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;Map Manager&lt;/span&gt;&lt;/a&gt;, что этот ресурс - карта, в то время как атрибут &lt;span style=&quot;font-style: italic&quot;&gt;gamemodes&lt;/span&gt; говорит, с какими модами эта карта совместима, в данном случае - это мод из примера выше. Сюрпризом может показаться то, что в ресурс-карту также входит и скрипт. Конечно, это совсем не обязательно для карты, но открывает широкий спектр возможностей для их создателей, позволяя создавать собственный мир с правилами мода, на котором он основывается.&lt;/p&gt;
						&lt;p&gt;Файл &lt;span style=&quot;font-style: italic&quot;&gt;airport.map&lt;/span&gt; может выглядеть примерно так:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 22.5em&quot;&gt;&lt;pre&gt;&amp;lt;map mode=&amp;quot;deathmatch&amp;quot; version=&amp;quot;1.0&amp;quot;&amp;gt;
&amp;lt;terrorists&amp;gt;
&amp;lt;spawnpoint posX=&amp;quot;2332.23&amp;quot; posY=&amp;quot;-12232.33&amp;quot; posZ=&amp;quot;4.42223&amp;quot; skins=&amp;quot;23-40&amp;quot; /&amp;gt;
&amp;lt;/terrorists&amp;gt;

&amp;lt;counterterrorists&amp;gt;
&amp;lt;spawnpoint posX=&amp;quot;2334.23443&amp;quot; posY=&amp;quot;-12300.233&amp;quot; posZ=&amp;quot;10.2344&amp;quot; skins=&amp;quot;40-50&amp;quot; /&amp;gt;
&amp;lt;/counterterrorists&amp;gt;
&amp;lt;bomb posX=&amp;quot;23342.23&amp;quot; posY=&amp;quot;&amp;quot; posZ=&amp;quot;&amp;quot; /&amp;gt;

&amp;lt;vehicle posX=&amp;quot;&amp;quot; posY=&amp;quot;&amp;quot; posZ=&amp;quot;&amp;quot; model=&amp;quot;602&amp;quot; /&amp;gt;
&amp;lt;vehicle posX=&amp;quot;&amp;quot; posY=&amp;quot;&amp;quot; posZ=&amp;quot;&amp;quot; model=&amp;quot;603&amp;quot; /&amp;gt;
&amp;lt;/map&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Когда мод запускается с картой, ресурс-карта автоматически запускается mapmanager&#039;ом, и информация, которую он содержит, может быть прочитана ресурсом-модом. При смене карты, текущий ресурс-карта останавливается, а следующий - запускается&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;font-size: 14px&quot;&gt;&lt;strong&gt;События&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;font-style: italic&quot;&gt;События&lt;/span&gt; - способ MTA сообщать скриптам о происходящем. Например, при смерти игрока, срабатывает событие &lt;a href=&quot;https://wiki.multitheftauto.com/wiki/OnPlayerWasted&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;onPlayerWasted&lt;/span&gt;&lt;/a&gt;. Чтобы при смерти игрока что-то происходило, вам придется проделать действия, схожие с добавлением обработчика команд, как об этом рассказано в первом разделе.&lt;/p&gt;
						&lt;p&gt;Этот пример будет выводить сообщение с именем игрока, который умер:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 9em&quot;&gt;&lt;pre&gt;function playerDied(totalAmmo, killer, killerWeapon, bodypart)
outputChatBox(getPlayerName(source)..&amp;quot; умер!&amp;quot;)
end
addEventHandler(&amp;quot;onPlayerWasted&amp;quot;, getRootElement(), playerDied)&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Вместо того, чтобы сначала вывести список требуемых аргументов, страница документации для событий отображает, какие параметры передаются функции-обработчику, так же, как делает обработчик команд, просто это разнится от события к событию. Другим важным моментом является существующая в функциях-обработчиках переменная source. Ее необязательно добавлять в список параметров функции, но она, тем не менее, существует. Ее значение меняется от события к событию, для событий, связанных с игроком (как в образце выше), это - элемент типа &lt;span style=&quot;font-style: italic&quot;&gt;player&lt;/span&gt;. В качестве другого образца служит базовый скрипт для респавна игрока в первом разделе, на его примере можно понять, как используется &lt;span style=&quot;font-style: italic&quot;&gt;source&lt;/span&gt;.&lt;/p&gt;
						&lt;p&gt;Теги: Скриптинг,Lua,MTA&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Dominik48)</author>
			<pubDate>Fri, 16 Sep 2016 15:26:40 +0300</pubDate>
			<guid>http://mtadev.rusff.me/viewtopic.php?pid=12#p12</guid>
		</item>
		<item>
			<title>[Урок] Введение в скриптинг (Часть 2)</title>
			<link>http://mtadev.rusff.me/viewtopic.php?pid=11#p11</link>
			<description>&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://mtadev.rusff.me/viewtopic.php?id=10&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&lt;span style=&quot;font-size: 12px&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;font-size: 14px&quot;&gt;Введение в скриптинг (Часть 1)&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;font-size: 12px&quot;&gt;&amp;#160; - Предыдущий урок&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;font-size: 14px&quot;&gt;&lt;strong&gt;Создание простой команды&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Давайте вернемся к содержимому файла &lt;span style=&quot;font-style: italic&quot;&gt;script.lua&lt;/span&gt;. Как уже было сказано, мы хотим предоставить команду для создания транспортного средства рядом с вашей текущей позицией в игре. Во-первых, нам понадобится создать функцию, которую мы будем вызывать, и обработчик команды, который сделает команду доступной для выбора игроком посредством ввода ее в консоли.&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 12em&quot;&gt;&lt;pre&gt;-- Создаем функцию, вызываемую обработчиком команды, с аргументами: thePlayer, command, vehicleModel
function createVehicleForPlayer(thePlayer, command, vehicleModel)
-- Создаем транспортное средство и другое
end
-- Создаем обработчик команды
addCommandHandler(&amp;quot;createvehicle&amp;quot;, createVehicleForPlayer)&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 14px&quot;&gt;Про обработчики команд&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Первый аргумент &lt;a href=&quot;https://wiki.multitheftauto.com/wiki/AddCommandHandler&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;addCommandHandler&lt;/span&gt;&lt;/a&gt; - имя команды, которая будет доступна игроку, второй аргумент - функция, на которую произойдет переключение, в данном случае - это createVehicleForPlayer.&lt;/p&gt;
						&lt;p&gt;Если у вас уже есть опыт в скриптинге, вы знаете, что функции вызываются примерно следующим образом:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;functionName(argument1, argument2, argument3, ..)&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;functionName(thePlayer, commandName, argument3, ..)&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Присмотревшись ко второму образцу (выше), мы увидим, что &lt;em class=&quot;bbuline&quot;&gt;argument1&lt;/em&gt; - &lt;span style=&quot;font-style: italic&quot;&gt;thePlayer&lt;/span&gt;, а&lt;em class=&quot;bbuline&quot;&gt; argument2&lt;/em&gt; - &lt;span style=&quot;font-style: italic&quot;&gt;commandName&lt;/span&gt;. &lt;span style=&quot;font-style: italic&quot;&gt;thePlayer&lt;/span&gt; - тот, кто набрал команду, так что как бы вы ее не вводили, переменная будет содержать игрока, который ее активировал. &lt;span style=&quot;font-style: italic&quot;&gt;commandName&lt;/span&gt; - команда, которую ввели. Так что при вводе &lt;span style=&quot;font-style: italic&quot;&gt;&amp;quot;/greet&amp;quot;&lt;/span&gt;, этот аргумент будет содержать &lt;span style=&quot;font-style: italic&quot;&gt;&amp;quot;greet&amp;quot;&lt;/span&gt;. &lt;span style=&quot;font-style: italic&quot;&gt;Argument 3 &lt;/span&gt;- еще что-то, введенное игроком после, об этом вы узнаете чуть позже из данного руководства. Никогда не забывайте, что первые 2 аргумента являются стандартными, но назвать вы их можете по своему усмотрению. То есть важен порядок, а не название.&lt;/p&gt;
						&lt;p&gt;Мы уже вызывали таким образом функцию &lt;a href=&quot;https://wiki.multitheftauto.com/wiki/AddCommandHandler&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;addCommandHandler&lt;/span&gt;&lt;/a&gt;, и так как &lt;span style=&quot;font-style: italic&quot;&gt;createVehicleForPlayer&lt;/span&gt; - также функция, ее тоже можно так вызвать. Но мы для этого используем обработчик команд, который вызывает ее схожим образом, только внутренне.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Например:&lt;/strong&gt; Кто-то вводит &lt;span style=&quot;font-style: italic&quot;&gt;&amp;quot;createvehicle 468&amp;quot;&lt;/span&gt; в игровой консоли, чтобы заспавнить Sanchez, обработчик команд вызывает функцию &lt;span style=&quot;font-style: italic&quot;&gt;createVehicleForPlayer&lt;/span&gt;, как если бы мы имели в скрипте следующую строку кода:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;createVehicleForPlayer(thePlayer,&amp;quot;createvehicle&amp;quot;,&amp;quot;468&amp;quot;) -- thePlayer - Элемент типа player игрок который ввел команду.&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Как можно заметить, предоставляются несколько параметров: игрок, который вызвал команду, сама команда, которую он ввел, и какой-нибудь текст, который он после нее ввел, в данном случае - &lt;span style=&quot;font-style: italic&quot;&gt;&amp;quot;468&amp;quot;&lt;/span&gt; в качестве id транспортного средства, отвечающего за Sanchez. Первые два параметра одинаковы для всех обработчиков команд, о них вы можете почитать на странице &lt;a href=&quot;https://wiki.multitheftauto.com/wiki/AddCommandHandler&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;addCommandHandler&lt;/span&gt;&lt;/a&gt;. Фактически, вам всегда придется определять как минимум эти два параметра, чтобы смочь использовать какие-нибудь другие, идущие после них (например, для обработки текста, введенного после команды, как id модели транспортного средства в нашем случае).&lt;br /&gt;&lt;strong&gt;Заметка:&lt;/strong&gt; Обработчик команды надо добавлять именно после функции, на которую он сошлется, иначе она не будет найдена. Порядок имеет значение в ходе работы скрипта.&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;font-size: 14px&quot;&gt;&lt;strong&gt;Написание функции&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Чтобы заполнить созданную нами функцию, нам следует подумать, что нам предстоит сделать:&lt;/p&gt;
						&lt;p&gt;1. Получить позицию игрока, чтобы знать, где спавнить ТС (мы хотим, чтобы оно появлялось прямо рядом с игроком)&lt;br /&gt;2. Вычислить позицию, на которой мы хотим заспавнить ТС (мы же не хотим его появления на голове у игрока)&lt;br /&gt;3. Собственно, заспавнить ТС&lt;br /&gt;4. Проверить, заспавнилось ли оно успешно, в противном случае - вывести сообщение в чат.&lt;/p&gt;
						&lt;p&gt;Чтобы разрешить все поставленные задaчи, нам понадобится задействовать несколько функций. А чтобы найти нужные нам функции, нужно перейти ко списку серверных функций. Для начала нам понадобится функция, которая получит координаты игрока. Так как все игроки являются элементами, мы сразу выбираем &lt;a href=&quot;https://wiki.multitheftauto.com/wiki/Element&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;Element functions&lt;/span&gt;&lt;/a&gt;, где и находим функцию &lt;a href=&quot;https://wiki.multitheftauto.com/wiki/GetElementPosition&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;getElementPosition&lt;/span&gt;&lt;/a&gt;. Кликнув по имени функции из списка, вы получите ее описание. Там можно увидеть синтаксис, что она возвращает и, как правило, пример использования. Синтаксис сообщает какие аргументы мы можем или должны ей передать.&lt;/p&gt;
						&lt;p&gt;Для &lt;a href=&quot;https://wiki.multitheftauto.com/wiki/GetElementPosition&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;getElementPosition&lt;/span&gt;&lt;/a&gt; синтаксис таков:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;float, float, float getElementPosition ( element theElement )&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Три &lt;span style=&quot;font-style: italic&quot;&gt;float&lt;/span&gt; перед именем функции и есть типы значений, которые она возвращает. В данном случае это значит, что функция возвращает три числа с плавающей точкой (x, y и z). Внутри круглых скобок указаны аргументы, которые ей необходимо передать. В данном случае это только элемент, чью позицию вы хотите получить, у нас он представлен игроком.&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 9em&quot;&gt;&lt;pre&gt;function createVehicleForPlayer(thePlayer, command, vehicleModel)
-- local означает, что переменные существуют только здесь, в этой области, внутри этой функции
local x,y,z = getElementPosition(thePlayer)
end&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Затем нам надо сделать так, чтобы ТС не спавнилось прямо внутри игрока, поэтому мы прибавим небольшое число к переменной x, что повлечет за собой спавн ТС чуть восточнее самого игрока.&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 9em&quot;&gt;&lt;pre&gt;function createVehicleForPlayer(thePlayer, command, vehicleModel)
local x, y, z = getElementPosition(thePlayer) -- Получаем позицию игрока
x = x + 5 -- Прибавляем число 5 к позиции по оси x
end&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Теперь нам понадобится другая функция, чтобы непосредственно заспавнить транспортное средство. Мы снова ищем ее в списке серверных функций, на этот раз, так как мы говорим о транспорте - в разделе &lt;span style=&quot;font-style: italic&quot;&gt;Vehicle functions&lt;/span&gt;, где выберем &lt;a href=&quot;https://wiki.multitheftauto.com/wiki/RU/CreateVehicle&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;createVehicle&lt;/span&gt;&lt;/a&gt;. В синтаксисе этой функции указано только одно возвращаемое значение (что встречается наиболее часто) - элемент типа &lt;span style=&quot;font-style: italic&quot;&gt;vehicle&lt;/span&gt;, представляющий только что созданное ТС. Также мы видим, что часть аргументов заключена в &lt;span style=&quot;font-style: italic&quot;&gt;[ ]&lt;/span&gt;, следовательно, они необязательны.&lt;/p&gt;
						&lt;p&gt;Внутри нашей функции у нас уже есть все аргументы, которые нужны функции &lt;a href=&quot;https://wiki.multitheftauto.com/wiki/RU/CreateVehicle&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;createVehicle&lt;/span&gt;&lt;/a&gt;: Только что вычисленная позиция в переменных x, y, z и id модели, который мы получили через команду (&amp;quot;&lt;span style=&quot;font-style: italic&quot;&gt;createvehicle 468&lt;/span&gt;&amp;quot;), он доступен внутри функции в качестве переменной &lt;span style=&quot;font-style: italic&quot;&gt;vehicleModel&lt;/span&gt;.&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 12em&quot;&gt;&lt;pre&gt;function createVehicleForPlayer(thePlayer, command, vehicleModel)
local x, y, z = getElementPosition(thePlayer) -- Получаем позицию игрока
x = x + 5 -- Прибавляем число 5 к позиции по оси x
-- создаем транспорт и сохраняем возвращенный элемент типа vehicle в переменной &amp;lt;br &amp;quot;&amp;quot;createdVehicle&amp;quot;&amp;quot;
local createdVehicle = createVehicle(tonumber(vehicleModel), x, y, z)
end&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Этот код, конечно же, можно усовершенствовать различными путями, но как минимум мы добавим проверку на то, было ли транспорт успешно создано. Как можно прочитать на странице &lt;a href=&quot;https://wiki.multitheftauto.com/wiki/RU/CreateVehicle&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;createVehicle&lt;/span&gt;&lt;/a&gt; под Returns, функция возвращает &lt;span style=&quot;color: red&quot;&gt;false&lt;/span&gt;, если транспорт создать не получилось. Стало быть, мы проверяем значение переменной &lt;span style=&quot;font-style: italic&quot;&gt;createVehicle.&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Теперь у нас есть готовый скрипт:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 21em&quot;&gt;&lt;pre&gt;function createVehicleForPlayer(thePlayer, command, vehicleModel)
local x,y,z = getElementPosition(thePlayer) -- Получаем позицию игрока
x = x + 5 -- Прибавляем число 5 к позиции по оси x
local createdVehicle = createVehicle(tonumber(vehicleModel),x,y,z)

-- Проверяем, является ли возвращаемое значение &amp;quot;&amp;quot;false&amp;quot;&amp;quot; (то есть ложью, транспорт не создан)
if (createdVehicle == false) then
-- Если да, то выводим сообщение в чат, но только для игрока, который спавнил транспорт.
outputChatBox(&amp;quot;Ошибка при создании транспорта&amp;quot;, thePlayer)
end
end
addCommandHandler(&amp;quot;createvehicle&amp;quot;, createVehicleForPlayer)&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Как вы уже, наверное, заметили, вашему взору предстала новая функция - &lt;a href=&quot;https://wiki.multitheftauto.com/wiki/OutputChatBox&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;outputChatBox&lt;/span&gt;&lt;/a&gt;. Теперь вы самостоятельно можете изучить содержимое ее страницы-документации. Чтобы узнать больше о продвинутом скриптинге, почитайте про &lt;a href=&quot;https://wiki.multitheftauto.com/index.php?title=RU/Resource:Mapmanager&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;Map Manager&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;display: block; text-align: right&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 12px&quot;&gt;Следующий урок - &lt;/span&gt;&lt;a href=&quot;http://mtadev.rusff.me/viewtopic.php?id=12&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&lt;span style=&quot;font-size: 14px&quot;&gt;Введение в скриптинг (Часть 3) &lt;/span&gt;&lt;span style=&quot;font-size: 12px&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Теги: Скриптинг,Lua,MTA&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Dominik48)</author>
			<pubDate>Fri, 16 Sep 2016 14:51:20 +0300</pubDate>
			<guid>http://mtadev.rusff.me/viewtopic.php?pid=11#p11</guid>
		</item>
		<item>
			<title>[Урок] Введение в скриптинг (Часть 1)</title>
			<link>http://mtadev.rusff.me/viewtopic.php?pid=10#p10</link>
			<description>&lt;p&gt;&lt;span style=&quot;font-size: 14px&quot;&gt;&lt;strong&gt;Вступление&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Ресурсы являются ключевой частью MTA. &lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;font-style: italic&quot;&gt;Ресурс&lt;/span&gt; - это папка или zip-архив, содержащий набор файлов, а также meta-файл, который описывает серверу как нужно загружать ресурс и из каких файлов он состоит. Ресурс играет практически ту же роль, что и программа в операционной системе - он может быть запущен и остановлен, при этом несколько ресурсов могут быть запущены одновременно. Все, связанное со скриптингом, находится в ресурсах. Назначение ресурса и определяет, является ли он модом, картой или чем-либо еще. MTA поставляется с ресурсами, которые вы можете выборочно использовать в своих модах, например, &lt;a href=&quot;https://wiki.multitheftauto.com/wiki/Resource:Maplimits&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;maplimits&lt;/span&gt;&lt;/a&gt;, позволяющий удерживать игроков в рамках указанных границ карты, или &lt;a href=&quot;https://community.multitheftauto.com/index.php?p=resources&amp;amp;s=details&amp;amp;id=69&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;deathpickups&lt;/span&gt;&lt;/a&gt;, создающий пикапы с оружием.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Подсказка: &lt;/strong&gt;Первым шагом в изучении &lt;em class=&quot;bbuline&quot;&gt;Lua-скриптинга&lt;/em&gt; должен быть выбор &lt;em class=&quot;bbuline&quot;&gt;Lua-редактора&lt;/em&gt;. Это намного упрощает скриптинг. Мы рекомендуем &lt;span style=&quot;font-style: italic&quot;&gt;Notepad++&lt;/span&gt; или &lt;span style=&quot;font-style: italic&quot;&gt;LuaEdit&lt;/span&gt;. Также имеется неофициальный &lt;span style=&quot;font-style: italic&quot;&gt;MTA Script Editor&lt;/span&gt;. Или вы можете использовать любой текстовый редактор вашей системы, например &amp;quot;Блокнот Windows&amp;quot; но комфорт работы в таких программах на порядок ниже, т.к. нет подсветки синтаксиса языка, что немало важно для читабельности кода скрипта.&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;font-size: 14px&quot;&gt;&lt;strong&gt;Создание работающего скрипта&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Для начала мы узнаем, как пошагово сделать базовый скрипт, который позволит игроку прогуливаться по городу.&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;font-size: 14px&quot;&gt;&lt;strong&gt;Где находятся все скрипты?&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Давайте взглянем на файловую структуру скрипта. Зайдите в папку сервера MTA и пройдите по следующему пути: &lt;span style=&quot;font-style: italic&quot;&gt;/server/mods/deathmatch/resources/ &lt;/span&gt;Вы увидите множество .zip-архивов, являющихся упакованными пробными скриптами, поставляемыми с MTA DM. &lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;font-style: italic&quot;&gt;Каждый файл&lt;/span&gt; - это &amp;quot;ресурс&amp;quot;, все они будут распакованы и загружены сервером при его старте. Чтобы создать свой собственный ресурс, просто создайте папку и назовите ее так, как хотите. В нашем случае мы назовем ее &lt;span style=&quot;font-style: italic&quot;&gt;&amp;quot;myserver&amp;quot;&lt;/span&gt;.Теперь вам нужно зайти в эту папку:&lt;span style=&quot;font-style: italic&quot;&gt; /server/mods/deathmatch/resources/myserver/&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;font-size: 14px&quot;&gt;&lt;strong&gt;Идентификация вашего ресурса&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Чтобы сервер мог узнать о содержимом того или иного ресурса, в нем должен быть создан файл &lt;span style=&quot;font-style: italic&quot;&gt;meta.xml&lt;/span&gt;, перечисляющий его содержимое. Этот файл должен быть расположен в корневой директории ресурса, в нашем случае - это папка &lt;span style=&quot;font-style: italic&quot;&gt;&amp;quot;myserver&amp;quot;&lt;/span&gt;. Просто создайте текстовый файл, назовите его &lt;span style=&quot;font-style: italic&quot;&gt;&amp;quot;meta.xml&amp;quot;&lt;/span&gt; и откройте с помощью Блокнота.&lt;/p&gt;
						&lt;p&gt;В файл &lt;span style=&quot;font-style: italic&quot;&gt;meta.xml&lt;/span&gt; введите следующий код:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 9em&quot;&gt;&lt;pre&gt;&amp;lt;meta&amp;gt;
&amp;lt;info author=&amp;quot;YourName&amp;quot; type=&amp;quot;gamemode&amp;quot; name=&amp;quot;Мой скрипт&amp;quot; description=&amp;quot;Мой первый скрипт&amp;quot; /&amp;gt;
&amp;lt;script src=&amp;quot;script.lua&amp;quot; /&amp;gt;
&amp;lt;/meta&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;В теге&lt;span style=&quot;font-style: italic&quot;&gt; &amp;lt; info/ &amp;gt;&lt;/span&gt; есть поле &lt;span style=&quot;font-style: italic&quot;&gt;&amp;quot;type&amp;quot;&lt;/span&gt;, которое говорит о том, что данный ресурс - &lt;span style=&quot;font-style: italic&quot;&gt;gamemode&lt;/span&gt; (&amp;quot;мод&amp;quot;, игровой режим), а не обычный&lt;span style=&quot;font-style: italic&quot;&gt; include &lt;/span&gt;или&lt;span style=&quot;font-style: italic&quot;&gt; map&lt;/span&gt; (карта), о которых мы поговорим чуть позже. Gamemode - то, что вам нужно, чтобы создать независимый сервер.Тег &lt;span style=&quot;font-style: italic&quot;&gt;&amp;lt; script/ &amp;gt;&lt;/span&gt; оговаривает сценарии (скрипты), которые содержит ресурс, о них мы сейчас и поговорим.&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;font-size: 14px&quot;&gt;&lt;strong&gt;Создание простого скрипта&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Заметьте, что в теге &lt;span style=&quot;font-style: italic&quot;&gt;&amp;lt; script /&amp;gt;&lt;/span&gt; выше .lua-файл не находится в какой-либо вложенной директории. Следовательно, мы создадим файл в той же папке, что и &lt;span style=&quot;font-style: italic&quot;&gt;meta.xml&lt;/span&gt;. Теперь можно скопировать и вставить в &lt;span style=&quot;font-style: italic&quot;&gt;script.lua&lt;/span&gt; следующий код:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 15em&quot;&gt;&lt;pre&gt;local spawnX, spawnY, spawnZ = 1959.55, -1714.46, 10
function joinHandler()
spawnPlayer(source, spawnX, spawnY, spawnZ)
fadeCamera(source, true)
setCameraTarget(source, source)
outputChatBox(&amp;quot;Welcome to My Server&amp;quot;, source)
end
addEventHandler(&amp;quot;onPlayerJoin&amp;quot;, getRootElement(), joinHandler)&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Этот скрипт заспавнит вас по координатам (x, y, z), указанным выше, когда вы зайдете на сервер. Обратите внимание, что функция &lt;a href=&quot;https://wiki.multitheftauto.com/wiki/FadeCamera&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;fadeCamera&lt;/span&gt;&lt;/a&gt; обязательно должна быть, иначе экран будет черным. К тому же, в релизах новее DP2 вам нужно установить цель для камеры (иначе все, что увидит игрок - синее небо).Переменная source указывает на того, кто вызвал срабатывание события. Так как данный код срабатывает при заходе какого-либо игрока, эта переменная используется для установления того, кто зашел. Так что спавнить будет именно этого игрока, а не всех сразу или кого-нибудь случайно.&lt;br /&gt;Если присмотреться к &lt;a href=&quot;https://wiki.multitheftauto.com/index.php?title=RU/addEventHandler&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;addEventHandler&lt;/span&gt;&lt;/a&gt;, вы заметите три вещи: &amp;quot;&lt;a href=&quot;https://wiki.multitheftauto.com/wiki/OnPlayerJoin&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;onPlayerJoin&lt;/span&gt;&lt;/a&gt;&amp;quot;, указывающий на то, когда (почему) произойдет срабатывание; &lt;a href=&quot;https://wiki.multitheftauto.com/index.php?title=RU/getRootElement&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;getRootElement()&lt;/span&gt;&lt;/a&gt;, который показывает благодаря кому/чему может произойти срабатывание&amp;#160; и joinHandler, который отвечает за функцию, на которую произойдет переключение при срабатывании события. Остальные подробности будут изложены позже и на отдельном примере, а теперь давайте просто запустим сервер и попрактикуемся!&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;font-size: 14px&quot;&gt;&lt;strong&gt;Запуск скрипта&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Чтобы запустить сервер, просто запустите исполняемый файл (на Windows - .exe) по адресу&lt;span style=&quot;font-style: italic&quot;&gt; MTA San Andreas x.x/server&lt;/span&gt;, где x.x - номер версии MTA. Сначала будут показаны данные сервера; запомните номер порта (server port), который понадобится вам при подключении. Затем сервер загрузит все ресурсы в папку &lt;span style=&quot;font-style: italic&quot;&gt;mods/deathmatch/resources/&lt;/span&gt; и позже будет &amp;quot;ready to accept connections!&amp;quot;, то есть готов принимать игроков.&lt;/p&gt;
						&lt;p&gt;Теперь можно запустить клиент MTA и подключиться к серверу, воспользовавшись IP-адресом вашего сервера и номером порта, на который мы ранее обратили ваше внимание. Если все пройдет по плану, через несколько секунд ваш персонаж сможет пройтись по улицам Los Santos&amp;quot;а.&lt;/p&gt;
						&lt;p&gt;Затем мы добавим в скрипт команду, которую игроки смогут использовать для того, чтобы спавнить рядом с собой транспортное средство. Вы можете это пропустить и взглянуть на статью про более продвинутый скриптинг с использованием &lt;a href=&quot;https://wiki.multitheftauto.com/index.php?title=RU/Resource:Mapmanager&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;Map Manager&lt;/span&gt;&lt;/a&gt;, которая продолжит это руководство. Еще одним ответвлением данного руководства является &lt;a href=&quot;https://wiki.multitheftauto.com/wiki/%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3_GUI&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;Введение в скриптинг GUI&lt;/span&gt;&lt;/a&gt;: прочитав его, вы узнаете, как рисуется и программируется &lt;span style=&quot;font-style: italic&quot;&gt;Graphical User Interface&lt;/span&gt; в MTA.&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;display: block; text-align: right&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 12px&quot;&gt;Следующий урок - &lt;/span&gt;&lt;a href=&quot;http://mtadev.rusff.me/viewtopic.php?id=11&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;&lt;span style=&quot;font-size: 14px&quot;&gt;Введение в скриптинг (Часть 2) &lt;/span&gt;&lt;span style=&quot;font-size: 12px&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Теги: Скриптинг,Lua,MTA&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Dominik48)</author>
			<pubDate>Fri, 16 Sep 2016 05:16:58 +0300</pubDate>
			<guid>http://mtadev.rusff.me/viewtopic.php?pid=10#p10</guid>
		</item>
		<item>
			<title>[Урок] Подключаем мод к MySQL.</title>
			<link>http://mtadev.rusff.me/viewtopic.php?pid=9#p9</link>
			<description>&lt;p&gt;Здравствуйте, вот я немножко изучил LUA и хотел бы поделиться своим опытом по подключению мода на mysql.&lt;br /&gt;Вообщем я учился на &amp;quot;Вики&amp;quot;, и все на английском языке, пришлось понимать.&lt;/p&gt;
						&lt;p&gt;Но начнем пожалуй :)&lt;br /&gt;Подключении мода на mysql будет разделяться на 2 части , 1 - для Windows, 2 - для Linux&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;1. Windows&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Переходим по данной ссылке -&amp;gt; &lt;a href=&quot;https://code.google.com/archive/p/multitheftauto-modules/downloads&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;Тыкни&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;и скачиваем два файла &lt;em class=&quot;bbuline&quot;&gt;mta_mysql.dll&lt;/em&gt; и &lt;em class=&quot;bbuline&quot;&gt;libmysql.dll&lt;/em&gt;&lt;br /&gt;далее файл &lt;em class=&quot;bbuline&quot;&gt;mta_mysql.dll&lt;/em&gt; нужно засунуть по пути ДИСК:\ПАПКА С МТА\server\mods\deathmatch\modules\&lt;br /&gt;а файл &lt;em class=&quot;bbuline&quot;&gt;libmysql.dll&lt;/em&gt; ДИСК:\ПАПКА С МТА\server\&lt;/p&gt;
						&lt;p&gt;Затем, добавьте в &lt;em class=&quot;bbuline&quot;&gt;mtaserver.conf&lt;/em&gt; следующую строку:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;&amp;lt;module src=&amp;quot;mta_mysql.dll&amp;quot; /&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2. Linux&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Более подробно насчет линукса объяснить не могу, но попробую :)&lt;/p&gt;
						&lt;p&gt;Переходим по данной ссылке -&amp;gt; &lt;a href=&quot;https://code.google.com/archive/p/multitheftauto-modules/downloads&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;Тыкни&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Разархивируйте файл &lt;em class=&quot;bbuline&quot;&gt;mta_mysql.so&lt;/em&gt; в папку mods/deathmatch/modules/.&lt;/p&gt;
						&lt;p&gt;Затем, добавьте в &lt;em class=&quot;bbuline&quot;&gt;mtaserver.conf&lt;/em&gt; следующую строку:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;&amp;lt;module src=&amp;quot;mta_mysql.so&amp;quot; /&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Чтобы исправить ошибку MODULE: Unable to find modules/mta_mysql.so (libmysqlclient.so.15: cannot open shared object file: No such file or directory)!, вам потребуется установить &lt;em class=&quot;bbuline&quot;&gt;libmysqlclient15&lt;/em&gt;. &lt;br /&gt;Скачать можно здесь -&amp;gt; &lt;a href=&quot;http://automation.binarysage.net/?p=1311&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;Тыкни&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;При получении ошибок на Unix-системах: Попробуйте добавить параметры порта и сокета в &lt;a href=&quot;https://wiki.multitheftauto.com/wiki/Modules/MTA-MySQL/mysql_connect&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;mysql_connect&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;Все мы установили наш сервер на MySQL.&lt;br /&gt;После запуска мы можем увидеть в консоли что-то типа этого:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;MODULE:Loaded Mysql ...&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Это совсем не важно, но кто будет писать мод с нуля, тому может быть это поможет.&lt;br /&gt;Создадим любой файл в папке с модом (именно в той где есть &lt;em class=&quot;bbuline&quot;&gt;meta.xml&lt;/em&gt;).&lt;br /&gt;Например &lt;em class=&quot;bbuline&quot;&gt;mysqlconnection.lua&lt;/em&gt;&lt;br /&gt;Запустим его и добавим вот это:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 15em&quot;&gt;&lt;pre&gt;SQL = mysql_connect(&amp;quot;127.0.0.1&amp;quot;, &amp;quot;root&amp;quot;, 123456, &amp;quot;YLRP&amp;quot;)
 
if (SQL) then
  outputDebugString(&amp;quot;Mysql Connection - True!&amp;quot;)
else 
  outputDebugString(&amp;quot;Mysql Connection - False!&amp;quot;)
  outputDebugString(&amp;quot;Check Your Mysql Connection on localhost!&amp;quot;)
end&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Таким образом мы можем узнать подключился наш мод к бд или нет.&lt;br /&gt;Где &lt;strong&gt;127.0.0.1&lt;/strong&gt; - это хост или что-то там, &lt;strong&gt;root&lt;/strong&gt; - это имя пользователя, &lt;strong&gt;123456&lt;/strong&gt;- это пароль, &lt;strong&gt;YLRP&lt;/strong&gt; - название базы данных&lt;/p&gt;
						&lt;p&gt;И так при запуске консоли мы можем узнать подключен или нет наш мод, если &lt;span style=&quot;color: green&quot;&gt;True&lt;/span&gt; - то да, &lt;span style=&quot;color: red&quot;&gt;False&lt;/span&gt; - нет.&lt;br /&gt;Вот и все, удачи и успехов в моддинге!&lt;br /&gt;P.S что мы подключили SQL - это значит, что можно юзать в любых других скриптах&amp;#160; :wink: &lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;display: block; text-align: right&quot;&gt;&lt;span style=&quot;font-size: 16px&quot;&gt;&lt;strong&gt;Автор урока: &lt;span style=&quot;color: blue&quot;&gt;SnoopDy&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Теги: MySQL&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Dominik48)</author>
			<pubDate>Fri, 16 Sep 2016 04:42:00 +0300</pubDate>
			<guid>http://mtadev.rusff.me/viewtopic.php?pid=9#p9</guid>
		</item>
		<item>
			<title>Набор в группу &quot;Модераторы&quot;.</title>
			<link>http://mtadev.rusff.me/viewtopic.php?pid=8#p8</link>
			<description>&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;span style=&quot;font-size: 18px&quot;&gt;&lt;strong&gt;Доброго времени суток гости и пользователи &lt;span style=&quot;color: red&quot;&gt;D&lt;/span&gt;evMTA&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;font-size: 14px&quot;&gt;&lt;strong&gt;Объявляется набор в группу &amp;quot;&lt;span style=&quot;color: green&quot;&gt;Модераторы&lt;/span&gt;&amp;quot;&lt;/p&gt;
						&lt;p&gt;Критерии:&lt;br /&gt; - Возраст 16+&lt;br /&gt; - Быть адекватным&lt;br /&gt; - Иметь познание в работе с форумом&lt;/p&gt;
						&lt;p&gt;Желающим писать мне в VK: &lt;a href=&quot;https://vk.com/slipro48&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;https://vk.com/r0masv&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Теги: Набор&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Dominik48)</author>
			<pubDate>Fri, 16 Sep 2016 04:06:45 +0300</pubDate>
			<guid>http://mtadev.rusff.me/viewtopic.php?pid=8#p8</guid>
		</item>
		<item>
			<title>[Урок] Замена объектов</title>
			<link>http://mtadev.rusff.me/viewtopic.php?pid=7#p7</link>
			<description>&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;http://s018.radikal.ru/i511/1209/89/ff4b3187f9dc.png&quot; alt=&quot;http://s018.radikal.ru/i511/1209/89/ff4b3187f9dc.png&quot; /&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Всем привет. Данный урок научит Вас заменять существующие объекты на новые.&lt;/p&gt;
						&lt;p&gt;Для начала нам понадобятся прямые руки, терпение, а так же какой-нибудь редактор (Notepad++, WordPad и тп.)&lt;/p&gt;
						&lt;p&gt;Начнем. Для примера я решил &lt;a href=&quot;http://libertycity.ru/files/gta-san-andreas/46261-the-lostmcs-pub.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;скачать клуб байкеров&lt;/span&gt;&lt;/a&gt; из GTA IV: TLaD. Далее нужно распаковать архив и вытащить &lt;em class=&quot;bbuline&quot;&gt;все файлы с расширением&lt;strong&gt; txd, dff, col&lt;/strong&gt;&lt;/em&gt;. С этими файлами мы и будем работать.&lt;/p&gt;
						&lt;p&gt;Рекомендую именно сейчас подобрать айди модели, на которую будет заменен наш клуб. Обычно заменяют на то, что в игре редко или вообще не используется (объекты из интерьеров и тп).&lt;/p&gt;
						&lt;p&gt;Создадим 2 папки под названием &lt;em class=&quot;bbuline&quot;&gt;&#039;models&#039;&lt;/em&gt; и &lt;em class=&quot;bbuline&quot;&gt;&#039;files&#039;&lt;/em&gt; (можно использовать свое название :D). Папка &lt;em class=&quot;bbuline&quot;&gt;&#039;files&#039;&lt;/em&gt; должна находиться в &lt;em class=&quot;bbuline&quot;&gt;&#039;models&#039;&lt;/em&gt;, в ней будет наше новое сооружение. Переместим все файлы (&lt;strong&gt;txd, dff, col&lt;/strong&gt;) в &#039;files&#039;. В &lt;em class=&quot;bbuline&quot;&gt;&#039;models&#039;&lt;/em&gt; поместим файл &lt;em class=&quot;bbuline&quot;&gt;&#039;client.lua&#039;&lt;/em&gt;, который тоже нужно создать. Теперь разберемся что будет в этом файле, написал небольшой пример скрипта:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 24em&quot;&gt;&lt;pre&gt;local ID = 2052 -- Айди объекта на который заменяется клуб 
  
addEventHandler ( &#039;onClientResourceStart&#039;, resourceRoot, -- При запуске ресурса подгружаем и заменяем модель 
    function ( ) 
        local txd = engineLoadTXD ( &#039;files/lostmc_f0natGTA.txd&#039; ) -- txd файл 
        engineImportTXD ( txd, ID ) -- заменяем текстуру 
  
        local dff = engineLoadDFF ( &#039;files/lostmcpub_f0natGTA.dff&#039;, 0 ) -- dff файл 
        engineReplaceModel ( dff, ID ) -- заменяем модель 
  
        local col = engineLoadCOL ( &#039;files/lostmc.col&#039; ) -- col файл 
        engineReplaceCOL ( col, ID ) -- заменяем коллизию модели 
    end 
)&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Этот &lt;strong&gt;lua&lt;/strong&gt; скрипт должен находится на клиенте и я надеюсь с ним все понятно. Остается создать &lt;em class=&quot;bbuline&quot;&gt;meta.xml&lt;/em&gt;, содержание будет примерно такое:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 15em&quot;&gt;&lt;pre&gt;&amp;lt;meta&amp;gt; 
    &amp;lt;info author=&#039;Zver-CR&#039; description=&#039;Tutorial | Adding custom objects&#039; version=&#039;1.0&#039; type=&#039;script&#039; /&amp;gt; 
    &amp;lt;script src=&#039;client.lua&#039; type=&#039;client&#039; /&amp;gt; 
  
    &amp;lt;file src=&#039;files/lostmc_f0natGTA.txd&#039; type=&#039;client&#039; /&amp;gt; 
    &amp;lt;file src=&#039;files/lostmcpub_f0natGTA.dff&#039; type=&#039;client&#039; /&amp;gt; 
    &amp;lt;file src=&#039;files/lostmc.col&#039; type=&#039;client&#039; /&amp;gt; 
&amp;lt;/meta&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Описание меты можно найти на официальной &lt;a href=&quot;https://wiki.multitheftauto.com/index.php?title=RU/Meta.xml&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;Wiki MTA&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
						&lt;p&gt;Ну вот мы и дошли до конца! Теперь только необходимо запустить ресурс, запустить Map Editor, найти в нем ID объекта на который заменили клуб, поставить на карту и сохранить в &lt;strong&gt;map&lt;/strong&gt; файл.&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;http://s018.radikal.ru/i508/1209/c0/21b7e03624ed.png&quot; alt=&quot;http://s018.radikal.ru/i508/1209/c0/21b7e03624ed.png&quot; /&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;display: block; text-align: right&quot;&gt;&lt;span style=&quot;font-size: 16px&quot;&gt;&lt;strong&gt;Автор урока: &lt;span style=&quot;color: red&quot;&gt;Sarrum&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (DeRamirez)</author>
			<pubDate>Fri, 16 Sep 2016 03:36:32 +0300</pubDate>
			<guid>http://mtadev.rusff.me/viewtopic.php?pid=7#p7</guid>
		</item>
		<item>
			<title>[Урок] Загрузка информации из базы данных MySQL.</title>
			<link>http://mtadev.rusff.me/viewtopic.php?pid=6#p6</link>
			<description>&lt;p&gt;&lt;strong&gt;Не так уж и много Русскоязычных уроков/мануалов о создании в MTA различных систем, в особенности на MySQL. Лично я ещё вчера искал на просторах интернета информацию о том, как загружать данные (например информацию о транспорте), но ничего нужного мне не нашел. Поэтому решил сам написать урок, в котором будет предоставлен пример банальной загрузки данных и создания транспорта.&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Задействована будет всего - лишь одна функция, которая будет расположена на серверной части ресурса.&lt;br /&gt;И так, создаем таблицу в которой будет информация о транспорте. Скриншот со структурой таблицы ниже.&lt;/p&gt;
						&lt;p&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;http://i008.radikal.ru/1602/e3/73ee52d2d989.png&quot; alt=&quot;http://i008.radikal.ru/1602/e3/73ee52d2d989.png&quot; /&gt;&lt;/p&gt;
						&lt;p&gt;Теперь переходим непосредственно к коду, в файле где у вас серверная часть пишем:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 35em&quot;&gt;&lt;pre&gt;local vehicle = {} //Эта переменная служит хранилищем всех данных о транспорте. 

addEventHandler(&amp;quot;onResourceStart&amp;quot;, getResourceRootElement(), function() //Функция, которая при загрузке ресурса (onResourceStart, будет следом загружать весь транспорт. 
    local time = getTickCount() //Переменная, которая понадобиться нам для того, чтобы узнать за сколько миллисекунд загрузился транспорт. 
    local result = mysql_query(database, &amp;quot;SELECT * FROM `cars`&amp;quot;) //Запрос на получение данных из таблицы с транспортом. 
    local count = 0 //Переменная, в которую записывается число загруженного транспорта. 
    if(result) then //Если запрос успешен - идём дальше. 
        while true do //Цикл 
            local row = mysql_fetch_assoc(result) 
            if not row then break end //Если нечего загружать - останавливаем цикл и дальнейшую загрузку. 
            local id = tonumber(row[&amp;quot;id&amp;quot;]) //Записываем в переменную &amp;quot;id&amp;quot;, номер (id) транспорта из базы данных. 
            local model = tonumber(row[&amp;quot;model&amp;quot;]) //Записываем в переменную модель транспорта 
            local x = tonumber(row[&amp;quot;x&amp;quot;]) //Записываем х координату 
            local y = tonumber(row[&amp;quot;y&amp;quot;]) //Записываем y координату 
            local z = tonumber(row[&amp;quot;z&amp;quot;]) //Записываем z координату 
            vehicle[id] = createVehicle (model, x, y, z) //Создаем сам транспорт на сервере. 
            //В коде ниже, мы не просто в локальную переменную, нужную только для загрузки записываем данные, а в переменную которая может работать во всем серверном скрипте. 
//Если сравнивать переменную (или еще можно назвать - таблицу) local vehicle = {} на Lua и Pawn, то в Pawn это можно представить примерно как new VehicleInfo[MAX_VEHICLES][data];, то вместо &amp;quot;data&amp;quot; будет использоваться название &amp;quot;ключа&amp;quot;, которое используется внутри функций setElementData, думаю понятно тут объяснил. 
            setElementData(vehicle[id], &amp;quot;vehicle:id&amp;quot;, id) 
            setElementData(vehicle[id], &amp;quot;vehicle:model&amp;quot;, model) 
            setElementData(vehicle[id], &amp;quot;vehicle:x&amp;quot;, x) 
            setElementData(vehicle[id], &amp;quot;vehicle:y&amp;quot;, y) 
            setElementData(vehicle[id], &amp;quot;vehicle:z&amp;quot;, z) 
            count = count + 1 //Прибавляем +1 к переменной которая хранит количество загруженного транспорта. 
        end 
        mysql_free_result(result) //Очищаем результат запроса 
    end 
    outputDebugString(&amp;quot;Cars: &amp;quot;..count..&amp;quot; | Time: &amp;quot;..(getTickCount() - time)..&amp;quot;ms&amp;quot;) //Выводим в консоль информацию о загруженном транспорте. 
end)&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;quote-box spoiler-box&quot;&gt;&lt;div onclick=&quot;$(this).toggleClass(&#039;visible&#039;); $(this).next().toggleClass(&#039;visible&#039;);&quot;&gt;Результат&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;http://s018.radikal.ru/i514/1602/56/fc93df2ecd01.png&quot; alt=&quot;http://s018.radikal.ru/i514/1602/56/fc93df2ecd01.png&quot; /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: right&quot;&gt;&lt;span style=&quot;font-size: 16px&quot;&gt;&lt;strong&gt;Автор урока: &lt;span style=&quot;color: blue&quot;&gt;Ray_Grand&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Теги: MySQL&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Dominik48)</author>
			<pubDate>Fri, 16 Sep 2016 00:33:44 +0300</pubDate>
			<guid>http://mtadev.rusff.me/viewtopic.php?pid=6#p6</guid>
		</item>
		<item>
			<title>[Урок] Простейшая регистрация на MySQL.</title>
			<link>http://mtadev.rusff.me/viewtopic.php?pid=5#p5</link>
			<description>&lt;p&gt;&lt;strong&gt;Доброго времени суток. Совсем недавно я принялся изучать язык программирования Lua и примерно за неделю, с трудом написал простенькую, но работоспособную регистрацию на плагине MySQL с примером загрузки информации игрока из базы данных. И так, приступим, постараюсь объяснить детально то, что самому известно.&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot;quote-box spoiler-box&quot;&gt;&lt;div onclick=&quot;$(this).toggleClass(&#039;visible&#039;); $(this).next().toggleClass(&#039;visible&#039;);&quot;&gt;Скриншот&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;http://s020.radikal.ru/i708/1602/3e/15c2d98d87b7.png&quot; alt=&quot;http://s020.radikal.ru/i708/1602/3e/15c2d98d87b7.png&quot; /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Вот что реализовано в системе:&lt;br /&gt;1. Регистрация и авторизация, в обоих случаях придётся вводить только лишь логин и пароль.&lt;br /&gt;2. Загрузка данных игрока из базы данных, я решил сделать последнюю позицию игрока, а так - же спавн по ней.&lt;br /&gt;3. Обновление последней позиции игрока и спавн по ней.&lt;br /&gt;4. Авторизация/регистрация проходит не по логину, который в клиенте у игрока, а по логину который введен в окне. (Например был ник &amp;quot;Player111&amp;quot;, а в базе данных был аккаунт с ником &amp;quot;Player222&amp;quot;, и если игрок &amp;quot;Player111&amp;quot; авторизовался под логином &amp;quot;Player222&amp;quot; то его логин сменится и он будет играть под введенным логином.&lt;/p&gt;
						&lt;p&gt;Подготовка к написанию самой системы:&lt;/strong&gt;&lt;br /&gt;Как установить плагин &lt;a href=&quot;http://wiki.multitheftauto.com/wiki/RU/Modules/MTA-MySQL&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;MySQL&lt;/span&gt;&lt;/a&gt; объяснять думаю не нужно, на &lt;a href=&quot;https://wiki.multitheftauto.com/wiki/Main_Page&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;Wiki MTA&lt;/span&gt;&lt;/a&gt; всё доходчиво объяснено.&lt;/p&gt;
						&lt;p&gt;После установки плагина, приступим к созданию таблицы в базе данных. Структура таблицы &amp;quot;players&amp;quot; для аккаунтов на скриншоте ниже:&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;http://s017.radikal.ru/i438/1602/3a/fae26c874184.png&quot; alt=&quot;http://s017.radikal.ru/i438/1602/3a/fae26c874184.png&quot; /&gt;&lt;/p&gt;
						&lt;p&gt;Сделали? Отлично, продолжим. Т.к регистрация и авторизация писалась полностью на чистом ресурсе. &lt;br /&gt;Tо идём в папку где находятся все ресурсы (MTA San Andreas 1.5\server\mods\deathmatch\resources) и создаем там новую папку, в которой будут находится наши файлы.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Приступаем к написанию самой системы.&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;В папке с нашим ресурсом создаем первый файл - &lt;em class=&quot;bbuline&quot;&gt;meta.xml&lt;/em&gt;, и добавляем туда следующие строки:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 9em&quot;&gt;&lt;pre&gt;&amp;lt;meta&amp;gt;
&amp;lt;script src=&amp;quot;server.lua&amp;quot; type=&amp;quot;server&amp;quot;/&amp;gt; //Серверная часть ресурса
&amp;lt;script src=&amp;quot;client.lua&amp;quot; type=&amp;quot;client&amp;quot;/&amp;gt; //Клиентская часть ресурса
&amp;lt;/meta&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Дальше мы создаем файл &lt;em class=&quot;bbuline&quot;&gt;client.lua&lt;/em&gt;, в котором будет написана клиентская часть ресурса, и в нём же сейчас пишем следующий код:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 13.5em&quot;&gt;&lt;pre&gt;//Первым делом создаем переменные, необходимые для создания GUI окна регистрации и авторизации.
local Window = {}
local TabPanel = {}
local Tab = {}
local Button = {}
local Edit = {}
local Label = {}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Сразу после переменных, переходим к созданию первой функции - создания GUI окна. После переменных добавляем:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 13.5em&quot;&gt;&lt;pre&gt;local function createGui()
//Тут скоро мы продолжим писать код.
end

addEventHandler(&amp;quot;onClientResourceStart&amp;quot;, getResourceRootElement(), function()
    createGui() //Создаем окно с авторизацией и регистрацией.
end)&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Теперь внутрь функции createGui, добавляем следующий код:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 35em&quot;&gt;&lt;pre&gt;//Создаем переменные, определяющие положение окна с регистрацией/авторизацией.
local sWidth, sHeight = guiGetScreenSize()
    local Width,Height = 370,219 
    local X = (sWidth/2) - (Width/2) 
    local Y = (sHeight/2) - (Height/2) 
    Window[1] = guiCreateWindow(X, Y, Width, Height, &amp;quot;Информационное окно&amp;quot;,false) //Создаем само окно, где будут расположены все элементы (текста, панели, кнопки и прочее)
    TabPanel[1] = guiCreateTabPanel(9,22,352,188,false, Window[1]) //Создаем TabPanel, на которой и будут расположены кнопки, с помощью которых можно будет переключаться между регистрацией и авторизацией.

//GUI элементы авторизации.
    Tab[1] = guiCreateTab(&amp;quot;Авторизация&amp;quot;, TabPanel[1])
    Edit[1] = guiCreateEdit(77,10,160,28,&amp;quot;&amp;quot;,false,Tab[1]) //Создаем поле для ввода логина.
guiEditSetMaxLength (Edit[1], 22) //Устанавливаем максимальную длину введенного в поле текста - 22 символа.
    Label[1] = guiCreateLabel(9,15,88,30,&amp;quot;Логин:&amp;quot;,false,Tab[1]) //Создаем текст левее поля для ввода логина.
        guiSetFont(Label[1],&amp;quot;default-bold-small&amp;quot;) //Устанавливаем шрифт для текста выше.
    Edit[2] = guiCreateEdit(77,45,160,28,&amp;quot;&amp;quot;,false,Tab[1]) //Создаем поле для ввода пароля.
guiEditSetMaxLength (Edit[2], 30) //Устанавливаем максимальную длину введенного в поле текста - 30 символа.
    Label[2] = guiCreateLabel(9,50,88,30,&amp;quot;Пароль:&amp;quot;,false,Tab[1]) //Создаем текст левее поля для ввода пароля.
    guiSetFont(Label[2],&amp;quot;default-bold-small&amp;quot;) //Устанавливаем шрифт для текста выше.
    Button[1] = guiCreateButton(97,80,112,29,&amp;quot;Авторизоваться&amp;quot;,false,Tab[1]) //После всех элементов выше, создаем кнопку.

//GUI элементы регистрации.
    Tab[2] = guiCreateTab(&amp;quot;Регистрация&amp;quot;,TabPanel[1])
    Edit[3] = guiCreateEdit(77,10,160,28,&amp;quot;&amp;quot;,false,Tab[2]) //Создаем поле для ввода логина.
guiEditSetMaxLength (Edit[3], 22) //Устанавливаем максимальную длину введенного в поле текста - 22 символа.
    Label[3] = guiCreateLabel(9,15,88,30,&amp;quot;Логин:&amp;quot;,false,Tab[2]) //Создаем текст левее поля для ввода логина.
    guiSetFont(Label[3],&amp;quot;default-bold-small&amp;quot;) //Устанавливаем шрифт для текста выше.
    Edit[4] = guiCreateEdit(77,45,160,28,&amp;quot;&amp;quot;,false,Tab[2]) //Создаем поле для ввода пароля.
guiEditSetMaxLength (Edit[4], 30) //Устанавливаем максимальную длину введенного в поле текста - 30 символа.
    Label[4] = guiCreateLabel(9,50,88,30,&amp;quot;Пароль:&amp;quot;,false,Tab[2]) //Создаем текст левее поля для ввода пароля.
    guiSetFont(Label[4],&amp;quot;default-bold-small&amp;quot;) //Устанавливаем шрифт для текста выше.
    Button[2] = guiCreateButton(92,80,130,29,&amp;quot;Зарегистрироваться&amp;quot;,false,Tab[2]) //Создаем кнопку.

    showCursor(true) //Показываем курсор.

    addEventHandler(&amp;quot;onClientGUIClick&amp;quot;, Button[1], function() //Событие, которое будет происходить при нажатии на кнопку авторизации.
        local text1, text2 = guiGetText(Edit[1]), guiGetText(Edit[2]) //Записываем в 2 переменные введенный текст в поля логина и пароля.
        if(text1 == &amp;quot;&amp;quot;) or (text2 == &amp;quot;&amp;quot;) then return end //Если поле для ввода логина или пароля пустое - то событие дальше не происходит.
        triggerServerEvent(&amp;quot;onPlayerLoginEx&amp;quot;, getLocalPlayer(), text1, text2) //Вызываем серверное событие с двумя параметрами - логин, пароль.
    end, false)

    addEventHandler(&amp;quot;onClientGUIClick&amp;quot;, Button[2], function() //Событие, которое будет происходить при нажатии на кнопку регистрации.
        local text1, text2 = guiGetText(Edit[3]), guiGetText(Edit[4])//Записываем в 2 переменные введенный текст в поля логина и пароля.
        if(text1 == &amp;quot;&amp;quot;) or (text2 == &amp;quot;&amp;quot;) then return end //Если поле для ввода логина или пароля пустое - то событие дальше не происходит.
        triggerServerEvent(&amp;quot;onPlayerRegisterEx&amp;quot;, getLocalPlayer(), text1, text2) //Вызываем серверное событие с двумя параметрами - логин, пароль.
    end, false)&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;После всего выше написанного, добавляем последнее в клиентскую часть:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 10.5em&quot;&gt;&lt;pre&gt;addEvent(&amp;quot;destroyGui&amp;quot;, true)
addEventHandler(&amp;quot;destroyGui&amp;quot;, getRootElement(), function() //Эта функция пригодится позже, после успешной авторизации или регистрации, для скрытия окна и курсора.
        destroyElement(Window[1]) //Удаляем окно с регистрацией и авторизацией.
        showCursor(false) //Скрываем курсор.
end)&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;С клиентской частью закончили. Теперь создаем &lt;em class=&quot;bbuline&quot;&gt;server.lua&lt;/em&gt; и добавляем туда следующий код:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;database = mysql_connect(&amp;quot;хостинг&amp;quot;, &amp;quot;пользователь&amp;quot;, &amp;quot;пароль&amp;quot;, &amp;quot;название базы данных&amp;quot;) //Переменная с подключением к базе данных, настраивайте сами под себя.&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;После соединения с базой данных, создадим функцию &lt;a href=&quot;https://wiki.multitheftauto.com/wiki/OnPlayerLogin&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;onPlayerLoginEx&lt;/span&gt;&lt;/a&gt;, которая будет срабатывать когда вы будете нажимать на кнопку авторизации. &lt;br /&gt;И внутри которой будут проходить все проверки на наличие аккаунта.&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 30em&quot;&gt;&lt;pre&gt;addEvent(&#039;onPlayerLoginEx&#039;, true)
addEventHandler(&amp;quot;onPlayerLoginEx&amp;quot;, getRootElement(), function(name, password) //Создаем функцию
    local result = mysql_query(database, &amp;quot;SELECT * FROM players WHERE Name = &#039;&amp;quot;..name..&amp;quot;&#039; AND Password = &#039;&amp;quot;..password..&amp;quot;&#039;;&amp;quot;) //Запрос на проверку наличие аккаунта, по введенным в клиентской части данным (Логин, пароль).
    if(result and mysql_num_rows(result) &amp;gt; 0) then //Если аккаунт такой существует, то идём дальше.
        triggerClientEvent(source, &amp;quot;destroyGui&amp;quot;, source) //Вызываем клиентскую функцию, которая удаляет окно и курсор с экрана.
        setPlayerName(source, name) //Устанавливаем игроку имя, введенное в окно логина.
        local row = mysql_fetch_assoc(result)
        setElementData(source, &amp;quot;posX&amp;quot;, (row[&#039;X&#039;])) //Из поля &#039;X&#039; в базе данных получаем значение и записываем его в ключ &amp;quot;posX&#039; на сервере.
        setElementData(source, &amp;quot;posY&amp;quot;, (row[&#039;Y&#039;])) //Из поля &#039;Y&#039; в базе данных получаем значение и записываем его в ключ &amp;quot;posY&#039; на сервере.
        setElementData(source, &amp;quot;posZ&amp;quot;, (row[&#039;Z&#039;])) //Из поля &#039;Z&#039; в базе данных получаем значение и записываем его в ключ &amp;quot;posZ&#039; на сервере.
        spawnPlayer(source, getElementData(source, &amp;quot;posX&amp;quot;), getElementData(source, &amp;quot;posY&amp;quot;), getElementData(source, &amp;quot;posZ&amp;quot;)) //Спавним игрока, по загруженным выше координатам.
        fadeCamera(source, true) //Чтобы не было черного экрана
        setCameraTarget(source, source) //Делаем так, чтобы камера игрока, следила за ним самим же.
        outputChatBox(&amp;quot;Вы успешно авторизировались на сервере!&amp;quot;, source, 0, 255, 0) //Приветственное сообщение.
    else
        outputChatBox(&amp;quot;Введенный вами пароль неверный, или аккаунт не существует.&amp;quot;, source, 255, 0, 0) //Если аккаунт с логином и паролем, введенным в окне авторизации отсутствует, то выводим сообщение, которое ниже.
   end
end)&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Осталась последняя функция - &lt;em class=&quot;bbuline&quot;&gt;onPlayerRegisterEx&lt;/em&gt;, которая наверное как Вы и догадались, срабатывает когда игрок жмет на кнопку &amp;quot;Зарегистрироваться&amp;quot;&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 34.5em&quot;&gt;&lt;pre&gt;addEvent(&amp;quot;onPlayerRegisterEx&amp;quot;, true)
addEventHandler(&amp;quot;onPlayerRegisterEx&amp;quot;, getRootElement(), function(name, password) //Функция регистрации аккаунта в базе данных.
    local result = mysql_query(database, &amp;quot;SELECT Name FROM players WHERE Name = &#039;&amp;quot;..tostring(name)..&amp;quot;&#039;;&amp;quot;) //Проверяем, если ли аккаунт с именем введенным в окне регистрации.
    if(result) then //Если запрос успешный, идём дальше.
        if(mysql_num_rows(result) &amp;gt; 0) then //Аккаунт уже есть с таким именем.
            outputChatBox(&amp;quot;Аккаунт с указанным вами логином уже зарегистрирован, используйте другой!&amp;quot;, source)
        else //Аккаунта с таким именем нет, идём дальше.
            result = mysql_query(database, &amp;quot;INSERT INTO players (Name, Password) VALUES (&#039;&amp;quot;..tostring(name)..&amp;quot;&#039;, &#039;&amp;quot;..tostring(password)..&amp;quot;&#039;);&amp;quot;) //Создаем аккаунт в базе данных с логином и паролем из окна регистрации.
            if(result) then //Если запрос успешный, идём дальше.
                triggerClientEvent(source, &amp;quot;destroyGui&amp;quot;, source) //Вызываем клиентское событие, которое удалит окно и курсор.
                setPlayerName(source, name) //Устанавливаем игроку имя, которое он ввел в окне регистрации.
                spawnPlayer(source, 1714.96875, -1913.5341796875, 13.566567420959) //Спавним игрока на вокзале Лос - Сантоса
                setCameraTarget(source, source) //Делаем так, чтобы камера игрока, следила за ним самим же.
                fadeCamera(source, true) //Чтобы не было черного экрана
                outputChatBox(&amp;quot;Вы успешно зарегистрировались на сервере!&amp;quot;, source, 0, 255, 0) //Приветствуем игрока
            else
                outputChatBox(&amp;quot;При регистрации аккаунта возникла ошибка.&amp;quot;, source, 255, 0, 0) //Отправляем это сообщение, если аккаунт почему - то не удалось зарегистрировать.
            end
        end
    end
end)&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Осталось лишь сделать обновление позиции игрока при выходе, в серверную часть добавляем:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 9em&quot;&gt;&lt;pre&gt;addEventHandler (&amp;quot;onPlayerQuit&amp;quot;, getRootElement(), function(quitType) //Событие происходящее при выходе игрока.
    local x, y, z = getElementPosition(source) //Получаем координаты игрока.
    mysql_query(database, &amp;quot;UPDATE players SET X = &#039;&amp;quot;..x..&amp;quot;&#039;, Y = &#039;&amp;quot;..y..&amp;quot;&#039;, Z = &#039;&amp;quot;..z..&amp;quot;&#039; WHERE Name = &#039;&amp;quot;..getPlayerName(source)..&amp;quot;&#039;;&amp;quot;) //Обновляем их в базе данных.
end)&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&quot;http://pastebin.com/e3asLg4r&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;pastebin (client.lua)&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://pastebin.com/uTCj7UAh&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;pastebin (server.lua)&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;display: block; text-align: right&quot;&gt;&lt;span style=&quot;font-size: 16px&quot;&gt;&lt;strong&gt;Автор урока:&lt;span style=&quot;color: blue&quot;&gt; Ray_Grand&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Теги: MySQL&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Dominik48)</author>
			<pubDate>Fri, 16 Sep 2016 00:26:26 +0300</pubDate>
			<guid>http://mtadev.rusff.me/viewtopic.php?pid=5#p5</guid>
		</item>
		<item>
			<title>[Урок] Встроенные функции для работы с MySQL / SQLite</title>
			<link>http://mtadev.rusff.me/viewtopic.php?pid=3#p3</link>
			<description>&lt;p&gt;Знаете что-нибудь о MySQL или SQLite? Если нет, &lt;a href=&quot;https://ru.wikipedia.org/wiki/SQLite&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;сходите&lt;/span&gt;&lt;/a&gt; и &lt;a href=&quot;https://ru.wikipedia.org/wiki/MySQL&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;почитайте&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
						&lt;p&gt;Все, кто в танке хотя бы раз пользовались базами данных (БД) для хранения каких-либо своих (или чужих) данных. MySQL - думаю, все знают и юзают, SQLite - реже, но тоже неплохой вариант. До недавнего времени приконектится к MySQL серверу можно было только с помощью серверного модуля, и создавать свои собственные SQLite базы данных (БД) в МТА было невозможно. Но благодаря самым активным разработчикам МТА, все эти неудобства ушли в историю. Теперь мы имеем встроенные функции для работы с MySQL / SQLite. О них и пойдет речь.&lt;/p&gt;
						&lt;p&gt;Для работы с БД нам нужны только эти функции:&lt;/p&gt;
						&lt;p&gt;&amp;#9679; &lt;a href=&quot;http://wiki.multitheftauto.com/wiki/dbConnect&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;dbConnect&lt;/span&gt;&lt;/a&gt; - приконектится к базе данных / открыть базу данных&lt;br /&gt;&amp;#9679; &lt;a href=&quot;http://wiki.multitheftauto.com/wiki/dbExec&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;dbExec&lt;/span&gt;&lt;/a&gt; - выполнить запрос без возврата результата&lt;br /&gt;&amp;#9679; &lt;a href=&quot;https://wiki.multitheftauto.com/wiki/DbQuery&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;dbQuery&lt;/span&gt;&lt;/a&gt; - выполнить запрос с возвратом результата&lt;br /&gt;&amp;#9679; &lt;a href=&quot;http://wiki.multitheftauto.com/wiki/dbPoll&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;dbPoll&lt;/span&gt;&lt;/a&gt; - получить результат запроса из памяти&lt;br /&gt;&amp;#9679; &lt;a href=&quot;http://wiki.multitheftauto.com/wiki/dbFree&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;dbFree&lt;/span&gt;&lt;/a&gt; - удалить результат запроса из памяти&lt;br /&gt;&amp;#9679; &lt;a href=&quot;https://wiki.multitheftauto.com/wiki/DestroyElement&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;destroyElement&lt;/span&gt;&lt;/a&gt; - закрыть соединение с базой данных / закрыть базу данных&lt;/p&gt;
						&lt;p&gt;Сразу даю небольшие разъяснения:&lt;/p&gt;
						&lt;p&gt;&amp;#9679; Ссылка (на соединение или БД), которую возвращает функция &lt;a href=&quot;http://wiki.multitheftauto.com/wiki/dbConnect&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;dbConnect&lt;/span&gt;&lt;/a&gt;(при успехе) - это элемент. Поэтому, чтобы закрыть соединение (закрыть БД) нужно юзать &lt;a href=&quot;http://wiki.multitheftauto.com/wiki/destroyElement&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;destroyElement&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;&amp;#9679; Ссылка, которую возвращает функция &lt;a href=&quot;https://wiki.multitheftauto.com/wiki/DbQuery&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;dbQuery&lt;/span&gt;&lt;/a&gt; (при успехе) - это не элемент, это просто уникальный ИД.&lt;br /&gt;&amp;#9679; Много открытий и закрытий БД (соединений) будут ощутимо тормозить ваш сервер, поэтому желательно открывать БД (соединение) при старте ресурса, а закрывать - при остановке ресурса. А саму ссылку на БД можно сохранить в глобальной переменной, например, тогда все скрипты ресурса смогут ее использовать.&lt;br /&gt;&amp;#9679; Если вы плохо знаете SQL синтаксис, сначала подучите его до уровня &amp;quot;выше среднего&amp;quot; во избежание глупых ошибок.&lt;/p&gt;
						&lt;p&gt;&lt;span style=&quot;font-size: 18px&quot;&gt;&lt;strong&gt;MySQL&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Чтобы быстро понять способы работы с этими функциями, начнем с примеров. &lt;br /&gt;Допустим, у нас рядом с сервером на том же хосте (локальный IP - 127.0.01) запущен MySQL сервер на 54321 порту. &lt;br /&gt;Имя юзера для доступа - testUser, пароль для этого юзера - testPassword, а имя БД - testDB.&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Коннектимся к MySQL серверу&lt;/strong&gt; ( &lt;a href=&quot;http://wiki.multitheftauto.com/wiki/dbConnect&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;dbConnect&lt;/span&gt;&lt;/a&gt; )&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 13.5em&quot;&gt;&lt;pre&gt;-- создаем глобальную переменную для хранения ссылки на коннект 
sqlLink = dbConnect ( 
    &amp;quot;mysql&amp;quot;, -- тип базы данных 
    &amp;quot;host=127.0.0.1;port=54321;dbname=testDB&amp;quot;, -- хост, порт, имя БД 
    &amp;quot;testUser&amp;quot;, -- юзер 
    &amp;quot;testPassword&amp;quot; -- пароль юзера 
)&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Выполняем запросы, результаты которых нам не нужны&lt;/strong&gt; ( &lt;a href=&quot;http://wiki.multitheftauto.com/wiki/dbExec&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;dbExec&lt;/span&gt;&lt;/a&gt; )&lt;br /&gt;Тексты запросов:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 6em&quot;&gt;&lt;pre&gt;CREATE TABLE IF NOT EXISTS testTable (  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,  name VARCHAR(32),  password VARCHAR(24),  money INT); 
INSERT INTO testTable ( name, password, money )  VALUES ( &#039;MX_Master&#039;, &#039;1245&#039;, 1500 );&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 33em&quot;&gt;&lt;pre&gt;-- создаем таблицу 
dbExec ( 
    sqlLink, -- ссылка на коннект с базой 
  
    -- запрос 
    -- [[ и ]] это просто кавычки (в языке LUA) для многострочных строк  
    [[CREATE TABLE IF NOT EXISTS ?? ( 
        ?? INT AUTO_INCREMENT PRIMARY KEY, 
        ?? VARCHAR(32), 
        ?? VARCHAR(24), 
        ?? INT );]], 
  
    -- параметры, которые будут подставлены в запрос вместо знаков &amp;quot;??&amp;quot;. 
    -- если юзать &amp;quot;?&amp;quot; вместо &amp;quot;??&amp;quot;, то все строки будут экранированы и с кавычками 
    &amp;quot;testTable&amp;quot;, -- заменяет первый знак &amp;quot;??&amp;quot; 
    &amp;quot;id&amp;quot;, -- заменяет второй знак &amp;quot;??&amp;quot; 
    &amp;quot;name&amp;quot;, -- заменяет третий знак &amp;quot;??&amp;quot; 
    &amp;quot;password&amp;quot;, -- заменяет четвертый знак &amp;quot;??&amp;quot; 
    &amp;quot;money&amp;quot; -- заменяет пятый знак &amp;quot;??&amp;quot; 
)&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 22.5em&quot;&gt;&lt;pre&gt;-- добавляем одну запись 
dbExec ( 
    sqlLink, -- ссылка на коннект с базой 
  
    -- запрос 
    [[INSERT INTO testTable ( name, password, money ) 
          VALUES ( ?, ?, ? );]], 
  
    -- параметры, которые будут подставлены в запрос вместо знаков &amp;quot;?&amp;quot; 
    &amp;quot;MX_Master&amp;quot;, 
    &amp;quot;1245&amp;quot;, 
    1500 
)&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Сделаем запрос, результат которого нам пригодится&lt;/strong&gt; ( &lt;a href=&quot;https://wiki.multitheftauto.com/wiki/DbQuery&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;dbQuery&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;http://wiki.multitheftauto.com/wiki/dbPoll&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;dbPoll&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;http://wiki.multitheftauto.com/wiki/dbFree&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;dbFree&lt;/span&gt;&lt;/a&gt; )&lt;br /&gt;Будем юзать колбэк функцию, которая должна сама выполнится когда результат запроса будет готов.&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 35em&quot;&gt;&lt;pre&gt;-- делаем выборку 
dbQuery ( 
    -- это одноразовая функция, которая вызовется, когда выполнится запрос 
    function ( queryHandle ) -- queryHandle это уникальный ИД результата запроса 
        -- получим результат запроса 
        local resultTable, num, err = dbPoll( queryHandle, 0 ) 
  
        -- проверим результат 
        if resultTable then 
            outputChatBox(&#039;Запрос выполнен:&#039;) 
  
            for rowNum, rowData in ipairs(resultTable) do 
                outputChatBox( &#039;  запись &#039;..rowNum..&#039;: &#039;..rowData[&#039;id&#039;]..&#039;, &#039;..rowData[&#039;name&#039;]..&#039;, &#039;..rowData[&#039;password&#039;]..&#039;&#039;..rowData[&#039;money&#039;]) 
            end 
        elseif resultTable == nil then 
            outputChatBox(&#039;Запрос еще не выполнен.&#039;) 
            dbFree(queryHandle) -- очистим память от результата 
        elseif resultTable == false then 
            -- num в данном случае код ошибки, а err это описание ошибки 
            outputChatBox(&#039;Ошибка в запросе, код &#039;..num..&#039;: &#039;..err) 
        end 
    end, 
  
    sqlLink, -- ссылка на коннект с базой 
  
    -- запрос 
    &amp;quot;SELECT * FROM testTable;&amp;quot; 
)&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Если все правильно, то результат будет примерно такой:&lt;/p&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;Запрос выполнен:&amp;#160; запись 1: 1, MX_Master, 1245, 1500&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Закроем соединение&lt;/strong&gt; ( &lt;a href=&quot;https://wiki.multitheftauto.com/wiki/DestroyElement&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;destroyElement&lt;/span&gt;&lt;/a&gt;)&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;destroyElement( sqlLink )&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 18px&quot;&gt;&lt;strong&gt;SQLite&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Для SQLite многое аналогично MySQL, но открывать БД нужно слегка иначе. &lt;br /&gt;Вместо хоста нужно указывать путь к файлу БД. Если путь начинается с &amp;quot;:/&amp;quot; (например &amp;quot;:/public.db&amp;quot;), то файл БД будет открыт/создан в общей папке сервера для SQLite БДшек. &lt;br /&gt;Если путь начинается с &amp;quot;:ИМЯ_РЕСУРСА/&amp;quot; (например &amp;quot;:play/test.db&amp;quot;), то файл БД будет открыт/создан в папке указанного ресурса. &lt;br /&gt;В остальных случаях файл БД будет открыт/создан в папке текущего ресурса, в котором выполняется скрипт.&lt;br /&gt;&lt;em class=&quot;bbuline&quot;&gt;Заметка&lt;/em&gt;: если файл БД не существует, то он будет создан.&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;Открываем файл БД&lt;/strong&gt; ( &lt;a href=&quot;http://wiki.multitheftauto.com/wiki/dbConnect&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;dbConnect&lt;/span&gt;&lt;/a&gt; )&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 10.5em&quot;&gt;&lt;pre&gt;-- создаем глобальную переменную для хранения ссылки на коннект 
sqlLink = dbConnect ( 
    &amp;quot;sqlite&amp;quot;, -- тип базы данных 
    &amp;quot;test.db&amp;quot; -- путь к файлу БД 
)&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Выполняем запросы, результаты которых нам не нужны&lt;/strong&gt; ( &lt;a href=&quot;http://wiki.multitheftauto.com/wiki/dbExec&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;dbExec&lt;/span&gt;&lt;/a&gt; )&lt;br /&gt;Тексты запросов:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 6em&quot;&gt;&lt;pre&gt;CREATE TABLE IF NOT EXISTS testTable (  id INTEGER AUTOINCREMENT PRIMARY KEY,  name TEXT,  password TEXT,  money INTEGER); 
INSERT INTO testTable ( name, password, money )  VALUES ( &#039;MX_Master&#039;, &#039;1245&#039;, 1500 );&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 21em&quot;&gt;&lt;pre&gt;-- создаем таблицу 
dbExec ( 
    sqlLink, -- ссылка на коннект с базой 
  
    -- запрос 
    -- [[ и ]] это просто кавычки (в языке LUA) для многострочных строк  
    [[CREATE TABLE IF NOT EXISTS testTable ( 
        id INTEGER AUTOINCREMENT PRIMARY KEY, 
        name TEXT, 
        password TEXT, 
        money INTEGER );]] 
)&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 15em&quot;&gt;&lt;pre&gt;-- добавляем одну запись 
dbExec ( 
    sqlLink, -- ссылка на коннект с базой 
  
    -- запрос 
    [[INSERT INTO testTable ( name, password, money ) 
          VALUES ( &#039;MX_Master&#039;, &#039;1245&#039;, 1500 );]] 
)&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Чтобы не повторяться в этот раз сделаем запрос и обойдемся без колбэк функции&lt;/strong&gt; ( &lt;a href=&quot;https://wiki.multitheftauto.com/wiki/DbQuery&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;dbQuery&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;http://wiki.multitheftauto.com/wiki/dbPoll&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;dbPoll&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;http://wiki.multitheftauto.com/wiki/dbFree&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;dbFree&lt;/span&gt;&lt;/a&gt; )&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 35em&quot;&gt;&lt;pre&gt;local queryHandle = dbQuery( 
    sqlLink, -- ссылка на коннект с базой 
  
    -- запрос 
    &amp;quot;SELECT * FROM testTable;&amp;quot; 
) 
  
-- ждем результата (сервер в это время простаивает) 
local resultTable, num, err = dbPoll ( queryHandle, -1 ) 
  
-- проверим результат 
if resultTable then 
    outputChatBox(&#039;Запрос выполнен:&#039;) 
     
    for rowNum, rowData in ipairs(resultTable) do 
        outputChatBox( &#039;  запись &#039;..rowNum..&#039;: &#039;..rowData[&#039;id&#039;]..&#039;, &#039;..rowData[&#039;name&#039;]..&#039;, &#039;..rowData[&#039;password&#039;]..&#039;&#039;..rowData[&#039;money&#039;]) 
    end 
elseif resultTable == nil then 
    outputChatBox(&#039;Запрос еще не выполнен.&#039;) 
    dbFree(queryHandle) -- очистим память от результата 
elseif resultTable == false then 
    -- num в данном случае код ошибки, а err это описание ошибки 
    outputChatBox(&#039;Ошибка в запросе, код &#039;..num..&#039;: &#039;..err) 
end&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Если все правильно, то результат будет примерно такой:&lt;/p&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;Запрос выполнен:&amp;#160; запись 1: 1, MX_Master, 1245, 1500&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Закроем соединение&lt;/strong&gt; ( &lt;a href=&quot;https://wiki.multitheftauto.com/wiki/DestroyElement&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;color: blue&quot;&gt;destroyElement&lt;/span&gt;&lt;/a&gt;)&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 4.5em&quot;&gt;&lt;pre&gt;destroyElement( sqlLink )&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;display: block; text-align: right&quot;&gt;&lt;span style=&quot;font-size: 16px&quot;&gt;&lt;strong&gt;Автор урока: &lt;span style=&quot;color: red&quot;&gt;MX_Master&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;Теги: MySQL,SQLite,Встроенные функции&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Dominik48)</author>
			<pubDate>Thu, 15 Sep 2016 18:21:17 +0300</pubDate>
			<guid>http://mtadev.rusff.me/viewtopic.php?pid=3#p3</guid>
		</item>
		<item>
			<title>Правила публикации тем в разделе &quot;Уроки/Мануалы&quot;</title>
			<link>http://mtadev.rusff.me/viewtopic.php?pid=2#p2</link>
			<description>&lt;p&gt;&lt;span style=&quot;display: block; text-align: center&quot;&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px&quot;&gt;Привет всем пользователям и гостям портала MTA &lt;span style=&quot;color: red&quot;&gt;D&lt;/span&gt;ev&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;Прежде чем создавать тему в данном разделе, рекомендую прочитать данный свод правил.&lt;br /&gt;&lt;span style=&quot;color: red&quot;&gt;!!!&lt;/span&gt; Не соблюдение нижеприведенных правил может привести к удалению вашей темы.&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 14px&quot;&gt;&lt;span style=&quot;color: red&quot;&gt;1.&lt;/span&gt; Название темы&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;1.1. В названии темы не должно содержаться нецензурных/оскорбительных слов.&lt;br /&gt;1.2. Название темы не должно нести в себе рекламный смысл. Для этого есть специальный раздел.&lt;br /&gt;1.3. Название не должно состоять из одних цифр или одних заглавных букв.&lt;br /&gt;1.4. Название темы должно полностью соответствовать ее содержанию.&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 14px&quot;&gt;&lt;span style=&quot;color: red&quot;&gt;2.&lt;/span&gt; Содержание темы&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;2.1. В содержании темы не должно содержаться нецензурных/оскорбительных слов.&lt;br /&gt;2.2. Содержание темы не должно нести в себе рекламный смысл. Для этого есть специальный раздел.&lt;br /&gt;2.3. Если ваш урок посвящён функции, обязательно предоставляйте не менее 2-3х примеров кода.&lt;br /&gt;2.4. Если ваш исходный код, более 10 строк, обязательно используйте спойлер.&lt;br /&gt;2.5. Обязательно предоставляйте код в &lt;span style=&quot;color: lime&quot;&gt;meta.xml&lt;/span&gt;, если ваш урок/мануал посвящён каким-либо действиям, предоставленном в полном ресурсе. &lt;br /&gt;2.6. Если вы не являетесь автором разработки, то обязательно укажите его. Иначе тема будет удалена.&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: red&quot;&gt;!!!&lt;/span&gt; Не знание вышеприведенных правил не освобождает от отвественности.&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;Теги: Правила,Уроки,Мануалы&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Dominik48)</author>
			<pubDate>Thu, 15 Sep 2016 17:22:44 +0300</pubDate>
			<guid>http://mtadev.rusff.me/viewtopic.php?pid=2#p2</guid>
		</item>
	</channel>
</rss>
