<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[toribash.ru &mdash; [rb] Lua]]></title>
	<link rel="self" href="https://toribash.ru/extern.php?action=feed&amp;tid=20957&amp;type=atom" />
	<updated>2012-08-03T18:10:24Z</updated>
	<generator>PunBB</generator>
	<id>https://toribash.ru/viewtopic.php?id=20957</id>
		<entry>
			<title type="html"><![CDATA[Re: [rb] Lua]]></title>
			<link rel="alternate" href="https://toribash.ru/viewtopic.php?pid=390414#p390414" />
			<content type="html"><![CDATA[<p>Ахренено понятный гайд , спасиба +1</p>]]></content>
			<author>
				<name><![CDATA[SPLLINTER2]]></name>
				<uri>https://toribash.ru/profile.php?id=1789</uri>
			</author>
			<updated>2012-08-03T18:10:24Z</updated>
			<id>https://toribash.ru/viewtopic.php?pid=390414#p390414</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: [rb] Lua]]></title>
			<link rel="alternate" href="https://toribash.ru/viewtopic.php?pid=388379#p388379" />
			<content type="html"><![CDATA[<p>Сколько букаф :s</p>]]></content>
			<author>
				<name><![CDATA[ThorTik]]></name>
				<uri>https://toribash.ru/profile.php?id=175</uri>
			</author>
			<updated>2012-07-17T05:28:47Z</updated>
			<id>https://toribash.ru/viewtopic.php?pid=388379#p388379</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[[rb] Lua]]></title>
			<link rel="alternate" href="https://toribash.ru/viewtopic.php?pid=388374#p388374" />
			<content type="html"><![CDATA[<p>[color=#aaaaaa]Репост с Rubash, оригинальный тред: <a href="http://forum.toribash.com/showthread.php?t=296427">http://forum.toribash.com/showthread.php?t=296427</a>[/color]<br />[b]<br />Из этого гайда ты узнаешь, как делать скрипты в Toribash&#039;е, используя Lua.[/b]</p><p>[center][b]Часть первая.[/b]<br />Основы.[/center]<br />[b]<br />В первой части данного туториала мы начнём с самого простого - как начать делать скрипты, строки, номера, таблицы и циклы.[/b]<br />Итак, давай приступим к работе. Но перед тем, как написать свой первый скрипт для торибаша, тебе понадобится Notepad++ (или другой текстовый редактор) и Toribash (разумеется).</p><p>[b][center]Здравствуй, мир![/center][/b]</p><p>Твоей основой будет фраза &quot;hello world!&quot;:<br /></p><div class="codebox"><pre><code>echo(&quot;hello world!&quot;)</code></pre></div><p>Сохраните получившуюся команду в файл &quot;helloworld.lua&quot; (и поместите этот файл в toribash/data/scripts/)<br />Теперь откройте торибаш и идите в Setup -&gt; Utils -&gt; Scripts =&gt; выберите &quot;helloworld.lua&quot; и нажмите &quot;load&quot;.<br />Как только ты запустишь скрипт, в строке чата появится фраза &quot;hello world!&quot; темно-красного цвета. Это и есть функция [b]echo[/b]. Её можно использовать не просто для подобного выведения текста в чатбокс, но для отладки скрипта в целом. Также ты сможешь проинформировать игроков, которые будут в будущем использовать данный скрипт, о том, что он сделан тобой, путём вставки копирайта.</p><br /><p>[b]Теперь об этом же, но более продвинуто:[/b]<br />Вернись в свой helloworld.lua скрипт в notepad++ и вставь в него это:<br /></p><div class="codebox"><pre><code>Message1 = &quot;Hello&quot;
Message2 = &quot;world&quot;
Message3 = &quot;!&quot;
echo(Message1 .. &quot; &quot; .. Message2 .. Message3)</code></pre></div><p>Так что же это такое?<br /></p><div class="codebox"><pre><code>Message1 = &quot;Hello&quot;</code></pre></div><p>Вот так вы объявляете переменную в Lua. Переменные хранят информацию, такую как числа или текст.<br /></p><div class="codebox"><pre><code>Message2 = &quot;world&quot;
Message3 = &quot;!&quot;</code></pre></div><p>Message1, Message2 и Messge3 сейчас содержат текст который нужен для вывода фразы &quot;Hello world!&quot; через echo. Но как мы соединим три сообщения в одну фразу?<br /></p><div class="codebox"><pre><code>echo(Message1 .. &quot; &quot; .. Message2 .. Message3)</code></pre></div><p>Знак &quot;..&quot; в lua обозначает объединение. То, что мы получаем в данном скрипте, называется конкатенацией - это когда ты складываешь несколько строк рядом; поэтому мы поставили после Message1 (&quot;Hello&quot;) пробел (&quot; &quot;), а затем Message2 (&quot;world&quot;) и Message3 (&quot;!&quot;), чтобы в итоге получить фразу &quot;Hello world!&quot;.</p><br /><p>[center][b]Цифры[/b][/center]<br />[center][/center]<br />Цифры в Lua объявляются в точности так же, как строки. Давайте мы поменяем в предыдущем скрипте слова на числа и получим примерно вот </p><div class="codebox"><pre><code>Message1 = 45.23
Message2 = 2312.3
echo(Message1 .. &quot;+&quot; .. Message2 .. &quot;=&quot; .. (Message2 + Message1))</code></pre></div><p>В игре это будет выглядеть вот так<br /></p><div class="codebox"><pre><code>45.23+2312.3=2357.53</code></pre></div><p>Я думаю, что тут всё достаточно просто выглядит. Message1, имеющий значение &quot;45.23&quot; контактирует с &quot;+&quot; и Message2 со значением &quot;2312.3&quot; и скрипт выводит сумму этих двух чисел.</p><br /><p>[b][center]Таблицы и циклы[/center][/b]</p><div class="codebox"><pre><code>Message = { }
Message[1] = &quot;Word&quot;
Message[2] = 23.232
Message[3] = &quot;This is a sentence.&quot;
Message[4] = &quot;:D 2323424&quot; .. 23.232 .. &quot;!&quot;
Echo = &quot;Message: &quot;
for i = 1,#Message do
Echo = Echo .. Message[i]
end
echo(Echo)</code></pre></div><p>Давайте я объясню, что за скрипт вы видите выше.<br /></p><div class="codebox"><pre><code>Message = { }</code></pre></div><p>Эта строка объявляет новую таблицу. Таблицы (или массивы) - это группы из переменных. Они могут содержать какой-либо тип переменных, даже функции.<br /></p><div class="codebox"><pre><code>Message[1] = &quot;Word&quot;</code></pre></div><p>Это делает первую переменную в сообщении: &quot;Word&quot;.<br /></p><div class="codebox"><pre><code>for i = 1,#Message do</code></pre></div><p>Этот цикл будет идти от 1 (первая переменная в сообщении) до итоговой цифры переменных в сообщении (#Таблицы получают итоговую сумму цифр переменных).</p><p>Этот цикл будет повторяться четыре раза (так как в данном случае здесь четыре переменных в сообщении) и каждый раз цифра &quot;i&quot; будет увеличиваться на 1.<br /></p><div class="codebox"><pre><code>Echo = Echo .. &quot; &quot; .. Message[i]</code></pre></div><p>Эта строка объединяет соответствующие сообщения на конец строки &quot;echo&quot;<br />При запуске этого скрипта в игре в чат-боксе появится следующее сообщение<br /></p><div class="codebox"><pre><code>Message: Word23.232This is a sentence.:D 232342423.232!</code></pre></div><br /><p>[center][b]Часть вторая.[/b]<br />Условные операторы и функции.[/center]</p><p>Окей, во второй части этого гайда я расскажу вам про условных операторов, некоторые связанные с Toribash&#039;ем функции, и про то, как сделать свою функцию.<br />Пройдя эту часть гайда, мы сможем написать скрипт, выводящий имя победителя в текущем бою.</p><br /><p>[b][center]Условные операторы[/center][/b]</p><p>Условные операторы - это один из самых важных аспектов любого скрипта. Они позволяют вызывать функции тогда, когда ты хочешь, например:<br /></p><div class="codebox"><pre><code>a = 1
b = 2
if(a+b == 3) then
echo(&quot;a + b == 3 :O&quot;)
else
echo(&quot;a + b ~= 3&quot;)
end</code></pre></div><p>Есть три основные части условного оператора: if, then и else. В этом примере условное выражение это &quot;a+b == 3&quot;. Если вы используете только один знак равенства, то появится ошибка, так как программа, в которой вы будете запускать скрипт (Toribash) посчитает, что вы пытаетесь установить переменную. Именно поэтому знаков равенства должно быть два.<br />Вот список всех операторов, которые ты можешь использовать:<br /></p><div class="codebox"><pre><code>== Равно
~= Не равно
&gt; Больше
&lt; Меньше
&gt;= Больше или равно
&lt;= Меньше или равно</code></pre></div><p>Для примера давайте рассмотрим небольшой скрипт с использованием оператора &quot;&gt;=&quot;:<br /></p><div class="codebox"><pre><code>a = 2
b = 2
if(a &gt;= b) then
echo(&quot;a is greater than or equal to b&quot;)
else
echo(&quot;a is less than b&quot;)
end</code></pre></div><p>Вот, по сути тут нет ничего сложного!</p><p>[b][center]<br />Функции, связанные с Toribash[/center][/b]</p><p>Есть достаточно много функций, связанных с Toribash, которые мы можем вызвать в lua.<br />Для примера давайте возьмем ситуацию, когда мы хотим увидеть, у какого игрока больше очков в конце боя. Мы сравним счета двух игроков и узнаем, у кого больше очков, с помощью следующего скрипта:<br /></p><div class="codebox"><pre><code>Player1_Score = get_player_info(1).injury
Player2_Score = get_player_info(0).injury
if(Player1_Score &gt; Player2_Score) then
echo(&quot;Player 1 is winning!&quot;)
elseif(Player2_Score &gt; Player1_Score) then
echo(&quot;Player 2 is winning!&quot;)
else
echo(&quot;Draw!&quot;)
end</code></pre></div><p>Когда ты запустишь этот скрипт, он покажет, у какого из игроков в данный момент больше очков. Довольно прикольно, да?<br />Вы можете увидеть список некоторых встроенных функций в Toribash в папке /data/scripts/sdk/</p><br /><p>[center][b]Создание своих функций<br />[/b][/center]<br />Создание своих собственных функций - это жизненно необходимая часть lua, она позволяет повторно использовать код быстро и эффективно.<br />Например, если мы хотим создать функцию, которая будет показывать, кто побеждает:<br /></p><div class="codebox"><pre><code>function winning()
Player1_Score = get_player_info(1).injury
Player2_Score = get_player_info(0).injury
if(Player1_Score &gt; Player2_Score) then
return &quot;Player 1&quot;
elseif(Player2_Score &gt; Player1_Score) then
return &quot;Player 2&quot;
else
return &quot;Draw!&quot;
end
end

echo(&quot;Winning: ^06&quot; .. winning())</code></pre></div><p>Теперь каждый раз, когда ты запускаешь этот скрипт, тебе в чат будет выкидывать сообщение &quot;Winning: ...&quot; (вместо &quot;...&quot; будет писаться номер игрока (1 - Тори, 2 - Юки) или &quot;Draw!&quot; в цвете с номером 06 (розовый).</p><p>Итак, мы создали нужный нам скрипт, и на этом данная часть гайда заканчивается.</p><br /><br /><p>[center][b]Часть третья.[/b]<br />Хуки и отладка.[/center]</p><p>В данной статье я буду рассказывать про хуки и отладку скриптов.<br />После прочтения этого туториала ты будешь уметь:</p><p>&nbsp; &nbsp;- Делать скрипт, который показывает, кто из игроков лидирует по очкам и &quot;замораживает&quot; каждого игрока.<br />&nbsp; &nbsp;- Устранять неполадки в твоих скриптах.</p><p>[b][center]Хуки[/center][/b]</p><p>Хук (hook) является еще одним важным аспектом lua. Он позволяют выполнять определенные функции в определенное время.<br />Хук выглядит примерно вот так:<br /></p><div class="codebox"><pre><code>add_hook(&quot;hook name&quot;,&quot;hook description&quot;, functiontocall)</code></pre></div><p>Так что они могут сделать? Хуки могут позволить тебе нарисовать текст на экране или писать кто выигрывает каждые (к примеру) 50 фреймов.<br />Ты можешь найти лист хуков в файле startup.lua (который находится в папке data/script/) в таблице events, но сейчас мы будем использовать хук под названием &quot;enter_freeze&quot;.<br />Давайте используем скрипт, который остался с предыдущего туториала; из него мы можем довольно легко сделать скрипт, который будет повторять текущего лидера.<br /></p><div class="codebox"><pre><code>function winning()
Player1_Score = get_player_info(1).injury
Player2_Score = get_player_info(0).injury
if(Player1_Score &gt; Player2_Score) then
return &quot;Player 1&quot;
elseif(Player2_Score &gt; Player1_Score) then
return &quot;Player 2&quot;
else
return &quot;Draw!&quot;
end
end

echo(&quot;Winning: ^06&quot; .. winning())</code></pre></div><p>Так, это наш код. Для того, чтобы называть лидера каждый раз, мы должны немного изменить этот код. Прежде всего мы создадим функцию которая называет его (лидера), проще говоря echo(“Winning… и посмотрим что получилось:<br /></p><div class="codebox"><pre><code>function winning()
Player1_Score = get_player_info(1).injury
Player2_Score = get_player_info(0).injury
if(Player1_Score &gt; Player2_Score) then
return &quot;Player 1&quot;
elseif(Player2_Score &gt; Player1_Score) then
return &quot;Player 2&quot;
else
return &quot;Draw!&quot;
end
end

function enter_frame()
echo(&quot;Winning: ^06&quot; .. winning())
end</code></pre></div><p>Далее нам нужно добавить хук, чтобы наши функции работали. Сделать это можно добавив следующую строку в нижнию часть скрипта:<br /></p><div class="codebox"><pre><code>add_hook(&quot;enter_freeze&quot;,&quot;echowinner&quot;,enter_frame)</code></pre></div><p>Немного больше о хуках вы узнаете в четвертой части гайда.</p><p>[b][center]Отладка<br />[/center][/b]<br />Если ты экспериментировал со скриптами, что-то пошло неправильно и ты не смог все починить - значит это все из-за того, что Toribash считает, что ты допустил ошибку в коде. Так как Toribash не показывает, где и на какой строке находится ошибка, есть специальный файл под названием &quot;stderr.txt&quot;.<br />Если ваш скрипт выдаёт ошибку или работает не должным образом, тебе необходимо проверить файл stderr.txt чтобы увидеть, какие ошибки есть в скрипте. Вот пример распространенной ошибки:<br /></p><div class="codebox"><pre><code>Lua script error in file errorscript.lua: data/script/errorscript.lua:2: attempt to index global ‘a’ (a nil value)</code></pre></div><p>Давайте рассмотрим это. Прежде всего этот текст говорит нам, что в lua скрипте допущена ошибка. В нашем случае эта часть нам не важна, но будет незаменима, когда мы будем запускать сразу несколько скриптов. Далее нам говорят, где находится скрипт, ошибочная строка (в данном случае 2) и говорят описание ошибки. В нашем случае ошибка расшифровывается так: она говорит что таблица создана не должным образом, то есть нужно чтобы было &quot;a = { }&quot; а у нас, видимо, не так (в данном случае &quot;a=&quot; это переменная а &quot;{}&quot; таблица).</p><p>Прочие возможные ошибки:</p><p>&nbsp; &nbsp; </p><div class="codebox"><pre><code>Lua script error in file errorscript.lua: data/script/errorscript.lua:3: ‘}’ expected (to close ‘(‘ at line 2) near ‘echo’</code></pre></div><p>&nbsp; &nbsp; Ты закрыл не все скобки правильно.<br />&nbsp; &nbsp; </p><div class="codebox"><pre><code>Lua script error in file errorscript.lua: data/script/errorscript.lua:2: attempt to perform arithmetic on global ‘b’ (a nil value)</code></pre></div><p>&nbsp; &nbsp; Значение &#039;b&#039; было не определено.</p><br /><p>На этом третья часть этого гайда кончается.</p><br /><br /><p>[center][b]Часть четвертая.[/b]<br />Рисование.[/center]</p><p>В четвертой, последней части этого гайда я расскажу тебе, как рисовать в 2D и 3D.<br />Пройдя её, ты сможешь:</p><p>&nbsp; -&nbsp; Рисовать текст с динамическим размером и задним фоном.<br />&nbsp; -&nbsp; Рисовать шарики.<br />[b][center]<br />Рисование в 2D[/center][/b]</p><p>Все рисование в lua происходит благодоря хукам, с которыми мы познакомились в третьей части. Чтобы рисовать в 2D, тебе нужно использовать хук draw2d, а для рисования в 3D тебе нужно использовать хук draw3d.<br />Для начала, давайте рассмотрим рисование в двух измерениях.<br /></p><div class="codebox"><pre><code>add_hook(&quot;draw2d&quot;,&quot;draw&quot;, draw2dfunc)</code></pre></div><p>Это - хук draw2d. Давайте теперь рассмотрим основные его функции.<br /></p><div class="codebox"><pre><code>set_color(r,g,b,a)</code></pre></div><p>Для рисования чего-либо ты должен выбрать цвет. В данном случае используется система RGB с альфа каналом, то есть r = красный цвет, g = зеленый, b = синий и a = прозрачный. Номера должны находиться в диапазоне от 0-1. (0,0,0,1) для черного и (1,1,1,0.5) для белого цвета.<br /></p><div class="codebox"><pre><code>draw_quad(x,y,w,h,texture)</code></pre></div><p>Теперь попробуем нарисовать прямоугольник в Lua. х = координата x (ось абсцисс), у = у-координата (ось ординат), W = ширина, Н = высота. Также там имеется опция текстуры, но её рассматривать мы не будем.<br /></p><div class="codebox"><pre><code>draw_disk(x, y, inner, outer, slices, loops, start, sweep, blend)</code></pre></div><p>Это - код многоугольника. Значение inner обозначает расстояние с внутреннего радиуса, outer - расстояние с внешнего радиуса, slices - количество углов (3 - треугольник, 4 - четырехугольник).<br /></p><div class="codebox"><pre><code>draw_text(text,x,y,font)</code></pre></div><p>Это - код рисования текста. Значение text обозначает текст, который будет нарисован. Шрифт выбирается цифрами от 0 до 5.</p><br /><p>[b]Важная заметка:[/b]<br />Координаты (0,0) обозначают, что текст находится в верхнем левом углу, и чем выше значение &quot;х&quot;, тем правее ты рисуеешь, а чем больше &quot;у&quot; значение, тем ниже ты рисуешь.</p><p>Итак, давайте начнем рисовать наш первый прямоугольник!<br /></p><div class="codebox"><pre><code>function draw2dfunc()
set_color(0,0,0,1)
draw_quad(10,300,100,200)
end
add_hook(&quot;draw2d&quot;,&quot;draw&quot;, draw2dfunc)</code></pre></div><p>Этот скрипт рисует прямоугольник с точки (10,300) до точки (110,500).<br />Давайте нарисуем немного более &quot;продвинуто&quot; и попробуем добавить какой-либо текст и динамическую форму прямоугольника.<br /></p><div class="codebox"><pre><code>text = { } -- Blank table
text[1] = &quot;This is some text&quot;
text[2] = &quot;This is more text&quot;
text[3] = &quot;MOOOOOOOOOO&quot;
text[4] = &quot;Just a basic test really&quot;
text[5] = &quot;weeeeeeeeeeeeeeeeeee&quot;
text[6] = &quot;1231923823982938&quot;
text[7] = 123.23
text[8] = &quot;Blam is the best &quot;
placey = 200
function draw2dfunc()
ScreenWidth, ScreenHeight = get_window_size()
set_color(0,0,0,1)
draw_quad(10,placey,ScreenWidth-20,#text*17.5)
set_color(1,1,1,1)
for i = 1,#text do
draw_text(text[i],12,(i*17)-17+placey,1)
end
end
add_hook(&quot;draw2d&quot;,&quot;draw&quot;, draw2dfunc)</code></pre></div><p>Так, тут я написал много непонятных тебе вещей, так что давай рассмотрим полученный скрипт по частям.<br /></p><div class="codebox"><pre><code>text = { }
text[1] = &quot;This is some text&quot;
text[2] = &quot;This is more text&quot;
text[3] = &quot;MOOOOOOOOOO&quot;
text[4] = &quot;Just a basic test really&quot;
text[5] = &quot;weeeeeeeeeeeeeeeeeee&quot;
text[6] = &quot;1231923823982938&quot;
text[7] = 123.23
text[8] = &quot;Blam is the best &quot;</code></pre></div><p>Это, как ты скорее всего понял, текст, который мы выводим на дисплей.<br /></p><div class="codebox"><pre><code>placey = 200</code></pre></div><p>Эта строка определяет, где текст будет отображаться по оси x; в данном случае - 200px сверху вниз.<br /></p><div class="codebox"><pre><code>ScreenWidth, ScreenHeight = get_window_size()</code></pre></div><p>ScreenWidth, ScreenHeight - ширина и высота окна, в которых будет отображаться текст.<br /></p><div class="codebox"><pre><code>#text*17.5</code></pre></div><p>Тут мы определяем размер шрифта (я предпочитаю именно такой размер, потому что это - самый оптимальный вариант, на мой взгляд)<br /></p><div class="codebox"><pre><code>(i*17)-17+placey</code></pre></div><p>Расположение по оси y.<br /></p><div class="codebox"><pre><code>for i = 1,#text do</code></pre></div><p>Добавляем цикл, пройденный нами в первой части.<br /></p><div class="codebox"><pre><code>draw_text(text[i],12,(i*17)-17+placey,1)</code></pre></div><p>Ну и, собственно, выводим текст на экран.</p><br /><p>[b][center]Рисование в 3D[/center][/b]</p><p>Как я уже говорил, рисование в 3d производится с помощью хука draw3d<br /></p><div class="codebox"><pre><code>add_hook(&quot;draw3d&quot;,&quot;draw&quot;, draw3dfunc)</code></pre></div><p>Для рисования сферы в 3D нужно использовать:<br /></p><div class="codebox"><pre><code>draw_sphere(x,y,z,radius)</code></pre></div><p>Сейчас, если мы хотим нарисовать сферу над головой у тори, мы должны узнать позицию нашей головы. Для этого мы можем использовать следующее:<br /></p><div class="codebox"><pre><code>x, y, z = get_joint_pos(0, 0)</code></pre></div><p>Здесь x,y, и z являются x,y, и z координатами джоинта шеи нашего тори. Также можно сделать так:<br /></p><div class="codebox"><pre><code>get_joint_pos(player, joint)</code></pre></div><p>Список джоинтов здесь</p><p>А теперь можно и нарисовать что-нибудь. Я это сделал следующим образом, &quot;надев&quot; тори на голову шар:<br /></p><div class="codebox"><pre><code>function draw3dfunc()
    x, y, z = get_joint_pos(0, 0)
set_color(0,0,0,1)
draw_sphere(x,y,z,0.4)
end
add_hook(&quot;draw3d&quot;,&quot;draw&quot;, draw3dfunc)</code></pre></div><p>Ну вот и всё, на этом данный мини-учебник по Lua заканчивается. Спасибо за прочтение, надеюсь, что вы осилили его до конца.<br />[right]<br />Оригинальный текст: Blam<br />Перевод: Apozzman<br />Дополнения: sir[/right]</p>]]></content>
			<author>
				<name><![CDATA[BFG]]></name>
				<uri>https://toribash.ru/profile.php?id=323</uri>
			</author>
			<updated>2012-07-17T02:28:45Z</updated>
			<id>https://toribash.ru/viewtopic.php?pid=388374#p388374</id>
		</entry>
</feed>
