Навигация по блогу

четверг, 14 апреля 2011 г.

Lua lesson. Part 1

Многие уже видели этот урок, но я решил скопировать его на мой блог.


Типы данных
В Lua существует 8 типов данных:
nil - пустое значение, пустота
boolean - логический, true и false
number - числовой, он может принимать значения как и с плавающей точкой, так и без. То-есть Float и Integer в 1 типе :)
string - строковый тип. Записуется он так: stroka = 'Я строка, бла бла бла' (возможно также использование "" скобок)
function - функция
userdata - пользовательские данные. Записать в этот тип данные нельзя. Он используется только для сравнения (потом расскажу подробнее)
table - таблица, aka массив.
thread - поток, в MTA:SA не используется.

Пример записи каждого типа в переменную:
Код:
//Записуем "пустоту"
a=nil
//Логический тип
a=true
a=false
//Числовой тип
a=10
a=10.5
a=-2.5
//Строковой тип
a='Я строка'
a="Я строка"
//Функция
function addNumbers(a,b)
local c=a b
return c
end
//Пустая таблица
players = {}
//Таблица со значениями, где players[1] это "John"
players = {"John","Petya"}
Немного о аспектах скриптинга в MTA:SA
Скрипт в MTA:SA делится на 2 части:
Функции и ивенты(события)
Также скрипт можно поделить на серверный(выполняется на стороне сервера) и клиентский(выполняется на стороне клиента)
Функция выполняет определенное действие и может вернуть обработанные данные.
Ивенты ака события, просто запускают эти функции в определенное время.
Например при убийстве игрока, в чат пишется сообщение.
Также переменные могут быть локальные (local b=10) и глобальные (b=10)
Разница лишь в том, что локальные будут видны только в определенном месте, все зависит от того, где она создается. Глобальная видно во всем скрипте.
Выражения:
Арифметические операции:
,-,*,/,%(остаток от деления) и ^ (возведение в степень, например 4 в 3 степени - 4^3)
Операции сравнения:
==,~=(не равняется),<,>,<=,>=
Логические операции:
and,or,not
Операция соединения строк:
Соединяются строки с помощью 2 точек, также можно использовать для соединения другие типы
'Я строка'..'бла бла бла'
'Я строка номер '..number
Из чего состоит ресурс в MTA?
Он состоит из:
meta.xml - мета файл, файл с информацией о ресурсе(название,автор,ссылки на скрипты)
Файлов скриптов - текстовый файл с разширением .lua, наш скрипт
Дополнительные файлы - просто дополнительные файлы, такие как картинки, модели и текстуры.
Ok, как писать скрипты?
Пишутся скрипты в любом текстовом редакторе, но обычно используют Notepad с плагином Lua, который показывает синтаксис Lua.

Ок, начинаем. Будем писать ресурс. Сначало идем на wiki.mtasa.com, где найдем нужный ивент и нужные функции. Скрипт будем писать на серверной части. Чтобы решить на какой стороне писать, надо или подумать логически, или подумать какие функции нам надо, и посмотреть на wiki.mtasa.com, на каких сторонах она существует. Желательно, по возможности, писать на серверной части, так как она лучше синхронизирует объекты и машины.
Ну что, идем в раздел "Server-side Events" и находим наш ивент, "onPlayerConnect" и смотрим, что нам возращает этот ивент(раздел parameters)
Все что нам нужно есть, а это ник игрока и его IP. Пишем функцию:
Код:
function playerConnect(pName,pIP)
 outputChatBox("Игрок "..pName.." зашел на сервер с IP адрессом "..pIP)
end
В первой строке мы объявляем саму функцию, задаем параметры pName - имя игрока и pIP - его IP.
Во второй, мы посылаем сообщение всем игрокам на сервере, что зашел игрок с n-ым именем и с n-ым IP адрессом.
В третей строке мы пишем end, чтобы указать что наша функция закончилась (как скобки в других языках)
Можно задать больше параметров, такие как цвет, кому показать и т.п., но вы можете это сделать самостоятельно, найдя описание функции на вики-странице (Server-side functions)
Но у нас ничего работать не будет. Почему? Потому-что мы не привязали эту функцию к дейстивию, мы только ее создали. Чтобы привязать функцию к действию есть функция addEventHandler
пишем код:
Код:
function playerConnect(pName,pIP)
 outputChatBox("Игрок "..pName.." зашел на сервер с IP адрессом "..pIP)
end
addEventHandler("onPlayerConnect",getRootElement(),playerConnect)
Мы добавили 4 строку. Обьясняю:
первый параметр, это название ивента, во втором параметре нам нужно указать к чему именно привязать это действие, мы привязали к функции getRootElement(), которая возращает "дерево" из всех елементов, то-есть привязать ко всем игрокам. 3 параметр, это функция, к которой надо привязать наше действие. Все, сохраняем наш скрипт в любую папку, и называем его как хочем, в конце добавляем разширение .lua.
Скрипт сделан, осталось сделать мета файл.
Пишем мета файл:
Код:
<meta>
  <info author="Ник автора" version="1" type="script" /> 
  <script src="наш скрипт.lua" type="server" /> 
  </meta>  

В поле version пишем версию скрипта, в поле type типо скрипта (map,gamemode,script,misc)
2 строка "привязует" наш скрипт к ресурсу. В поле src пишем имя нашего скрипта, в поле type пишем тип скрипта, то-есть на какой стороне он разположен, клиентской (client) или серверной(server) в нашем случаи на server.
И сохраняем этот файл с именем meta.xml в ту папку, где и находится наш скрипт. Пол дела сделано!
Осталось проверить наш скрипт, заходим в папку с MTA/server/mods/deatmatch/resources и кидаем нашу папку сюда. Теперь запускаем наш сервер, заходим в игру и там в консоли пишем "start &lt;название папки с вашем ресурсом&gt;", например start joinMessage. Все! Теперь выходим с сервера и заходим обратно, и смотрим в наш чат, где высвечуется наше сообщение.
Скоро будет остальные уроки.

Комментариев нет:

Отправить комментарий