<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://stalkerin.gameru.net/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://stalkerin.gameru.net/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=95.25.99.189&amp;*</id>
		<title>S.T.A.L.K.E.R. Inside Wiki - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://stalkerin.gameru.net/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=95.25.99.189&amp;*"/>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/95.25.99.189"/>
		<updated>2026-04-29T20:41:29Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.22.6</generator>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC</id>
		<title>Справочник по функциям и классам</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC"/>
				<updated>2009-07-11T23:03:14Z</updated>
		
		<summary type="html">&lt;p&gt;95.25.99.189: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Посты с форума AMK&lt;br /&gt;
&lt;br /&gt;
==Основы==&lt;br /&gt;
Lua(в Сталкере,дальше просто '''Lua''') можно использовать не только для игрового процесса... Доступны основные(а может и все) команды(функции).&amp;lt;br&amp;gt;&lt;br /&gt;
к примеру - Оператор ввода/вывода..работа с фаилами и т.д.(Возможно,только в ЧН....)&lt;br /&gt;
вот простой пример:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function to_my_log(text)&lt;br /&gt;
io.open(&amp;quot;gamedata\\solinx_log.txt&amp;quot;,&amp;quot;w&amp;quot;):write( text, &amp;quot;\n&amp;quot; )&lt;br /&gt;
io.open(&amp;quot;gamedata\\solinx_log.txt&amp;quot;,&amp;quot;w&amp;quot;):close()&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Рассмотрим подробнее===&lt;br /&gt;
io.open(filename) - &amp;quot;открывает&amp;quot; для каких либо целей filename&lt;br /&gt;
:write(text,&amp;quot;\n&amp;quot;) - оператор вывода,выводит(читай вписывает) в фаил открытый с помощью io.open , строку text...после переходит на следующую строку(есть ещё:&amp;quot;\t&amp;quot;,&amp;quot;\w&amp;quot;)&lt;br /&gt;
:read(text) - оператор ввода,вводит (читай &amp;quot;читает&amp;quot;) из фаила открытого с помощью io.open,строку текст&lt;br /&gt;
:close() - закрывает фаил открытый с помощью io.open&lt;br /&gt;
&lt;br /&gt;
статьи по Lua(основам) можно найти тут http://www.lua.ru/doc/&lt;br /&gt;
&lt;br /&gt;
Также есть функции &amp;quot;преобразования&amp;quot; ,как в любом языке(скриптовом,программирования)&lt;br /&gt;
Преобразование числового значения(любого) в строку:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
tostring(c)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где с - это число&lt;br /&gt;
Преобразование строки в число:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
tonumber(string)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где string - это строка (вдруг кто не в курсе )&lt;br /&gt;
&lt;br /&gt;
Особенность Lua(по моему только в нём так,хотя кроме Lua только питон смотрел):&lt;br /&gt;
что после основных операторов(циклов,условного и т.д.)(if ,for,while...)&lt;br /&gt;
ставится end&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
if then&lt;br /&gt;
else&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for i,c do&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
while &amp;quot;true&amp;quot; do&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ещё одной особенность LUА ,можно назвать работу с массивами(читай &amp;quot;таблицами&amp;quot;) без цикла&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local tbl={}&lt;br /&gt;
&lt;br /&gt;
--заполнение&lt;br /&gt;
function objparams_to_tbl(obj)&lt;br /&gt;
if isstalker(obj) then&lt;br /&gt;
tbl.sec =obj:section()&lt;br /&gt;
tbl.hp=obj:health&lt;br /&gt;
....&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--применение&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function objparams_to_msg()&lt;br /&gt;
news_manager.send_tip(db.actor,&amp;quot;obj:section =&amp;quot;..tbl.sec..&amp;quot;obj:health =&amp;quot;..obj.hp,nil,nil,1000)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Массив можно очистить/заполнить/прочитать/преобразовать....&lt;br /&gt;
&lt;br /&gt;
И совет:Пользуйтесь SCiTE или любой другой редактор с выделением синтаксиса....&lt;br /&gt;
&lt;br /&gt;
===Работа с фаилами===&lt;br /&gt;
Через системный фаил(systems.ltx)&lt;br /&gt;
&lt;br /&gt;
system_ini():r_string(section,key) -- получение строки из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
system_ini():r_bool(section,key) --получение булевого значения (true,false) из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
system_ini():r_s32(section,key) --получение (целого?)числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
system_ini():r_float(section,key) --получение числа(с плавающей точкой) числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Через другой фаил(который не прописан в системе)&lt;br /&gt;
&lt;br /&gt;
local ini =ini_file(&amp;quot;&amp;quot;) -- путь до фаила (обьявляем переменную которая хранит имя и путь).Дальше также как и с системным фаилом&lt;br /&gt;
&lt;br /&gt;
ini:r_string(section,key) -- получение строки из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
ini:r_bool(section,key) --получение булевого значения (true,false) из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
ini:r_s32(section,key) --получение (целого?)числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
ini:r_float(section,key) --получение числа(с плавающей точкой) числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Вспомогательные функции===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
system_ini():line_exist( section, key ) -- проверяет существует ли в секции [section ] ключ key&lt;br /&gt;
system_ini():section_exist(section) --проверяет существует ли секция [section ]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
EG:&lt;br /&gt;
0function eg()&lt;br /&gt;
1local ini=ini_file(&amp;quot;gamedata\\test.ltx&amp;quot;)&lt;br /&gt;
2if not ini then ini=system_ini() end&lt;br /&gt;
3if ini:section_exist(&amp;quot;test_section&amp;quot;) then&lt;br /&gt;
4if ini:line_exist(&amp;quot;test_line&amp;quot;) then&lt;br /&gt;
5return true&lt;br /&gt;
6end&lt;br /&gt;
7end&lt;br /&gt;
8end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
1. - присваиваем переменной фаил&amp;lt;br&amp;gt;&lt;br /&gt;
2. - проверяем существует ли фаил ,если нет то работаем с системой&amp;lt;br&amp;gt;&lt;br /&gt;
3. - проверяем наличие секции в фаиле(системе)&amp;lt;br&amp;gt;&lt;br /&gt;
4. - проверяем наличие ключа в секции из фаила(системы)&amp;lt;br&amp;gt;&lt;br /&gt;
5. - возвращаем истину(нашли ключ)&lt;br /&gt;
&lt;br /&gt;
Проверка ,что из себя представляет переменная&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function check_type(obj)&lt;br /&gt;
if obj then&lt;br /&gt;
if type(obj)==&amp;quot;string&amp;quot; then&lt;br /&gt;
return &amp;quot;string&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;number&amp;quot; then&lt;br /&gt;
return &amp;quot;number&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;function&amp;quot; then&lt;br /&gt;
return &amp;quot;function&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;boolean&amp;quot; then&lt;br /&gt;
return &amp;quot;boolean&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;userdata&amp;quot; then&lt;br /&gt;
return &amp;quot;userdata&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;table&amp;quot; then&lt;br /&gt;
return &amp;quot;table&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Теперь по порядку...&amp;lt;br&amp;gt;&lt;br /&gt;
Если obj это строка ,то возвращаем &amp;quot;string&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это число ,то возвращаем &amp;quot;number&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это функция ,то возвращаем &amp;quot;function&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это булево значение ,то возвращаем &amp;quot;booolean&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это юзердата(хз что это),то возвращаем &amp;quot;userdata&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это таблица, то возвращаем &amp;quot;table&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Это поможет в таких случаях ,когда неизвестно какой тип данных поступает в то или иное место...&lt;br /&gt;
&lt;br /&gt;
==Структура Lua_help==&lt;br /&gt;
Сам фаил можно найти в '''gamedata\scripts\lua_help.script'''&lt;br /&gt;
&amp;lt;code&amp;gt;C++ class [класс] {&lt;br /&gt;
     const [описание1] = [константа1];&lt;br /&gt;
     const [описание2] = [константа2];&lt;br /&gt;
     ...&lt;br /&gt;
     [константы заменяют описания при вызове методов классов];&lt;br /&gt;
     &lt;br /&gt;
     property [свойство1];&lt;br /&gt;
     property [свойство2];&lt;br /&gt;
     ...&lt;br /&gt;
[свойства (property) - это характеристика какого-либо класса, которая может подвергаться мат. операциям, слияниям, присвояниям и пр.&lt;br /&gt;
     читаются через точку: obj.health];&lt;br /&gt;
&lt;br /&gt;
     [глобальная(-ые) функция(-ии), которой вызывается класс];&lt;br /&gt;
     function [метод1] ([аргумент 1 функции 1], [аргумент 2 функции 1]...);&lt;br /&gt;
     function [метод2] ([аргумент 1 функции2]...);&lt;br /&gt;
             ...&lt;br /&gt;
     [методы - это специальные функции, выполняющие операции с классами и возвращающие значения после операций над классами.&lt;br /&gt;
     вызываются через двоеточие: obj:add_animation(...)];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Создание своего класса==&lt;br /&gt;
Свой класс можно добавить так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class &amp;quot;my_cool_class&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь &amp;quot;my_cool_class&amp;quot; - имя моего нового класса. Записывается в кавычках, т.е. это строка.&lt;br /&gt;
&lt;br /&gt;
Потом можно добавлять к этому классу свои методы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- это специальный метод - конструктор. Будет вызван при создании класса.&lt;br /&gt;
function my_cool_class:__init(num)&lt;br /&gt;
    self.my_param = num -- добавили в свой класс переменную&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- обычный метод&lt;br /&gt;
function my_cool_class:cool_method_of_my_class()&lt;br /&gt;
    get_console():execute(&amp;quot;lua_bind_in_action_&amp;quot;..self.my_param)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- деструктор, вызывается при сборке объекта сборщиком мусора. Аргументов не имеет (кроме скрытого self. об этом см. далее)&lt;br /&gt;
function my_cool_class:__finalize()&lt;br /&gt;
    get_console():execute(&amp;quot;good_by_&amp;quot;..self.my_param)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Потом можно создавать экземпляры своего класса, вызывать их методы и пр.:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local obj1 = my_cool_class(1) -- здесь создаётся новый объект. При этом вызывается конструктор и &lt;br /&gt;
                              -- ему передаются аргументы этого вызова (в данном случае число 1).&lt;br /&gt;
local obj2 = my_cool_class(4)&lt;br /&gt;
obj1:cool_method_of_my_class()&lt;br /&gt;
obj2:cool_method_of_my_class()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как только объект становится ненужным (т.е. на него больше нет ссылок) он удаляется сборщиком мусора. При этом вызывается его метод __finalize&lt;br /&gt;
&lt;br /&gt;
При чём здесь self.&lt;br /&gt;
self - это скрытый первый аргумент. Конструкция вида:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function class_name:fun_name(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
на самом деле эквивалентна конструкции &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function class_name.fun_name(self, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Обратите внимание на двоеточие в первом случае и точку во втором.&amp;lt;br&amp;gt;&lt;br /&gt;
При вызове метода конструкция вида:&lt;br /&gt;
&lt;br /&gt;
'''object_name:fun_name(&amp;lt;список аргументов&amp;gt;)'''&lt;br /&gt;
&lt;br /&gt;
эквивалентна конструкции&lt;br /&gt;
&lt;br /&gt;
'''object_name.fun_name(object_name, &amp;lt;список аргументов&amp;gt;)'''&lt;br /&gt;
&lt;br /&gt;
Это означает, что в качестве self как правило передаётся сам же объект. &amp;quot;Как правило&amp;quot; - это потому, что можно в принципе передать что-то другое. Но лучше этого соглашения не нарушать.&lt;br /&gt;
&lt;br /&gt;
Всё это здорово, но какая от этого польза? Ну сделал я свой класс, и что с ним делать?&lt;br /&gt;
&lt;br /&gt;
В общем, классы - это неплохое средство организации своего кода. Владеющие объектно-ориентированным подходом найдут это расширение весьма удобным. В частности такие, ни к чему не привязанные классы, в скриптах сталкера используются в некоторых местах. Однако, настоящая сила этой технологии не в этом. С помощью этой технологии можно расширять классы, экспортированные в Lua со стороны движка игры. Об этом пойдет речь в следующей части.&lt;br /&gt;
&lt;br /&gt;
==Наследование от экспортированных классов==&lt;br /&gt;
Итак, кроме создания собственных классов технология Luabind позволяет создавать класы на основе уже существующих. Это реализовано в виде своеобразного наследования. Делается это с помощью следующей конструкции:&lt;br /&gt;
&lt;br /&gt;
'''class &amp;quot;my_derived_class&amp;quot; (base_class)'''&lt;br /&gt;
&lt;br /&gt;
Здесь:&lt;br /&gt;
&amp;quot;my_derived_class&amp;quot; как и раньше - это имя нового класса.&amp;lt;br&amp;gt;&lt;br /&gt;
base_class - это уже существующий класс, который будет базовым для вновь созданного. Имя выбрано произвольно, но подразумевается, что такой класс экспортирован и предназначен для наследования.&amp;lt;br&amp;gt;&lt;br /&gt;
Далеко не любой класс из экспортированных со стороны хост-приложения можно использовать в качестве базового. На стороне хост-приложения должен быть создан специальный класс-обёртка. Если его нет, то ничего хорошего не выйдет. Скорее всего при попытке использовать унаследованный класс в Lua будут малопонятные проблемы и вылеты, так что надо знать совершенно точно, можно ли от конкретного класса наследовать.&amp;lt;br&amp;gt;&lt;br /&gt;
Вопрос, какой глубины может быть наследование, т.е. можно ли наследовать от производного класса, мне пока до конца не ясен. С другой стороны, в этом практически нет необходимости.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итак после выполнения указанной конструкции появляется класс my_derived_class, который является копией класса base_class. У него есть в точности те же методы, что и у его базового класса. Пока от этого мало толку. Но теперь можно переопределить методы нашего класса, изменив таким образом его поведение. Делается это так же, как и ранее, но с некоторыми дополнениями.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- конструктор&lt;br /&gt;
function my_derived_class:__init(num) super(num)&lt;br /&gt;
end&lt;br /&gt;
-- обычный метод&lt;br /&gt;
function my_cool_class:some_method(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
    base_class.some_method(self, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
-- деструктор&lt;br /&gt;
function my_cool_class:__finalize()&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На что стОит обратить внимание.&amp;lt;br&amp;gt;&lt;br /&gt;
Во-первых, конструкция super(num). Это вызов конструктора базового класса.&amp;lt;br&amp;gt;&lt;br /&gt;
Во-вторых, для вызова метода базового класса из метода унаследованного используется другая конструкция base_class.some_method(self, ). Здесь надо использовать альтернативную форму вызова метода (с точкой и явным указанием первого аргумента self).&amp;lt;br&amp;gt;&lt;br /&gt;
Наконец, метод __finalize() не требует вызова этого же метода для базового класса, поскольку тот будет вызван автоматически при удалении объекта сборщиком мусора.&lt;br /&gt;
&lt;br /&gt;
Собственно и всё. Теперь можно пользоваться созданным классом: создавать объекты этого класса, вызывать их методы и пр. Здесь уже всё зависит от конкретных целей и требует знания конкретных классов.&lt;br /&gt;
&lt;br /&gt;
==сlass alife_simulator==&lt;br /&gt;
alife_simulator - класс для управления серверными объектами. В игре существует всего один экземпляр такого класса, и получить его можно с помощью вызова глобальной функции alife().&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
level_name(level_id) -- возвращает имя уровня по его id&lt;br /&gt;
create_ammo(&amp;lt;имя секции патронов&amp;gt;, position, lvid, gvid, id, amount) - создание пачек с патронами&lt;br /&gt;
create(&amp;lt;имя секции объекта&amp;gt;, position, lvid, gvid, id) -- создание объектов в инвентаре&lt;br /&gt;
create(&amp;lt;имя секции объекта&amp;gt;, position, lvid, gvid) -- создание объектов на уровне&lt;br /&gt;
во всех функция создания объектов&lt;br /&gt;
position - объект класса vector. Не может быть nil, иначе вылет&lt;br /&gt;
lvid - level vertex id&lt;br /&gt;
gvid - game vertex id&lt;br /&gt;
id - это куда спавним. Если в инвентарь, то указываем id непися или ноль (для актора)&lt;br /&gt;
release(sobj, boolean) -- удаляет объект sobj. Зачем второй булевский аргумент - не известно. &lt;br /&gt;
                          Во всех примерах он либо отсутствует, либо установлен в true&lt;br /&gt;
object(id) -- возвращает серверный объект по его id. Если не нашёл nil&lt;br /&gt;
story_object(sid) -- возвращает серверный объект по его story id. Если не нашёл nil&lt;br /&gt;
actor() -- возвращает серверный объект актора&lt;br /&gt;
set_switch_online(id, boolean) -- переводит в онлайн объект с идентификатором id&lt;br /&gt;
set_switch_offline(id, boolean) -- то же , но в онлайн&lt;br /&gt;
dont_has_info(const number&amp;amp;, string); -- проверка на Неполученный инфопоршень(db.actor:dont_has_info(&amp;quot;infoportion&amp;quot;) &lt;br /&gt;
                                      -- или alife():actor():dont_has_info(&amp;quot;infoportion&amp;quot;)).&lt;br /&gt;
has_info - противоположная&lt;br /&gt;
&lt;br /&gt;
предположительно:&lt;br /&gt;
switch_distance() -- радиус переключения в оффлайн?&lt;br /&gt;
switch_distance(number) -- установка этого радиуса?&lt;br /&gt;
level_id() -- текущий номер уровня ?&lt;br /&gt;
object(string) -- получение объекта оп его имени. Не помню точно, что за имя.&lt;br /&gt;
object(number, boolean) - то же, что и object(number)? на что влияет второй аргумент?&lt;br /&gt;
valid_object_id(number) -- проверка наличия объекта по id?&lt;br /&gt;
alife():create( &amp;lt;индекс объекта в all.spawn&amp;gt; ) -- &lt;br /&gt;
spawn_id(number) -- индекс объекта в all.spawn для объекта с заданным id ?&lt;br /&gt;
&lt;br /&gt;
неизвестно:&lt;br /&gt;
add_out_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
set_interactive(number, boolean);&lt;br /&gt;
add_in_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
function remove_in_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
remove_out_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
kill_entity(cse_alife_monster_abstract*, const number&amp;amp;, cse_alife_schedulable*);&lt;br /&gt;
kill_entity(alife_simulator*, cse_alife_monster_abstract*, const number&amp;amp;);&lt;br /&gt;
kill_entity(alife_simulator*, cse_alife_monster_abstract*);&lt;br /&gt;
has_info(const number&amp;amp;, string);&lt;br /&gt;
remove_all_restrictions(number, const enum RestrictionSpace::ERestrictorTypes&amp;amp;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local sim = alife() -- получаем сам объект класса alife_simulator&lt;br /&gt;
local sactor = sim:actor() -- получаем серверный объект для актора&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class vector==&lt;br /&gt;
vector - вспомогательный класс, содержащий три координаты, и позволяющий выполнять с ними различные манипуляции. Объекты класса vector являются аргументами многих функций и возвращаются многими функциями. См. например выше про метод create класса alife_simulator. Отдельный объект класса вектор создаётся вызовом глобальной функции vector(). При создании имеет координаты [0,0,0].&lt;br /&gt;
&lt;br /&gt;
===Список методов класса vector===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
v:set_length(number) - оставить направление, изменить длину&lt;br /&gt;
v:normalize(); - сделать длину единичной&lt;br /&gt;
&lt;br /&gt;
v:magnitude() -- длина вектора v&lt;br /&gt;
v1:distance_to(v2) -- расстояние между v1 и v2&lt;br /&gt;
v1:distance_to_sqr(v2) -- квадрат расстояния между v1 и v2&lt;br /&gt;
v1:crossproduct(v2) -- векторное произведение. Возвращает вектор&lt;br /&gt;
v1:dotproduct(v2) -- скалярное произведение. Возвращает число&lt;br /&gt;
v:sub(number); -- вычесть из каждого компонента v число number&lt;br /&gt;
v1:sub(v2); -- вычесть почленно вектор v2 из v1 и поместить в v1&lt;br /&gt;
v1:sub(v2, v3) -- вычесть из v2 - v3 и поместить в v1&lt;br /&gt;
аналогично:&lt;br /&gt;
add - почленное сложение&lt;br /&gt;
mul - почленное умножение&lt;br /&gt;
div - почленное деление&lt;br /&gt;
max/min - почленный максимум/минимум&lt;br /&gt;
v1:clamp(v2) -- почленное обрезание первого вторым&lt;br /&gt;
average -- почленное среднее&lt;br /&gt;
invert -- почленная инверсия знака&lt;br /&gt;
&lt;br /&gt;
v1:abs(v2); -- копирует почленно положительные компоненты в v1 из v2&lt;br /&gt;
lerp(v1, v2, number) -- линейная интерполяция между двумя векторами&lt;br /&gt;
-- если number больше 1, то выходит за них - экстраполяция&lt;br /&gt;
&lt;br /&gt;
v1:reflect(v2, v3) - должно быть отражение одного вектора от плоскости, определяемой другим. Не проверял&lt;br /&gt;
v1:slide(v2, v3); - вероятно, проекция одного вектора на плоскость, определяемую другим. Не уверен&lt;br /&gt;
v1:distance_to_xz(v2) - учитывая, что плоскость XZ - это плоскость параллельная земле, то возможно это &lt;br /&gt;
                        длина проекции на землю пути от точки до точки. Не проверял&lt;br /&gt;
&lt;br /&gt;
v:getP() - зенитный угол в радианах (угол наклона над плоскостью XZ )&lt;br /&gt;
v:getH() - азимутальный угол в радианах (угол в плоскости XZ между проекцией вектора на эту плоскость и осью Z)&lt;br /&gt;
setHP - соответственно для установки этих значений&lt;br /&gt;
v1:align() - выравнивает вектор вдоль оси x или z и нормирует его. Значение по y игнорируется. &lt;br /&gt;
             В итоге всегда возвращается одно из четырёх значений ([1,0,0], [-1,0,0], [0,0,1], [0,0,-1])&lt;br /&gt;
v4:mad(v1,v2,v3) -- бешеная операция =) умножить почленно второе на третье и сложить с &lt;br /&gt;
                    первым, т.е. v4 = v1 + v2*v3 (название операции mad == mul + add)&lt;br /&gt;
v1:inertion(v2, number) -- v1 = v2 + (v1-v2)*number (тоже почленно)&lt;br /&gt;
v1:similar(v2, number) -- сравнение векторов на равенство с погрешностью number. Выдаёт 1 или 0&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local v1 = vector()&lt;br /&gt;
v1:set(1,2,3)&lt;br /&gt;
local v2 = vector():set(4,5,6)&lt;br /&gt;
local dist = v1:distance_to(v2)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class fcolor==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class fcolor {&lt;br /&gt;
    property a; --альфа-цвет, отвечающий за прозрачность.&lt;br /&gt;
    property b; --blue-цвет, отвечающий за синий оттенок цвета.&lt;br /&gt;
    property g; --green-цвет, отвечающий за зелёный оттенок цвета.&lt;br /&gt;
    property r; --red-цвет, отвечающий за красный оттенок цвет.&lt;br /&gt;
&lt;br /&gt;
    fcolor ();&lt;br /&gt;
&lt;br /&gt;
    function set(number, number, number, number); --установка цвета (r,g,b,a)&lt;br /&gt;
    function set(const fcolor&amp;amp;); --установка цвета по уже имеющемуся классу &amp;quot;fcolor()&amp;quot;&lt;br /&gt;
    function set(number); -- не знаю. предполагаю, что есть несколько заранее подготовленных цветов с индексами для каждого.&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
color = fcolor()&lt;br /&gt;
color.a = 50&lt;br /&gt;
color.g = 255&lt;br /&gt;
color.r = 100&lt;br /&gt;
color.b = 50&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
или&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
color = fcolor()&lt;br /&gt;
color:set(100,255,50,50)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class hit==&lt;br /&gt;
Бывают случаи, при которых необходимо нанести некоторый урон неписю или мобу, при этом имитировав попадание в него. Для этого существует метод класса game_object:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function hit(hit*);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Чтобы использовать этот метод, нужно указать аргументы. В данном случае имеет объект другого класса - hit. Вот его описание:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class hit {&lt;br /&gt;
    const burn = 0; --здесь идут константы типов урона, используемых в свойстве &amp;quot;type&amp;quot;. Все мы прекрасно знаем, что означает каждый.&lt;br /&gt;
    const chemical_burn = 6;&lt;br /&gt;
    const dummy = 11;&lt;br /&gt;
    const explosion = 7;&lt;br /&gt;
    const fire_wound = 8;&lt;br /&gt;
    const radiation = 4;&lt;br /&gt;
    const shock = 1;&lt;br /&gt;
    const strike = 2;&lt;br /&gt;
    const telepatic = 5;&lt;br /&gt;
    const wound = 3;&lt;br /&gt;
&lt;br /&gt;
    property direction; --дирекция урона&lt;br /&gt;
    property draftsman; --обозначает персонажа, нанёсшего урон.&lt;br /&gt;
    property impulse; --импульс урона&lt;br /&gt;
    property power; --сила урона&lt;br /&gt;
    property type; -- тип урона (см. константы)&lt;br /&gt;
&lt;br /&gt;
    hit ();&lt;br /&gt;
    hit (const hit*);&lt;br /&gt;
&lt;br /&gt;
    function bone(string); --метод с указанием кости урона&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
hit = hit() -- создание объекта класса hit&lt;br /&gt;
hit.direction = vector():set(1,0,0) --дирекция по оси x&lt;br /&gt;
hit.draftsman = db.actor --нанёс урон актор&lt;br /&gt;
hit.impulse = 600 --импульс&lt;br /&gt;
hit.power = 1.45 --хит&lt;br /&gt;
hit.type = 2 --тип урона - выстрел&lt;br /&gt;
hit:bone(&amp;quot;bip01_head&amp;quot;) -- удар приходится на голову&lt;br /&gt;
obj:hit(hit)&lt;br /&gt;
-- наносим урон&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==&amp;quot;Функции времени&amp;quot;==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
time_global() -- реальное время (в миллисекундах) с начала запуска программы&lt;br /&gt;
game.time() -- игровое время (в игровых миллисекундах) с начала игры (т.е. с начала прохождения игры)&lt;br /&gt;
level.get_time_days() -- день месяца по игровому времени&lt;br /&gt;
level.get_time_hours() -- час текущего игрового дня&lt;br /&gt;
level.get_time_minutes() -- минута текущего игрового часа&lt;br /&gt;
&lt;br /&gt;
level.get_time_factor() -- возвращает отношение скорости течения игрового времени к скорости реального &lt;br /&gt;
                        --(game_time_speed / real_time_speed)&lt;br /&gt;
level.set_time_factor(number) -- устанавливает это отношение&lt;br /&gt;
&lt;br /&gt;
game.get_game_time() -- возвращает игровое время в виде объекта класса CTime. Класс CTime я опишу подробно &lt;br /&gt;
                     -- как-нибудь потом, а пока опишу только пару его методов.&lt;br /&gt;
конструктор. Вызывается через пространство имён game&lt;br /&gt;
game.CTime()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Дефолтовые значения===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
year, month, day = 1 &lt;br /&gt;
hour, min, sek, ms = 0&lt;br /&gt;
CTime.set(year, month, day, hour, min, sek, ms) -- устанавливает все данные о времени&lt;br /&gt;
метод CTime.get описан так:&lt;br /&gt;
function get(number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;);&lt;br /&gt;
что наводит на мысль о семи аргументах. однако с точки зрения Lua этот метод не принимает аргументов, зато возвращает семь значений. &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
====Пример использования обоих методов:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local t = game.CTime() -- создания объекта с дефолтовыми значнеиями&lt;br /&gt;
t:set(2009, 7, 11, 8, 11, 22, 333) -- установили все значения&lt;br /&gt;
&lt;br /&gt;
local y,m,d,h,min,sec,ms = t:get() -- получили все значения&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
===Класс CTime (неразобранный)===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class CTime {&lt;br /&gt;
const DateToDay = 0;&lt;br /&gt;
const DateToMonth = 1;&lt;br /&gt;
const DateToYear = 2;&lt;br /&gt;
const TimeToHours = 0;&lt;br /&gt;
const TimeToMilisecs = 3;&lt;br /&gt;
const TimeToMinutes = 1;&lt;br /&gt;
const TimeToSeconds = 2;&lt;br /&gt;
&lt;br /&gt;
CTime ();&lt;br /&gt;
CTime (const CTime&amp;amp;);&lt;br /&gt;
&lt;br /&gt;
function sub(CTime*);&lt;br /&gt;
function timeToString(number);&lt;br /&gt;
function dateToString(number);&lt;br /&gt;
operator ==(const CTime&amp;amp;, CTime);&lt;br /&gt;
function get(number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;);&lt;br /&gt;
function set(number, number, number, number, number, number, number);&lt;br /&gt;
function setHMSms(number, number, number, number);&lt;br /&gt;
function diffSec(CTime*);&lt;br /&gt;
operator &amp;lt;(const CTime&amp;amp;, CTime);&lt;br /&gt;
operator +(CTime&amp;amp;, CTime);&lt;br /&gt;
operator &amp;gt;=(const CTime&amp;amp;, CTime);&lt;br /&gt;
function setHMS(number, number, number);&lt;br /&gt;
operator &amp;gt;(const CTime&amp;amp;, CTime);&lt;br /&gt;
operator -(CTime&amp;amp;, CTime);&lt;br /&gt;
operator &amp;lt;=(const CTime&amp;amp;, CTime);&lt;br /&gt;
function add(CTime*);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==класс CUIScriptWnd==&lt;br /&gt;
CUIScriptWnd(); --для работы с окном...&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    function _construct();&lt;br /&gt;
    function Register(CUIWindow*);&lt;br /&gt;
    function Register(CUIWindow*, string);&lt;br /&gt;
    function Enable(boolean);        --вкл/выкл&lt;br /&gt;
    function SetHeight(number);  --установка высоты&lt;br /&gt;
    function GetFrameLineWnd(string);&lt;br /&gt;
    function SetHolder(CDialogHolder*);&lt;br /&gt;
    function GetWidth() const;  --получение ширины контрола&lt;br /&gt;
    function GetCheckButton(string);--Получение состояния checkBox ,на выходе true или false?&lt;br /&gt;
    function DetachChild(CUIWindow*);&lt;br /&gt;
    function SetPPMode();&lt;br /&gt;
    function SetFont(CGameFont*);  --установка шрифта по имени&lt;br /&gt;
    function IsShown();                --проверка видно ли контрол иль нет?&lt;br /&gt;
    function Show(boolean);            --показывать контолили нет?&lt;br /&gt;
    function GetHeight() const;        --возвращает высоту&lt;br /&gt;
    function SetWidth(number);        --устанавливает ширину&lt;br /&gt;
    function GetListWndEx(string);&lt;br /&gt;
    function IsEnabled();&lt;br /&gt;
    function ResetPPMode();&lt;br /&gt;
    function GetPropertiesBox(string);&lt;br /&gt;
    function GetFont();                --возвращает шрифт установленный setFont?&lt;br /&gt;
    function Update();&lt;br /&gt;
    function AddCallback(string, number, const function&amp;lt;void&amp;gt;&amp;amp;); --соответские контрола с действие?&lt;br /&gt;
    function AddCallback(string, number, const function&amp;lt;void&amp;gt;&amp;amp;, object);--соответские контрола с действие?&lt;br /&gt;
    function GetButton(string);--Получаем последнюю нажатую кнопку?&lt;br /&gt;
    function SetAutoDelete(boolean);&lt;br /&gt;
    function OnKeyboard(number, enum EUIMessages);--Колбек нажатия на клавиатуре&lt;br /&gt;
    function Dispatch(number, number);&lt;br /&gt;
    function GetListWnd(string);--получение окна ListBoxa?&lt;br /&gt;
    function AttachChild(CUIWindow*);&lt;br /&gt;
    function GetStatic(string);--получение текста метки&lt;br /&gt;
    function SetWndPos(number, number);--установка позиции окна(x,y)&lt;br /&gt;
    function GetTabControl(string);&lt;br /&gt;
    function GetRadioButton(string);--состояние RadioButtton на выходите true или false&lt;br /&gt;
    function Init(number, number, number, number);--инициализация окна...читай FormInitializatione (x,y,width,height)&lt;br /&gt;
    function Init(Frect*);--инициализация окна&lt;br /&gt;
    function GetFrameWindow(string);&lt;br /&gt;
    function WindowName();&lt;br /&gt;
    function GetDialogWnd(string);&lt;br /&gt;
    function GetHolder();&lt;br /&gt;
    function SetWndRect(Frect);--установка координат углов&lt;br /&gt;
    function SetWndRect(number, number, number, number);--установка координат углов&lt;br /&gt;
    function GetEditBox(string);--получение текста из ЭдитБокса&lt;br /&gt;
    function SetWindowName(string);--Устанавливаем имя форме(caption)&lt;br /&gt;
    function GetProgressBar(string);&lt;br /&gt;
    function GetMessageBox(string);&lt;br /&gt;
    function SetWndSize(number, number);&lt;br /&gt;
    function Load(string);&lt;br /&gt;
    function IsAutoDelete();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
Статья создана: [[Участник:malandrinus|malandrinus]], [[Участник:IQDDD|IQDDD]], [[Участник:меченый|меченый]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>95.25.99.189</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC</id>
		<title>Справочник по функциям и классам</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC"/>
				<updated>2009-07-11T23:02:54Z</updated>
		
		<summary type="html">&lt;p&gt;95.25.99.189: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Посты с форума AMK&lt;br /&gt;
&lt;br /&gt;
==Основы==&lt;br /&gt;
Lua(в Сталкере,дальше просто '''Lua''') можно использовать не только для игрового процесса... Доступны основные(а может и все) команды(функции). &lt;br /&gt;
К примеру - Оператор ввода/вывода..работа с фаилами и т.д.(Возможно,только в ЧН....)&lt;br /&gt;
вот простой пример:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function to_my_log(text)&lt;br /&gt;
io.open(&amp;quot;gamedata\\solinx_log.txt&amp;quot;,&amp;quot;w&amp;quot;):write( text, &amp;quot;\n&amp;quot; )&lt;br /&gt;
io.open(&amp;quot;gamedata\\solinx_log.txt&amp;quot;,&amp;quot;w&amp;quot;):close()&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Рассмотрим подробнее===&lt;br /&gt;
io.open(filename) - &amp;quot;открывает&amp;quot; для каких либо целей filename&lt;br /&gt;
:write(text,&amp;quot;\n&amp;quot;) - оператор вывода,выводит(читай вписывает) в фаил открытый с помощью io.open , строку text...после переходит на следующую строку(есть ещё:&amp;quot;\t&amp;quot;,&amp;quot;\w&amp;quot;)&lt;br /&gt;
:read(text) - оператор ввода,вводит (читай &amp;quot;читает&amp;quot;) из фаила открытого с помощью io.open,строку текст&lt;br /&gt;
:close() - закрывает фаил открытый с помощью io.open&lt;br /&gt;
&lt;br /&gt;
статьи по Lua(основам) можно найти тут http://www.lua.ru/doc/&lt;br /&gt;
&lt;br /&gt;
Также есть функции &amp;quot;преобразования&amp;quot; ,как в любом языке(скриптовом,программирования)&lt;br /&gt;
Преобразование числового значения(любого) в строку:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
tostring(c)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где с - это число&lt;br /&gt;
Преобразование строки в число:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
tonumber(string)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где string - это строка (вдруг кто не в курсе )&lt;br /&gt;
&lt;br /&gt;
Особенность Lua(по моему только в нём так,хотя кроме Lua только питон смотрел):&lt;br /&gt;
что после основных операторов(циклов,условного и т.д.)(if ,for,while...)&lt;br /&gt;
ставится end&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
if then&lt;br /&gt;
else&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for i,c do&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
while &amp;quot;true&amp;quot; do&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ещё одной особенность LUА ,можно назвать работу с массивами(читай &amp;quot;таблицами&amp;quot;) без цикла&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local tbl={}&lt;br /&gt;
&lt;br /&gt;
--заполнение&lt;br /&gt;
function objparams_to_tbl(obj)&lt;br /&gt;
if isstalker(obj) then&lt;br /&gt;
tbl.sec =obj:section()&lt;br /&gt;
tbl.hp=obj:health&lt;br /&gt;
....&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--применение&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function objparams_to_msg()&lt;br /&gt;
news_manager.send_tip(db.actor,&amp;quot;obj:section =&amp;quot;..tbl.sec..&amp;quot;obj:health =&amp;quot;..obj.hp,nil,nil,1000)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Массив можно очистить/заполнить/прочитать/преобразовать....&lt;br /&gt;
&lt;br /&gt;
И совет:Пользуйтесь SCiTE или любой другой редактор с выделением синтаксиса....&lt;br /&gt;
&lt;br /&gt;
===Работа с фаилами===&lt;br /&gt;
Через системный фаил(systems.ltx)&lt;br /&gt;
&lt;br /&gt;
system_ini():r_string(section,key) -- получение строки из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
system_ini():r_bool(section,key) --получение булевого значения (true,false) из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
system_ini():r_s32(section,key) --получение (целого?)числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
system_ini():r_float(section,key) --получение числа(с плавающей точкой) числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Через другой фаил(который не прописан в системе)&lt;br /&gt;
&lt;br /&gt;
local ini =ini_file(&amp;quot;&amp;quot;) -- путь до фаила (обьявляем переменную которая хранит имя и путь).Дальше также как и с системным фаилом&lt;br /&gt;
&lt;br /&gt;
ini:r_string(section,key) -- получение строки из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
ini:r_bool(section,key) --получение булевого значения (true,false) из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
ini:r_s32(section,key) --получение (целого?)числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
ini:r_float(section,key) --получение числа(с плавающей точкой) числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Вспомогательные функции===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
system_ini():line_exist( section, key ) -- проверяет существует ли в секции [section ] ключ key&lt;br /&gt;
system_ini():section_exist(section) --проверяет существует ли секция [section ]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
EG:&lt;br /&gt;
0function eg()&lt;br /&gt;
1local ini=ini_file(&amp;quot;gamedata\\test.ltx&amp;quot;)&lt;br /&gt;
2if not ini then ini=system_ini() end&lt;br /&gt;
3if ini:section_exist(&amp;quot;test_section&amp;quot;) then&lt;br /&gt;
4if ini:line_exist(&amp;quot;test_line&amp;quot;) then&lt;br /&gt;
5return true&lt;br /&gt;
6end&lt;br /&gt;
7end&lt;br /&gt;
8end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
1. - присваиваем переменной фаил&amp;lt;br&amp;gt;&lt;br /&gt;
2. - проверяем существует ли фаил ,если нет то работаем с системой&amp;lt;br&amp;gt;&lt;br /&gt;
3. - проверяем наличие секции в фаиле(системе)&amp;lt;br&amp;gt;&lt;br /&gt;
4. - проверяем наличие ключа в секции из фаила(системы)&amp;lt;br&amp;gt;&lt;br /&gt;
5. - возвращаем истину(нашли ключ)&lt;br /&gt;
&lt;br /&gt;
Проверка ,что из себя представляет переменная&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function check_type(obj)&lt;br /&gt;
if obj then&lt;br /&gt;
if type(obj)==&amp;quot;string&amp;quot; then&lt;br /&gt;
return &amp;quot;string&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;number&amp;quot; then&lt;br /&gt;
return &amp;quot;number&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;function&amp;quot; then&lt;br /&gt;
return &amp;quot;function&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;boolean&amp;quot; then&lt;br /&gt;
return &amp;quot;boolean&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;userdata&amp;quot; then&lt;br /&gt;
return &amp;quot;userdata&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;table&amp;quot; then&lt;br /&gt;
return &amp;quot;table&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Теперь по порядку...&amp;lt;br&amp;gt;&lt;br /&gt;
Если obj это строка ,то возвращаем &amp;quot;string&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это число ,то возвращаем &amp;quot;number&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это функция ,то возвращаем &amp;quot;function&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это булево значение ,то возвращаем &amp;quot;booolean&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это юзердата(хз что это),то возвращаем &amp;quot;userdata&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это таблица, то возвращаем &amp;quot;table&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Это поможет в таких случаях ,когда неизвестно какой тип данных поступает в то или иное место...&lt;br /&gt;
&lt;br /&gt;
==Структура Lua_help==&lt;br /&gt;
Сам фаил можно найти в '''gamedata\scripts\lua_help.script'''&lt;br /&gt;
&amp;lt;code&amp;gt;C++ class [класс] {&lt;br /&gt;
     const [описание1] = [константа1];&lt;br /&gt;
     const [описание2] = [константа2];&lt;br /&gt;
     ...&lt;br /&gt;
     [константы заменяют описания при вызове методов классов];&lt;br /&gt;
     &lt;br /&gt;
     property [свойство1];&lt;br /&gt;
     property [свойство2];&lt;br /&gt;
     ...&lt;br /&gt;
[свойства (property) - это характеристика какого-либо класса, которая может подвергаться мат. операциям, слияниям, присвояниям и пр.&lt;br /&gt;
     читаются через точку: obj.health];&lt;br /&gt;
&lt;br /&gt;
     [глобальная(-ые) функция(-ии), которой вызывается класс];&lt;br /&gt;
     function [метод1] ([аргумент 1 функции 1], [аргумент 2 функции 1]...);&lt;br /&gt;
     function [метод2] ([аргумент 1 функции2]...);&lt;br /&gt;
             ...&lt;br /&gt;
     [методы - это специальные функции, выполняющие операции с классами и возвращающие значения после операций над классами.&lt;br /&gt;
     вызываются через двоеточие: obj:add_animation(...)];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Создание своего класса==&lt;br /&gt;
Свой класс можно добавить так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class &amp;quot;my_cool_class&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь &amp;quot;my_cool_class&amp;quot; - имя моего нового класса. Записывается в кавычках, т.е. это строка.&lt;br /&gt;
&lt;br /&gt;
Потом можно добавлять к этому классу свои методы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- это специальный метод - конструктор. Будет вызван при создании класса.&lt;br /&gt;
function my_cool_class:__init(num)&lt;br /&gt;
    self.my_param = num -- добавили в свой класс переменную&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- обычный метод&lt;br /&gt;
function my_cool_class:cool_method_of_my_class()&lt;br /&gt;
    get_console():execute(&amp;quot;lua_bind_in_action_&amp;quot;..self.my_param)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- деструктор, вызывается при сборке объекта сборщиком мусора. Аргументов не имеет (кроме скрытого self. об этом см. далее)&lt;br /&gt;
function my_cool_class:__finalize()&lt;br /&gt;
    get_console():execute(&amp;quot;good_by_&amp;quot;..self.my_param)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Потом можно создавать экземпляры своего класса, вызывать их методы и пр.:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local obj1 = my_cool_class(1) -- здесь создаётся новый объект. При этом вызывается конструктор и &lt;br /&gt;
                              -- ему передаются аргументы этого вызова (в данном случае число 1).&lt;br /&gt;
local obj2 = my_cool_class(4)&lt;br /&gt;
obj1:cool_method_of_my_class()&lt;br /&gt;
obj2:cool_method_of_my_class()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как только объект становится ненужным (т.е. на него больше нет ссылок) он удаляется сборщиком мусора. При этом вызывается его метод __finalize&lt;br /&gt;
&lt;br /&gt;
При чём здесь self.&lt;br /&gt;
self - это скрытый первый аргумент. Конструкция вида:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function class_name:fun_name(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
на самом деле эквивалентна конструкции &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function class_name.fun_name(self, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Обратите внимание на двоеточие в первом случае и точку во втором.&amp;lt;br&amp;gt;&lt;br /&gt;
При вызове метода конструкция вида:&lt;br /&gt;
&lt;br /&gt;
'''object_name:fun_name(&amp;lt;список аргументов&amp;gt;)'''&lt;br /&gt;
&lt;br /&gt;
эквивалентна конструкции&lt;br /&gt;
&lt;br /&gt;
'''object_name.fun_name(object_name, &amp;lt;список аргументов&amp;gt;)'''&lt;br /&gt;
&lt;br /&gt;
Это означает, что в качестве self как правило передаётся сам же объект. &amp;quot;Как правило&amp;quot; - это потому, что можно в принципе передать что-то другое. Но лучше этого соглашения не нарушать.&lt;br /&gt;
&lt;br /&gt;
Всё это здорово, но какая от этого польза? Ну сделал я свой класс, и что с ним делать?&lt;br /&gt;
&lt;br /&gt;
В общем, классы - это неплохое средство организации своего кода. Владеющие объектно-ориентированным подходом найдут это расширение весьма удобным. В частности такие, ни к чему не привязанные классы, в скриптах сталкера используются в некоторых местах. Однако, настоящая сила этой технологии не в этом. С помощью этой технологии можно расширять классы, экспортированные в Lua со стороны движка игры. Об этом пойдет речь в следующей части.&lt;br /&gt;
&lt;br /&gt;
==Наследование от экспортированных классов==&lt;br /&gt;
Итак, кроме создания собственных классов технология Luabind позволяет создавать класы на основе уже существующих. Это реализовано в виде своеобразного наследования. Делается это с помощью следующей конструкции:&lt;br /&gt;
&lt;br /&gt;
'''class &amp;quot;my_derived_class&amp;quot; (base_class)'''&lt;br /&gt;
&lt;br /&gt;
Здесь:&lt;br /&gt;
&amp;quot;my_derived_class&amp;quot; как и раньше - это имя нового класса.&amp;lt;br&amp;gt;&lt;br /&gt;
base_class - это уже существующий класс, который будет базовым для вновь созданного. Имя выбрано произвольно, но подразумевается, что такой класс экспортирован и предназначен для наследования.&amp;lt;br&amp;gt;&lt;br /&gt;
Далеко не любой класс из экспортированных со стороны хост-приложения можно использовать в качестве базового. На стороне хост-приложения должен быть создан специальный класс-обёртка. Если его нет, то ничего хорошего не выйдет. Скорее всего при попытке использовать унаследованный класс в Lua будут малопонятные проблемы и вылеты, так что надо знать совершенно точно, можно ли от конкретного класса наследовать.&amp;lt;br&amp;gt;&lt;br /&gt;
Вопрос, какой глубины может быть наследование, т.е. можно ли наследовать от производного класса, мне пока до конца не ясен. С другой стороны, в этом практически нет необходимости.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итак после выполнения указанной конструкции появляется класс my_derived_class, который является копией класса base_class. У него есть в точности те же методы, что и у его базового класса. Пока от этого мало толку. Но теперь можно переопределить методы нашего класса, изменив таким образом его поведение. Делается это так же, как и ранее, но с некоторыми дополнениями.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- конструктор&lt;br /&gt;
function my_derived_class:__init(num) super(num)&lt;br /&gt;
end&lt;br /&gt;
-- обычный метод&lt;br /&gt;
function my_cool_class:some_method(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
    base_class.some_method(self, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
-- деструктор&lt;br /&gt;
function my_cool_class:__finalize()&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На что стОит обратить внимание.&amp;lt;br&amp;gt;&lt;br /&gt;
Во-первых, конструкция super(num). Это вызов конструктора базового класса.&amp;lt;br&amp;gt;&lt;br /&gt;
Во-вторых, для вызова метода базового класса из метода унаследованного используется другая конструкция base_class.some_method(self, ). Здесь надо использовать альтернативную форму вызова метода (с точкой и явным указанием первого аргумента self).&amp;lt;br&amp;gt;&lt;br /&gt;
Наконец, метод __finalize() не требует вызова этого же метода для базового класса, поскольку тот будет вызван автоматически при удалении объекта сборщиком мусора.&lt;br /&gt;
&lt;br /&gt;
Собственно и всё. Теперь можно пользоваться созданным классом: создавать объекты этого класса, вызывать их методы и пр. Здесь уже всё зависит от конкретных целей и требует знания конкретных классов.&lt;br /&gt;
&lt;br /&gt;
==сlass alife_simulator==&lt;br /&gt;
alife_simulator - класс для управления серверными объектами. В игре существует всего один экземпляр такого класса, и получить его можно с помощью вызова глобальной функции alife().&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
level_name(level_id) -- возвращает имя уровня по его id&lt;br /&gt;
create_ammo(&amp;lt;имя секции патронов&amp;gt;, position, lvid, gvid, id, amount) - создание пачек с патронами&lt;br /&gt;
create(&amp;lt;имя секции объекта&amp;gt;, position, lvid, gvid, id) -- создание объектов в инвентаре&lt;br /&gt;
create(&amp;lt;имя секции объекта&amp;gt;, position, lvid, gvid) -- создание объектов на уровне&lt;br /&gt;
во всех функция создания объектов&lt;br /&gt;
position - объект класса vector. Не может быть nil, иначе вылет&lt;br /&gt;
lvid - level vertex id&lt;br /&gt;
gvid - game vertex id&lt;br /&gt;
id - это куда спавним. Если в инвентарь, то указываем id непися или ноль (для актора)&lt;br /&gt;
release(sobj, boolean) -- удаляет объект sobj. Зачем второй булевский аргумент - не известно. &lt;br /&gt;
                          Во всех примерах он либо отсутствует, либо установлен в true&lt;br /&gt;
object(id) -- возвращает серверный объект по его id. Если не нашёл nil&lt;br /&gt;
story_object(sid) -- возвращает серверный объект по его story id. Если не нашёл nil&lt;br /&gt;
actor() -- возвращает серверный объект актора&lt;br /&gt;
set_switch_online(id, boolean) -- переводит в онлайн объект с идентификатором id&lt;br /&gt;
set_switch_offline(id, boolean) -- то же , но в онлайн&lt;br /&gt;
dont_has_info(const number&amp;amp;, string); -- проверка на Неполученный инфопоршень(db.actor:dont_has_info(&amp;quot;infoportion&amp;quot;) &lt;br /&gt;
                                      -- или alife():actor():dont_has_info(&amp;quot;infoportion&amp;quot;)).&lt;br /&gt;
has_info - противоположная&lt;br /&gt;
&lt;br /&gt;
предположительно:&lt;br /&gt;
switch_distance() -- радиус переключения в оффлайн?&lt;br /&gt;
switch_distance(number) -- установка этого радиуса?&lt;br /&gt;
level_id() -- текущий номер уровня ?&lt;br /&gt;
object(string) -- получение объекта оп его имени. Не помню точно, что за имя.&lt;br /&gt;
object(number, boolean) - то же, что и object(number)? на что влияет второй аргумент?&lt;br /&gt;
valid_object_id(number) -- проверка наличия объекта по id?&lt;br /&gt;
alife():create( &amp;lt;индекс объекта в all.spawn&amp;gt; ) -- &lt;br /&gt;
spawn_id(number) -- индекс объекта в all.spawn для объекта с заданным id ?&lt;br /&gt;
&lt;br /&gt;
неизвестно:&lt;br /&gt;
add_out_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
set_interactive(number, boolean);&lt;br /&gt;
add_in_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
function remove_in_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
remove_out_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
kill_entity(cse_alife_monster_abstract*, const number&amp;amp;, cse_alife_schedulable*);&lt;br /&gt;
kill_entity(alife_simulator*, cse_alife_monster_abstract*, const number&amp;amp;);&lt;br /&gt;
kill_entity(alife_simulator*, cse_alife_monster_abstract*);&lt;br /&gt;
has_info(const number&amp;amp;, string);&lt;br /&gt;
remove_all_restrictions(number, const enum RestrictionSpace::ERestrictorTypes&amp;amp;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local sim = alife() -- получаем сам объект класса alife_simulator&lt;br /&gt;
local sactor = sim:actor() -- получаем серверный объект для актора&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class vector==&lt;br /&gt;
vector - вспомогательный класс, содержащий три координаты, и позволяющий выполнять с ними различные манипуляции. Объекты класса vector являются аргументами многих функций и возвращаются многими функциями. См. например выше про метод create класса alife_simulator. Отдельный объект класса вектор создаётся вызовом глобальной функции vector(). При создании имеет координаты [0,0,0].&lt;br /&gt;
&lt;br /&gt;
===Список методов класса vector===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
v:set_length(number) - оставить направление, изменить длину&lt;br /&gt;
v:normalize(); - сделать длину единичной&lt;br /&gt;
&lt;br /&gt;
v:magnitude() -- длина вектора v&lt;br /&gt;
v1:distance_to(v2) -- расстояние между v1 и v2&lt;br /&gt;
v1:distance_to_sqr(v2) -- квадрат расстояния между v1 и v2&lt;br /&gt;
v1:crossproduct(v2) -- векторное произведение. Возвращает вектор&lt;br /&gt;
v1:dotproduct(v2) -- скалярное произведение. Возвращает число&lt;br /&gt;
v:sub(number); -- вычесть из каждого компонента v число number&lt;br /&gt;
v1:sub(v2); -- вычесть почленно вектор v2 из v1 и поместить в v1&lt;br /&gt;
v1:sub(v2, v3) -- вычесть из v2 - v3 и поместить в v1&lt;br /&gt;
аналогично:&lt;br /&gt;
add - почленное сложение&lt;br /&gt;
mul - почленное умножение&lt;br /&gt;
div - почленное деление&lt;br /&gt;
max/min - почленный максимум/минимум&lt;br /&gt;
v1:clamp(v2) -- почленное обрезание первого вторым&lt;br /&gt;
average -- почленное среднее&lt;br /&gt;
invert -- почленная инверсия знака&lt;br /&gt;
&lt;br /&gt;
v1:abs(v2); -- копирует почленно положительные компоненты в v1 из v2&lt;br /&gt;
lerp(v1, v2, number) -- линейная интерполяция между двумя векторами&lt;br /&gt;
-- если number больше 1, то выходит за них - экстраполяция&lt;br /&gt;
&lt;br /&gt;
v1:reflect(v2, v3) - должно быть отражение одного вектора от плоскости, определяемой другим. Не проверял&lt;br /&gt;
v1:slide(v2, v3); - вероятно, проекция одного вектора на плоскость, определяемую другим. Не уверен&lt;br /&gt;
v1:distance_to_xz(v2) - учитывая, что плоскость XZ - это плоскость параллельная земле, то возможно это &lt;br /&gt;
                        длина проекции на землю пути от точки до точки. Не проверял&lt;br /&gt;
&lt;br /&gt;
v:getP() - зенитный угол в радианах (угол наклона над плоскостью XZ )&lt;br /&gt;
v:getH() - азимутальный угол в радианах (угол в плоскости XZ между проекцией вектора на эту плоскость и осью Z)&lt;br /&gt;
setHP - соответственно для установки этих значений&lt;br /&gt;
v1:align() - выравнивает вектор вдоль оси x или z и нормирует его. Значение по y игнорируется. &lt;br /&gt;
             В итоге всегда возвращается одно из четырёх значений ([1,0,0], [-1,0,0], [0,0,1], [0,0,-1])&lt;br /&gt;
v4:mad(v1,v2,v3) -- бешеная операция =) умножить почленно второе на третье и сложить с &lt;br /&gt;
                    первым, т.е. v4 = v1 + v2*v3 (название операции mad == mul + add)&lt;br /&gt;
v1:inertion(v2, number) -- v1 = v2 + (v1-v2)*number (тоже почленно)&lt;br /&gt;
v1:similar(v2, number) -- сравнение векторов на равенство с погрешностью number. Выдаёт 1 или 0&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local v1 = vector()&lt;br /&gt;
v1:set(1,2,3)&lt;br /&gt;
local v2 = vector():set(4,5,6)&lt;br /&gt;
local dist = v1:distance_to(v2)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class fcolor==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class fcolor {&lt;br /&gt;
    property a; --альфа-цвет, отвечающий за прозрачность.&lt;br /&gt;
    property b; --blue-цвет, отвечающий за синий оттенок цвета.&lt;br /&gt;
    property g; --green-цвет, отвечающий за зелёный оттенок цвета.&lt;br /&gt;
    property r; --red-цвет, отвечающий за красный оттенок цвет.&lt;br /&gt;
&lt;br /&gt;
    fcolor ();&lt;br /&gt;
&lt;br /&gt;
    function set(number, number, number, number); --установка цвета (r,g,b,a)&lt;br /&gt;
    function set(const fcolor&amp;amp;); --установка цвета по уже имеющемуся классу &amp;quot;fcolor()&amp;quot;&lt;br /&gt;
    function set(number); -- не знаю. предполагаю, что есть несколько заранее подготовленных цветов с индексами для каждого.&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
color = fcolor()&lt;br /&gt;
color.a = 50&lt;br /&gt;
color.g = 255&lt;br /&gt;
color.r = 100&lt;br /&gt;
color.b = 50&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
или&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
color = fcolor()&lt;br /&gt;
color:set(100,255,50,50)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class hit==&lt;br /&gt;
Бывают случаи, при которых необходимо нанести некоторый урон неписю или мобу, при этом имитировав попадание в него. Для этого существует метод класса game_object:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function hit(hit*);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Чтобы использовать этот метод, нужно указать аргументы. В данном случае имеет объект другого класса - hit. Вот его описание:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class hit {&lt;br /&gt;
    const burn = 0; --здесь идут константы типов урона, используемых в свойстве &amp;quot;type&amp;quot;. Все мы прекрасно знаем, что означает каждый.&lt;br /&gt;
    const chemical_burn = 6;&lt;br /&gt;
    const dummy = 11;&lt;br /&gt;
    const explosion = 7;&lt;br /&gt;
    const fire_wound = 8;&lt;br /&gt;
    const radiation = 4;&lt;br /&gt;
    const shock = 1;&lt;br /&gt;
    const strike = 2;&lt;br /&gt;
    const telepatic = 5;&lt;br /&gt;
    const wound = 3;&lt;br /&gt;
&lt;br /&gt;
    property direction; --дирекция урона&lt;br /&gt;
    property draftsman; --обозначает персонажа, нанёсшего урон.&lt;br /&gt;
    property impulse; --импульс урона&lt;br /&gt;
    property power; --сила урона&lt;br /&gt;
    property type; -- тип урона (см. константы)&lt;br /&gt;
&lt;br /&gt;
    hit ();&lt;br /&gt;
    hit (const hit*);&lt;br /&gt;
&lt;br /&gt;
    function bone(string); --метод с указанием кости урона&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
hit = hit() -- создание объекта класса hit&lt;br /&gt;
hit.direction = vector():set(1,0,0) --дирекция по оси x&lt;br /&gt;
hit.draftsman = db.actor --нанёс урон актор&lt;br /&gt;
hit.impulse = 600 --импульс&lt;br /&gt;
hit.power = 1.45 --хит&lt;br /&gt;
hit.type = 2 --тип урона - выстрел&lt;br /&gt;
hit:bone(&amp;quot;bip01_head&amp;quot;) -- удар приходится на голову&lt;br /&gt;
obj:hit(hit)&lt;br /&gt;
-- наносим урон&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==&amp;quot;Функции времени&amp;quot;==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
time_global() -- реальное время (в миллисекундах) с начала запуска программы&lt;br /&gt;
game.time() -- игровое время (в игровых миллисекундах) с начала игры (т.е. с начала прохождения игры)&lt;br /&gt;
level.get_time_days() -- день месяца по игровому времени&lt;br /&gt;
level.get_time_hours() -- час текущего игрового дня&lt;br /&gt;
level.get_time_minutes() -- минута текущего игрового часа&lt;br /&gt;
&lt;br /&gt;
level.get_time_factor() -- возвращает отношение скорости течения игрового времени к скорости реального &lt;br /&gt;
                        --(game_time_speed / real_time_speed)&lt;br /&gt;
level.set_time_factor(number) -- устанавливает это отношение&lt;br /&gt;
&lt;br /&gt;
game.get_game_time() -- возвращает игровое время в виде объекта класса CTime. Класс CTime я опишу подробно &lt;br /&gt;
                     -- как-нибудь потом, а пока опишу только пару его методов.&lt;br /&gt;
конструктор. Вызывается через пространство имён game&lt;br /&gt;
game.CTime()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Дефолтовые значения===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
year, month, day = 1 &lt;br /&gt;
hour, min, sek, ms = 0&lt;br /&gt;
CTime.set(year, month, day, hour, min, sek, ms) -- устанавливает все данные о времени&lt;br /&gt;
метод CTime.get описан так:&lt;br /&gt;
function get(number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;);&lt;br /&gt;
что наводит на мысль о семи аргументах. однако с точки зрения Lua этот метод не принимает аргументов, зато возвращает семь значений. &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
====Пример использования обоих методов:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local t = game.CTime() -- создания объекта с дефолтовыми значнеиями&lt;br /&gt;
t:set(2009, 7, 11, 8, 11, 22, 333) -- установили все значения&lt;br /&gt;
&lt;br /&gt;
local y,m,d,h,min,sec,ms = t:get() -- получили все значения&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
===Класс CTime (неразобранный)===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class CTime {&lt;br /&gt;
const DateToDay = 0;&lt;br /&gt;
const DateToMonth = 1;&lt;br /&gt;
const DateToYear = 2;&lt;br /&gt;
const TimeToHours = 0;&lt;br /&gt;
const TimeToMilisecs = 3;&lt;br /&gt;
const TimeToMinutes = 1;&lt;br /&gt;
const TimeToSeconds = 2;&lt;br /&gt;
&lt;br /&gt;
CTime ();&lt;br /&gt;
CTime (const CTime&amp;amp;);&lt;br /&gt;
&lt;br /&gt;
function sub(CTime*);&lt;br /&gt;
function timeToString(number);&lt;br /&gt;
function dateToString(number);&lt;br /&gt;
operator ==(const CTime&amp;amp;, CTime);&lt;br /&gt;
function get(number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;);&lt;br /&gt;
function set(number, number, number, number, number, number, number);&lt;br /&gt;
function setHMSms(number, number, number, number);&lt;br /&gt;
function diffSec(CTime*);&lt;br /&gt;
operator &amp;lt;(const CTime&amp;amp;, CTime);&lt;br /&gt;
operator +(CTime&amp;amp;, CTime);&lt;br /&gt;
operator &amp;gt;=(const CTime&amp;amp;, CTime);&lt;br /&gt;
function setHMS(number, number, number);&lt;br /&gt;
operator &amp;gt;(const CTime&amp;amp;, CTime);&lt;br /&gt;
operator -(CTime&amp;amp;, CTime);&lt;br /&gt;
operator &amp;lt;=(const CTime&amp;amp;, CTime);&lt;br /&gt;
function add(CTime*);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==класс CUIScriptWnd==&lt;br /&gt;
CUIScriptWnd(); --для работы с окном...&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    function _construct();&lt;br /&gt;
    function Register(CUIWindow*);&lt;br /&gt;
    function Register(CUIWindow*, string);&lt;br /&gt;
    function Enable(boolean);        --вкл/выкл&lt;br /&gt;
    function SetHeight(number);  --установка высоты&lt;br /&gt;
    function GetFrameLineWnd(string);&lt;br /&gt;
    function SetHolder(CDialogHolder*);&lt;br /&gt;
    function GetWidth() const;  --получение ширины контрола&lt;br /&gt;
    function GetCheckButton(string);--Получение состояния checkBox ,на выходе true или false?&lt;br /&gt;
    function DetachChild(CUIWindow*);&lt;br /&gt;
    function SetPPMode();&lt;br /&gt;
    function SetFont(CGameFont*);  --установка шрифта по имени&lt;br /&gt;
    function IsShown();                --проверка видно ли контрол иль нет?&lt;br /&gt;
    function Show(boolean);            --показывать контолили нет?&lt;br /&gt;
    function GetHeight() const;        --возвращает высоту&lt;br /&gt;
    function SetWidth(number);        --устанавливает ширину&lt;br /&gt;
    function GetListWndEx(string);&lt;br /&gt;
    function IsEnabled();&lt;br /&gt;
    function ResetPPMode();&lt;br /&gt;
    function GetPropertiesBox(string);&lt;br /&gt;
    function GetFont();                --возвращает шрифт установленный setFont?&lt;br /&gt;
    function Update();&lt;br /&gt;
    function AddCallback(string, number, const function&amp;lt;void&amp;gt;&amp;amp;); --соответские контрола с действие?&lt;br /&gt;
    function AddCallback(string, number, const function&amp;lt;void&amp;gt;&amp;amp;, object);--соответские контрола с действие?&lt;br /&gt;
    function GetButton(string);--Получаем последнюю нажатую кнопку?&lt;br /&gt;
    function SetAutoDelete(boolean);&lt;br /&gt;
    function OnKeyboard(number, enum EUIMessages);--Колбек нажатия на клавиатуре&lt;br /&gt;
    function Dispatch(number, number);&lt;br /&gt;
    function GetListWnd(string);--получение окна ListBoxa?&lt;br /&gt;
    function AttachChild(CUIWindow*);&lt;br /&gt;
    function GetStatic(string);--получение текста метки&lt;br /&gt;
    function SetWndPos(number, number);--установка позиции окна(x,y)&lt;br /&gt;
    function GetTabControl(string);&lt;br /&gt;
    function GetRadioButton(string);--состояние RadioButtton на выходите true или false&lt;br /&gt;
    function Init(number, number, number, number);--инициализация окна...читай FormInitializatione (x,y,width,height)&lt;br /&gt;
    function Init(Frect*);--инициализация окна&lt;br /&gt;
    function GetFrameWindow(string);&lt;br /&gt;
    function WindowName();&lt;br /&gt;
    function GetDialogWnd(string);&lt;br /&gt;
    function GetHolder();&lt;br /&gt;
    function SetWndRect(Frect);--установка координат углов&lt;br /&gt;
    function SetWndRect(number, number, number, number);--установка координат углов&lt;br /&gt;
    function GetEditBox(string);--получение текста из ЭдитБокса&lt;br /&gt;
    function SetWindowName(string);--Устанавливаем имя форме(caption)&lt;br /&gt;
    function GetProgressBar(string);&lt;br /&gt;
    function GetMessageBox(string);&lt;br /&gt;
    function SetWndSize(number, number);&lt;br /&gt;
    function Load(string);&lt;br /&gt;
    function IsAutoDelete();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
Статья создана: [[Участник:malandrinus|malandrinus]], [[Участник:IQDDD|IQDDD]], [[Участник:меченый|меченый]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>95.25.99.189</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC</id>
		<title>Справочник по функциям и классам</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC"/>
				<updated>2009-07-11T23:02:18Z</updated>
		
		<summary type="html">&lt;p&gt;95.25.99.189: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Посты с форума AMK&lt;br /&gt;
&lt;br /&gt;
==Основы==&lt;br /&gt;
Lua(в Сталкере,дальше просто '''Lua''') можно использовать не только для игрового процесса... Доступны основные(а может и все) команды(функции) к примеру Оператор ввода/вывода..работа с фаилами и т.д.(Возможно,только в ЧН....)&lt;br /&gt;
вот простой пример:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function to_my_log(text)&lt;br /&gt;
io.open(&amp;quot;gamedata\\solinx_log.txt&amp;quot;,&amp;quot;w&amp;quot;):write( text, &amp;quot;\n&amp;quot; )&lt;br /&gt;
io.open(&amp;quot;gamedata\\solinx_log.txt&amp;quot;,&amp;quot;w&amp;quot;):close()&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Рассмотрим подробнее===&lt;br /&gt;
io.open(filename) - &amp;quot;открывает&amp;quot; для каких либо целей filename&lt;br /&gt;
:write(text,&amp;quot;\n&amp;quot;) - оператор вывода,выводит(читай вписывает) в фаил открытый с помощью io.open , строку text...после переходит на следующую строку(есть ещё:&amp;quot;\t&amp;quot;,&amp;quot;\w&amp;quot;)&lt;br /&gt;
:read(text) - оператор ввода,вводит (читай &amp;quot;читает&amp;quot;) из фаила открытого с помощью io.open,строку текст&lt;br /&gt;
:close() - закрывает фаил открытый с помощью io.open&lt;br /&gt;
&lt;br /&gt;
статьи по Lua(основам) можно найти тут http://www.lua.ru/doc/&lt;br /&gt;
&lt;br /&gt;
Также есть функции &amp;quot;преобразования&amp;quot; ,как в любом языке(скриптовом,программирования)&lt;br /&gt;
Преобразование числового значения(любого) в строку:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
tostring(c)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где с - это число&lt;br /&gt;
Преобразование строки в число:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
tonumber(string)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где string - это строка (вдруг кто не в курсе )&lt;br /&gt;
&lt;br /&gt;
Особенность Lua(по моему только в нём так,хотя кроме Lua только питон смотрел):&lt;br /&gt;
что после основных операторов(циклов,условного и т.д.)(if ,for,while...)&lt;br /&gt;
ставится end&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
if then&lt;br /&gt;
else&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for i,c do&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
while &amp;quot;true&amp;quot; do&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ещё одной особенность LUА ,можно назвать работу с массивами(читай &amp;quot;таблицами&amp;quot;) без цикла&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local tbl={}&lt;br /&gt;
&lt;br /&gt;
--заполнение&lt;br /&gt;
function objparams_to_tbl(obj)&lt;br /&gt;
if isstalker(obj) then&lt;br /&gt;
tbl.sec =obj:section()&lt;br /&gt;
tbl.hp=obj:health&lt;br /&gt;
....&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--применение&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function objparams_to_msg()&lt;br /&gt;
news_manager.send_tip(db.actor,&amp;quot;obj:section =&amp;quot;..tbl.sec..&amp;quot;obj:health =&amp;quot;..obj.hp,nil,nil,1000)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Массив можно очистить/заполнить/прочитать/преобразовать....&lt;br /&gt;
&lt;br /&gt;
И совет:Пользуйтесь SCiTE или любой другой редактор с выделением синтаксиса....&lt;br /&gt;
&lt;br /&gt;
===Работа с фаилами===&lt;br /&gt;
Через системный фаил(systems.ltx)&lt;br /&gt;
&lt;br /&gt;
system_ini():r_string(section,key) -- получение строки из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
system_ini():r_bool(section,key) --получение булевого значения (true,false) из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
system_ini():r_s32(section,key) --получение (целого?)числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
system_ini():r_float(section,key) --получение числа(с плавающей точкой) числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Через другой фаил(который не прописан в системе)&lt;br /&gt;
&lt;br /&gt;
local ini =ini_file(&amp;quot;&amp;quot;) -- путь до фаила (обьявляем переменную которая хранит имя и путь).Дальше также как и с системным фаилом&lt;br /&gt;
&lt;br /&gt;
ini:r_string(section,key) -- получение строки из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
ini:r_bool(section,key) --получение булевого значения (true,false) из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
ini:r_s32(section,key) --получение (целого?)числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
ini:r_float(section,key) --получение числа(с плавающей точкой) числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Вспомогательные функции===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
system_ini():line_exist( section, key ) -- проверяет существует ли в секции [section ] ключ key&lt;br /&gt;
system_ini():section_exist(section) --проверяет существует ли секция [section ]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
EG:&lt;br /&gt;
0function eg()&lt;br /&gt;
1local ini=ini_file(&amp;quot;gamedata\\test.ltx&amp;quot;)&lt;br /&gt;
2if not ini then ini=system_ini() end&lt;br /&gt;
3if ini:section_exist(&amp;quot;test_section&amp;quot;) then&lt;br /&gt;
4if ini:line_exist(&amp;quot;test_line&amp;quot;) then&lt;br /&gt;
5return true&lt;br /&gt;
6end&lt;br /&gt;
7end&lt;br /&gt;
8end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
1. - присваиваем переменной фаил&amp;lt;br&amp;gt;&lt;br /&gt;
2. - проверяем существует ли фаил ,если нет то работаем с системой&amp;lt;br&amp;gt;&lt;br /&gt;
3. - проверяем наличие секции в фаиле(системе)&amp;lt;br&amp;gt;&lt;br /&gt;
4. - проверяем наличие ключа в секции из фаила(системы)&amp;lt;br&amp;gt;&lt;br /&gt;
5. - возвращаем истину(нашли ключ)&lt;br /&gt;
&lt;br /&gt;
Проверка ,что из себя представляет переменная&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function check_type(obj)&lt;br /&gt;
if obj then&lt;br /&gt;
if type(obj)==&amp;quot;string&amp;quot; then&lt;br /&gt;
return &amp;quot;string&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;number&amp;quot; then&lt;br /&gt;
return &amp;quot;number&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;function&amp;quot; then&lt;br /&gt;
return &amp;quot;function&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;boolean&amp;quot; then&lt;br /&gt;
return &amp;quot;boolean&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;userdata&amp;quot; then&lt;br /&gt;
return &amp;quot;userdata&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;table&amp;quot; then&lt;br /&gt;
return &amp;quot;table&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Теперь по порядку...&amp;lt;br&amp;gt;&lt;br /&gt;
Если obj это строка ,то возвращаем &amp;quot;string&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это число ,то возвращаем &amp;quot;number&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это функция ,то возвращаем &amp;quot;function&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это булево значение ,то возвращаем &amp;quot;booolean&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это юзердата(хз что это),то возвращаем &amp;quot;userdata&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это таблица, то возвращаем &amp;quot;table&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Это поможет в таких случаях ,когда неизвестно какой тип данных поступает в то или иное место...&lt;br /&gt;
&lt;br /&gt;
==Структура Lua_help==&lt;br /&gt;
Сам фаил можно найти в '''gamedata\scripts\lua_help.script'''&lt;br /&gt;
&amp;lt;code&amp;gt;C++ class [класс] {&lt;br /&gt;
     const [описание1] = [константа1];&lt;br /&gt;
     const [описание2] = [константа2];&lt;br /&gt;
     ...&lt;br /&gt;
     [константы заменяют описания при вызове методов классов];&lt;br /&gt;
     &lt;br /&gt;
     property [свойство1];&lt;br /&gt;
     property [свойство2];&lt;br /&gt;
     ...&lt;br /&gt;
[свойства (property) - это характеристика какого-либо класса, которая может подвергаться мат. операциям, слияниям, присвояниям и пр.&lt;br /&gt;
     читаются через точку: obj.health];&lt;br /&gt;
&lt;br /&gt;
     [глобальная(-ые) функция(-ии), которой вызывается класс];&lt;br /&gt;
     function [метод1] ([аргумент 1 функции 1], [аргумент 2 функции 1]...);&lt;br /&gt;
     function [метод2] ([аргумент 1 функции2]...);&lt;br /&gt;
             ...&lt;br /&gt;
     [методы - это специальные функции, выполняющие операции с классами и возвращающие значения после операций над классами.&lt;br /&gt;
     вызываются через двоеточие: obj:add_animation(...)];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Создание своего класса==&lt;br /&gt;
Свой класс можно добавить так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class &amp;quot;my_cool_class&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь &amp;quot;my_cool_class&amp;quot; - имя моего нового класса. Записывается в кавычках, т.е. это строка.&lt;br /&gt;
&lt;br /&gt;
Потом можно добавлять к этому классу свои методы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- это специальный метод - конструктор. Будет вызван при создании класса.&lt;br /&gt;
function my_cool_class:__init(num)&lt;br /&gt;
    self.my_param = num -- добавили в свой класс переменную&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- обычный метод&lt;br /&gt;
function my_cool_class:cool_method_of_my_class()&lt;br /&gt;
    get_console():execute(&amp;quot;lua_bind_in_action_&amp;quot;..self.my_param)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- деструктор, вызывается при сборке объекта сборщиком мусора. Аргументов не имеет (кроме скрытого self. об этом см. далее)&lt;br /&gt;
function my_cool_class:__finalize()&lt;br /&gt;
    get_console():execute(&amp;quot;good_by_&amp;quot;..self.my_param)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Потом можно создавать экземпляры своего класса, вызывать их методы и пр.:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local obj1 = my_cool_class(1) -- здесь создаётся новый объект. При этом вызывается конструктор и &lt;br /&gt;
                              -- ему передаются аргументы этого вызова (в данном случае число 1).&lt;br /&gt;
local obj2 = my_cool_class(4)&lt;br /&gt;
obj1:cool_method_of_my_class()&lt;br /&gt;
obj2:cool_method_of_my_class()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как только объект становится ненужным (т.е. на него больше нет ссылок) он удаляется сборщиком мусора. При этом вызывается его метод __finalize&lt;br /&gt;
&lt;br /&gt;
При чём здесь self.&lt;br /&gt;
self - это скрытый первый аргумент. Конструкция вида:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function class_name:fun_name(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
на самом деле эквивалентна конструкции &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function class_name.fun_name(self, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Обратите внимание на двоеточие в первом случае и точку во втором.&amp;lt;br&amp;gt;&lt;br /&gt;
При вызове метода конструкция вида:&lt;br /&gt;
&lt;br /&gt;
'''object_name:fun_name(&amp;lt;список аргументов&amp;gt;)'''&lt;br /&gt;
&lt;br /&gt;
эквивалентна конструкции&lt;br /&gt;
&lt;br /&gt;
'''object_name.fun_name(object_name, &amp;lt;список аргументов&amp;gt;)'''&lt;br /&gt;
&lt;br /&gt;
Это означает, что в качестве self как правило передаётся сам же объект. &amp;quot;Как правило&amp;quot; - это потому, что можно в принципе передать что-то другое. Но лучше этого соглашения не нарушать.&lt;br /&gt;
&lt;br /&gt;
Всё это здорово, но какая от этого польза? Ну сделал я свой класс, и что с ним делать?&lt;br /&gt;
&lt;br /&gt;
В общем, классы - это неплохое средство организации своего кода. Владеющие объектно-ориентированным подходом найдут это расширение весьма удобным. В частности такие, ни к чему не привязанные классы, в скриптах сталкера используются в некоторых местах. Однако, настоящая сила этой технологии не в этом. С помощью этой технологии можно расширять классы, экспортированные в Lua со стороны движка игры. Об этом пойдет речь в следующей части.&lt;br /&gt;
&lt;br /&gt;
==Наследование от экспортированных классов==&lt;br /&gt;
Итак, кроме создания собственных классов технология Luabind позволяет создавать класы на основе уже существующих. Это реализовано в виде своеобразного наследования. Делается это с помощью следующей конструкции:&lt;br /&gt;
&lt;br /&gt;
'''class &amp;quot;my_derived_class&amp;quot; (base_class)'''&lt;br /&gt;
&lt;br /&gt;
Здесь:&lt;br /&gt;
&amp;quot;my_derived_class&amp;quot; как и раньше - это имя нового класса.&amp;lt;br&amp;gt;&lt;br /&gt;
base_class - это уже существующий класс, который будет базовым для вновь созданного. Имя выбрано произвольно, но подразумевается, что такой класс экспортирован и предназначен для наследования.&amp;lt;br&amp;gt;&lt;br /&gt;
Далеко не любой класс из экспортированных со стороны хост-приложения можно использовать в качестве базового. На стороне хост-приложения должен быть создан специальный класс-обёртка. Если его нет, то ничего хорошего не выйдет. Скорее всего при попытке использовать унаследованный класс в Lua будут малопонятные проблемы и вылеты, так что надо знать совершенно точно, можно ли от конкретного класса наследовать.&amp;lt;br&amp;gt;&lt;br /&gt;
Вопрос, какой глубины может быть наследование, т.е. можно ли наследовать от производного класса, мне пока до конца не ясен. С другой стороны, в этом практически нет необходимости.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итак после выполнения указанной конструкции появляется класс my_derived_class, который является копией класса base_class. У него есть в точности те же методы, что и у его базового класса. Пока от этого мало толку. Но теперь можно переопределить методы нашего класса, изменив таким образом его поведение. Делается это так же, как и ранее, но с некоторыми дополнениями.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- конструктор&lt;br /&gt;
function my_derived_class:__init(num) super(num)&lt;br /&gt;
end&lt;br /&gt;
-- обычный метод&lt;br /&gt;
function my_cool_class:some_method(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
    base_class.some_method(self, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
-- деструктор&lt;br /&gt;
function my_cool_class:__finalize()&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На что стОит обратить внимание.&amp;lt;br&amp;gt;&lt;br /&gt;
Во-первых, конструкция super(num). Это вызов конструктора базового класса.&amp;lt;br&amp;gt;&lt;br /&gt;
Во-вторых, для вызова метода базового класса из метода унаследованного используется другая конструкция base_class.some_method(self, ). Здесь надо использовать альтернативную форму вызова метода (с точкой и явным указанием первого аргумента self).&amp;lt;br&amp;gt;&lt;br /&gt;
Наконец, метод __finalize() не требует вызова этого же метода для базового класса, поскольку тот будет вызван автоматически при удалении объекта сборщиком мусора.&lt;br /&gt;
&lt;br /&gt;
Собственно и всё. Теперь можно пользоваться созданным классом: создавать объекты этого класса, вызывать их методы и пр. Здесь уже всё зависит от конкретных целей и требует знания конкретных классов.&lt;br /&gt;
&lt;br /&gt;
==сlass alife_simulator==&lt;br /&gt;
alife_simulator - класс для управления серверными объектами. В игре существует всего один экземпляр такого класса, и получить его можно с помощью вызова глобальной функции alife().&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
level_name(level_id) -- возвращает имя уровня по его id&lt;br /&gt;
create_ammo(&amp;lt;имя секции патронов&amp;gt;, position, lvid, gvid, id, amount) - создание пачек с патронами&lt;br /&gt;
create(&amp;lt;имя секции объекта&amp;gt;, position, lvid, gvid, id) -- создание объектов в инвентаре&lt;br /&gt;
create(&amp;lt;имя секции объекта&amp;gt;, position, lvid, gvid) -- создание объектов на уровне&lt;br /&gt;
во всех функция создания объектов&lt;br /&gt;
position - объект класса vector. Не может быть nil, иначе вылет&lt;br /&gt;
lvid - level vertex id&lt;br /&gt;
gvid - game vertex id&lt;br /&gt;
id - это куда спавним. Если в инвентарь, то указываем id непися или ноль (для актора)&lt;br /&gt;
release(sobj, boolean) -- удаляет объект sobj. Зачем второй булевский аргумент - не известно. &lt;br /&gt;
                          Во всех примерах он либо отсутствует, либо установлен в true&lt;br /&gt;
object(id) -- возвращает серверный объект по его id. Если не нашёл nil&lt;br /&gt;
story_object(sid) -- возвращает серверный объект по его story id. Если не нашёл nil&lt;br /&gt;
actor() -- возвращает серверный объект актора&lt;br /&gt;
set_switch_online(id, boolean) -- переводит в онлайн объект с идентификатором id&lt;br /&gt;
set_switch_offline(id, boolean) -- то же , но в онлайн&lt;br /&gt;
dont_has_info(const number&amp;amp;, string); -- проверка на Неполученный инфопоршень(db.actor:dont_has_info(&amp;quot;infoportion&amp;quot;) &lt;br /&gt;
                                      -- или alife():actor():dont_has_info(&amp;quot;infoportion&amp;quot;)).&lt;br /&gt;
has_info - противоположная&lt;br /&gt;
&lt;br /&gt;
предположительно:&lt;br /&gt;
switch_distance() -- радиус переключения в оффлайн?&lt;br /&gt;
switch_distance(number) -- установка этого радиуса?&lt;br /&gt;
level_id() -- текущий номер уровня ?&lt;br /&gt;
object(string) -- получение объекта оп его имени. Не помню точно, что за имя.&lt;br /&gt;
object(number, boolean) - то же, что и object(number)? на что влияет второй аргумент?&lt;br /&gt;
valid_object_id(number) -- проверка наличия объекта по id?&lt;br /&gt;
alife():create( &amp;lt;индекс объекта в all.spawn&amp;gt; ) -- &lt;br /&gt;
spawn_id(number) -- индекс объекта в all.spawn для объекта с заданным id ?&lt;br /&gt;
&lt;br /&gt;
неизвестно:&lt;br /&gt;
add_out_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
set_interactive(number, boolean);&lt;br /&gt;
add_in_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
function remove_in_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
remove_out_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
kill_entity(cse_alife_monster_abstract*, const number&amp;amp;, cse_alife_schedulable*);&lt;br /&gt;
kill_entity(alife_simulator*, cse_alife_monster_abstract*, const number&amp;amp;);&lt;br /&gt;
kill_entity(alife_simulator*, cse_alife_monster_abstract*);&lt;br /&gt;
has_info(const number&amp;amp;, string);&lt;br /&gt;
remove_all_restrictions(number, const enum RestrictionSpace::ERestrictorTypes&amp;amp;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local sim = alife() -- получаем сам объект класса alife_simulator&lt;br /&gt;
local sactor = sim:actor() -- получаем серверный объект для актора&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class vector==&lt;br /&gt;
vector - вспомогательный класс, содержащий три координаты, и позволяющий выполнять с ними различные манипуляции. Объекты класса vector являются аргументами многих функций и возвращаются многими функциями. См. например выше про метод create класса alife_simulator. Отдельный объект класса вектор создаётся вызовом глобальной функции vector(). При создании имеет координаты [0,0,0].&lt;br /&gt;
&lt;br /&gt;
===Список методов класса vector===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
v:set_length(number) - оставить направление, изменить длину&lt;br /&gt;
v:normalize(); - сделать длину единичной&lt;br /&gt;
&lt;br /&gt;
v:magnitude() -- длина вектора v&lt;br /&gt;
v1:distance_to(v2) -- расстояние между v1 и v2&lt;br /&gt;
v1:distance_to_sqr(v2) -- квадрат расстояния между v1 и v2&lt;br /&gt;
v1:crossproduct(v2) -- векторное произведение. Возвращает вектор&lt;br /&gt;
v1:dotproduct(v2) -- скалярное произведение. Возвращает число&lt;br /&gt;
v:sub(number); -- вычесть из каждого компонента v число number&lt;br /&gt;
v1:sub(v2); -- вычесть почленно вектор v2 из v1 и поместить в v1&lt;br /&gt;
v1:sub(v2, v3) -- вычесть из v2 - v3 и поместить в v1&lt;br /&gt;
аналогично:&lt;br /&gt;
add - почленное сложение&lt;br /&gt;
mul - почленное умножение&lt;br /&gt;
div - почленное деление&lt;br /&gt;
max/min - почленный максимум/минимум&lt;br /&gt;
v1:clamp(v2) -- почленное обрезание первого вторым&lt;br /&gt;
average -- почленное среднее&lt;br /&gt;
invert -- почленная инверсия знака&lt;br /&gt;
&lt;br /&gt;
v1:abs(v2); -- копирует почленно положительные компоненты в v1 из v2&lt;br /&gt;
lerp(v1, v2, number) -- линейная интерполяция между двумя векторами&lt;br /&gt;
-- если number больше 1, то выходит за них - экстраполяция&lt;br /&gt;
&lt;br /&gt;
v1:reflect(v2, v3) - должно быть отражение одного вектора от плоскости, определяемой другим. Не проверял&lt;br /&gt;
v1:slide(v2, v3); - вероятно, проекция одного вектора на плоскость, определяемую другим. Не уверен&lt;br /&gt;
v1:distance_to_xz(v2) - учитывая, что плоскость XZ - это плоскость параллельная земле, то возможно это &lt;br /&gt;
                        длина проекции на землю пути от точки до точки. Не проверял&lt;br /&gt;
&lt;br /&gt;
v:getP() - зенитный угол в радианах (угол наклона над плоскостью XZ )&lt;br /&gt;
v:getH() - азимутальный угол в радианах (угол в плоскости XZ между проекцией вектора на эту плоскость и осью Z)&lt;br /&gt;
setHP - соответственно для установки этих значений&lt;br /&gt;
v1:align() - выравнивает вектор вдоль оси x или z и нормирует его. Значение по y игнорируется. &lt;br /&gt;
             В итоге всегда возвращается одно из четырёх значений ([1,0,0], [-1,0,0], [0,0,1], [0,0,-1])&lt;br /&gt;
v4:mad(v1,v2,v3) -- бешеная операция =) умножить почленно второе на третье и сложить с &lt;br /&gt;
                    первым, т.е. v4 = v1 + v2*v3 (название операции mad == mul + add)&lt;br /&gt;
v1:inertion(v2, number) -- v1 = v2 + (v1-v2)*number (тоже почленно)&lt;br /&gt;
v1:similar(v2, number) -- сравнение векторов на равенство с погрешностью number. Выдаёт 1 или 0&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local v1 = vector()&lt;br /&gt;
v1:set(1,2,3)&lt;br /&gt;
local v2 = vector():set(4,5,6)&lt;br /&gt;
local dist = v1:distance_to(v2)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class fcolor==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class fcolor {&lt;br /&gt;
    property a; --альфа-цвет, отвечающий за прозрачность.&lt;br /&gt;
    property b; --blue-цвет, отвечающий за синий оттенок цвета.&lt;br /&gt;
    property g; --green-цвет, отвечающий за зелёный оттенок цвета.&lt;br /&gt;
    property r; --red-цвет, отвечающий за красный оттенок цвет.&lt;br /&gt;
&lt;br /&gt;
    fcolor ();&lt;br /&gt;
&lt;br /&gt;
    function set(number, number, number, number); --установка цвета (r,g,b,a)&lt;br /&gt;
    function set(const fcolor&amp;amp;); --установка цвета по уже имеющемуся классу &amp;quot;fcolor()&amp;quot;&lt;br /&gt;
    function set(number); -- не знаю. предполагаю, что есть несколько заранее подготовленных цветов с индексами для каждого.&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
color = fcolor()&lt;br /&gt;
color.a = 50&lt;br /&gt;
color.g = 255&lt;br /&gt;
color.r = 100&lt;br /&gt;
color.b = 50&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
или&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
color = fcolor()&lt;br /&gt;
color:set(100,255,50,50)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class hit==&lt;br /&gt;
Бывают случаи, при которых необходимо нанести некоторый урон неписю или мобу, при этом имитировав попадание в него. Для этого существует метод класса game_object:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function hit(hit*);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Чтобы использовать этот метод, нужно указать аргументы. В данном случае имеет объект другого класса - hit. Вот его описание:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class hit {&lt;br /&gt;
    const burn = 0; --здесь идут константы типов урона, используемых в свойстве &amp;quot;type&amp;quot;. Все мы прекрасно знаем, что означает каждый.&lt;br /&gt;
    const chemical_burn = 6;&lt;br /&gt;
    const dummy = 11;&lt;br /&gt;
    const explosion = 7;&lt;br /&gt;
    const fire_wound = 8;&lt;br /&gt;
    const radiation = 4;&lt;br /&gt;
    const shock = 1;&lt;br /&gt;
    const strike = 2;&lt;br /&gt;
    const telepatic = 5;&lt;br /&gt;
    const wound = 3;&lt;br /&gt;
&lt;br /&gt;
    property direction; --дирекция урона&lt;br /&gt;
    property draftsman; --обозначает персонажа, нанёсшего урон.&lt;br /&gt;
    property impulse; --импульс урона&lt;br /&gt;
    property power; --сила урона&lt;br /&gt;
    property type; -- тип урона (см. константы)&lt;br /&gt;
&lt;br /&gt;
    hit ();&lt;br /&gt;
    hit (const hit*);&lt;br /&gt;
&lt;br /&gt;
    function bone(string); --метод с указанием кости урона&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
hit = hit() -- создание объекта класса hit&lt;br /&gt;
hit.direction = vector():set(1,0,0) --дирекция по оси x&lt;br /&gt;
hit.draftsman = db.actor --нанёс урон актор&lt;br /&gt;
hit.impulse = 600 --импульс&lt;br /&gt;
hit.power = 1.45 --хит&lt;br /&gt;
hit.type = 2 --тип урона - выстрел&lt;br /&gt;
hit:bone(&amp;quot;bip01_head&amp;quot;) -- удар приходится на голову&lt;br /&gt;
obj:hit(hit)&lt;br /&gt;
-- наносим урон&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==&amp;quot;Функции времени&amp;quot;==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
time_global() -- реальное время (в миллисекундах) с начала запуска программы&lt;br /&gt;
game.time() -- игровое время (в игровых миллисекундах) с начала игры (т.е. с начала прохождения игры)&lt;br /&gt;
level.get_time_days() -- день месяца по игровому времени&lt;br /&gt;
level.get_time_hours() -- час текущего игрового дня&lt;br /&gt;
level.get_time_minutes() -- минута текущего игрового часа&lt;br /&gt;
&lt;br /&gt;
level.get_time_factor() -- возвращает отношение скорости течения игрового времени к скорости реального &lt;br /&gt;
                        --(game_time_speed / real_time_speed)&lt;br /&gt;
level.set_time_factor(number) -- устанавливает это отношение&lt;br /&gt;
&lt;br /&gt;
game.get_game_time() -- возвращает игровое время в виде объекта класса CTime. Класс CTime я опишу подробно &lt;br /&gt;
                     -- как-нибудь потом, а пока опишу только пару его методов.&lt;br /&gt;
конструктор. Вызывается через пространство имён game&lt;br /&gt;
game.CTime()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Дефолтовые значения===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
year, month, day = 1 &lt;br /&gt;
hour, min, sek, ms = 0&lt;br /&gt;
CTime.set(year, month, day, hour, min, sek, ms) -- устанавливает все данные о времени&lt;br /&gt;
метод CTime.get описан так:&lt;br /&gt;
function get(number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;);&lt;br /&gt;
что наводит на мысль о семи аргументах. однако с точки зрения Lua этот метод не принимает аргументов, зато возвращает семь значений. &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
====Пример использования обоих методов:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local t = game.CTime() -- создания объекта с дефолтовыми значнеиями&lt;br /&gt;
t:set(2009, 7, 11, 8, 11, 22, 333) -- установили все значения&lt;br /&gt;
&lt;br /&gt;
local y,m,d,h,min,sec,ms = t:get() -- получили все значения&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
===Класс CTime (неразобранный)===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class CTime {&lt;br /&gt;
const DateToDay = 0;&lt;br /&gt;
const DateToMonth = 1;&lt;br /&gt;
const DateToYear = 2;&lt;br /&gt;
const TimeToHours = 0;&lt;br /&gt;
const TimeToMilisecs = 3;&lt;br /&gt;
const TimeToMinutes = 1;&lt;br /&gt;
const TimeToSeconds = 2;&lt;br /&gt;
&lt;br /&gt;
CTime ();&lt;br /&gt;
CTime (const CTime&amp;amp;);&lt;br /&gt;
&lt;br /&gt;
function sub(CTime*);&lt;br /&gt;
function timeToString(number);&lt;br /&gt;
function dateToString(number);&lt;br /&gt;
operator ==(const CTime&amp;amp;, CTime);&lt;br /&gt;
function get(number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;);&lt;br /&gt;
function set(number, number, number, number, number, number, number);&lt;br /&gt;
function setHMSms(number, number, number, number);&lt;br /&gt;
function diffSec(CTime*);&lt;br /&gt;
operator &amp;lt;(const CTime&amp;amp;, CTime);&lt;br /&gt;
operator +(CTime&amp;amp;, CTime);&lt;br /&gt;
operator &amp;gt;=(const CTime&amp;amp;, CTime);&lt;br /&gt;
function setHMS(number, number, number);&lt;br /&gt;
operator &amp;gt;(const CTime&amp;amp;, CTime);&lt;br /&gt;
operator -(CTime&amp;amp;, CTime);&lt;br /&gt;
operator &amp;lt;=(const CTime&amp;amp;, CTime);&lt;br /&gt;
function add(CTime*);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==класс CUIScriptWnd==&lt;br /&gt;
CUIScriptWnd(); --для работы с окном...&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    function _construct();&lt;br /&gt;
    function Register(CUIWindow*);&lt;br /&gt;
    function Register(CUIWindow*, string);&lt;br /&gt;
    function Enable(boolean);        --вкл/выкл&lt;br /&gt;
    function SetHeight(number);  --установка высоты&lt;br /&gt;
    function GetFrameLineWnd(string);&lt;br /&gt;
    function SetHolder(CDialogHolder*);&lt;br /&gt;
    function GetWidth() const;  --получение ширины контрола&lt;br /&gt;
    function GetCheckButton(string);--Получение состояния checkBox ,на выходе true или false?&lt;br /&gt;
    function DetachChild(CUIWindow*);&lt;br /&gt;
    function SetPPMode();&lt;br /&gt;
    function SetFont(CGameFont*);  --установка шрифта по имени&lt;br /&gt;
    function IsShown();                --проверка видно ли контрол иль нет?&lt;br /&gt;
    function Show(boolean);            --показывать контолили нет?&lt;br /&gt;
    function GetHeight() const;        --возвращает высоту&lt;br /&gt;
    function SetWidth(number);        --устанавливает ширину&lt;br /&gt;
    function GetListWndEx(string);&lt;br /&gt;
    function IsEnabled();&lt;br /&gt;
    function ResetPPMode();&lt;br /&gt;
    function GetPropertiesBox(string);&lt;br /&gt;
    function GetFont();                --возвращает шрифт установленный setFont?&lt;br /&gt;
    function Update();&lt;br /&gt;
    function AddCallback(string, number, const function&amp;lt;void&amp;gt;&amp;amp;); --соответские контрола с действие?&lt;br /&gt;
    function AddCallback(string, number, const function&amp;lt;void&amp;gt;&amp;amp;, object);--соответские контрола с действие?&lt;br /&gt;
    function GetButton(string);--Получаем последнюю нажатую кнопку?&lt;br /&gt;
    function SetAutoDelete(boolean);&lt;br /&gt;
    function OnKeyboard(number, enum EUIMessages);--Колбек нажатия на клавиатуре&lt;br /&gt;
    function Dispatch(number, number);&lt;br /&gt;
    function GetListWnd(string);--получение окна ListBoxa?&lt;br /&gt;
    function AttachChild(CUIWindow*);&lt;br /&gt;
    function GetStatic(string);--получение текста метки&lt;br /&gt;
    function SetWndPos(number, number);--установка позиции окна(x,y)&lt;br /&gt;
    function GetTabControl(string);&lt;br /&gt;
    function GetRadioButton(string);--состояние RadioButtton на выходите true или false&lt;br /&gt;
    function Init(number, number, number, number);--инициализация окна...читай FormInitializatione (x,y,width,height)&lt;br /&gt;
    function Init(Frect*);--инициализация окна&lt;br /&gt;
    function GetFrameWindow(string);&lt;br /&gt;
    function WindowName();&lt;br /&gt;
    function GetDialogWnd(string);&lt;br /&gt;
    function GetHolder();&lt;br /&gt;
    function SetWndRect(Frect);--установка координат углов&lt;br /&gt;
    function SetWndRect(number, number, number, number);--установка координат углов&lt;br /&gt;
    function GetEditBox(string);--получение текста из ЭдитБокса&lt;br /&gt;
    function SetWindowName(string);--Устанавливаем имя форме(caption)&lt;br /&gt;
    function GetProgressBar(string);&lt;br /&gt;
    function GetMessageBox(string);&lt;br /&gt;
    function SetWndSize(number, number);&lt;br /&gt;
    function Load(string);&lt;br /&gt;
    function IsAutoDelete();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
Статья создана: [[Участник:malandrinus|malandrinus]], [[Участник:IQDDD|IQDDD]], [[Участник:меченый|меченый]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>95.25.99.189</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC</id>
		<title>Справочник по функциям и классам</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC"/>
				<updated>2009-07-11T23:01:27Z</updated>
		
		<summary type="html">&lt;p&gt;95.25.99.189: /* Создание своего класса */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Посты с форума AMK&lt;br /&gt;
&lt;br /&gt;
==Основы==&lt;br /&gt;
Lua(в Сталкере,дальше просто '''Lua''' ) можно использовать не только для игрового процесса... Доступны основные(а может и все) команды(функции) к примеру Оператор ввода/вывода..работа с фаилами и т.д.(Возможно,только в ЧН....)&lt;br /&gt;
вот простой пример:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function to_my_log(text)&lt;br /&gt;
io.open(&amp;quot;gamedata\\solinx_log.txt&amp;quot;,&amp;quot;w&amp;quot;):write( text, &amp;quot;\n&amp;quot; )&lt;br /&gt;
io.open(&amp;quot;gamedata\\solinx_log.txt&amp;quot;,&amp;quot;w&amp;quot;):close()&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Рассмотрим подробнее===&lt;br /&gt;
io.open(filename) - &amp;quot;открывает&amp;quot; для каких либо целей filename&lt;br /&gt;
:write(text,&amp;quot;\n&amp;quot;) - оператор вывода,выводит(читай вписывает) в фаил открытый с помощью io.open , строку text...после переходит на следующую строку(есть ещё:&amp;quot;\t&amp;quot;,&amp;quot;\w&amp;quot;)&lt;br /&gt;
:read(text) - оператор ввода,вводит (читай &amp;quot;читает&amp;quot;) из фаила открытого с помощью io.open,строку текст&lt;br /&gt;
:close() - закрывает фаил открытый с помощью io.open&lt;br /&gt;
&lt;br /&gt;
статьи по Lua(основам) можно найти тут http://www.lua.ru/doc/&lt;br /&gt;
&lt;br /&gt;
Также есть функции &amp;quot;преобразования&amp;quot; ,как в любом языке(скриптовом,программирования)&lt;br /&gt;
Преобразование числового значения(любого) в строку:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
tostring(c)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где с - это число&lt;br /&gt;
Преобразование строки в число:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
tonumber(string)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где string - это строка (вдруг кто не в курсе )&lt;br /&gt;
&lt;br /&gt;
Особенность Lua(по моему только в нём так,хотя кроме Lua только питон смотрел):&lt;br /&gt;
что после основных операторов(циклов,условного и т.д.)(if ,for,while...)&lt;br /&gt;
ставится end&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
if then&lt;br /&gt;
else&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for i,c do&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
while &amp;quot;true&amp;quot; do&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ещё одной особенность LUА ,можно назвать работу с массивами(читай &amp;quot;таблицами&amp;quot;) без цикла&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local tbl={}&lt;br /&gt;
&lt;br /&gt;
--заполнение&lt;br /&gt;
function objparams_to_tbl(obj)&lt;br /&gt;
if isstalker(obj) then&lt;br /&gt;
tbl.sec =obj:section()&lt;br /&gt;
tbl.hp=obj:health&lt;br /&gt;
....&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--применение&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function objparams_to_msg()&lt;br /&gt;
news_manager.send_tip(db.actor,&amp;quot;obj:section =&amp;quot;..tbl.sec..&amp;quot;obj:health =&amp;quot;..obj.hp,nil,nil,1000)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Массив можно очистить/заполнить/прочитать/преобразовать....&lt;br /&gt;
&lt;br /&gt;
И совет:Пользуйтесь SCiTE или любой другой редактор с выделением синтаксиса....&lt;br /&gt;
&lt;br /&gt;
===Работа с фаилами===&lt;br /&gt;
Через системный фаил(systems.ltx)&lt;br /&gt;
&lt;br /&gt;
system_ini():r_string(section,key) -- получение строки из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
system_ini():r_bool(section,key) --получение булевого значения (true,false) из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
system_ini():r_s32(section,key) --получение (целого?)числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
system_ini():r_float(section,key) --получение числа(с плавающей точкой) числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Через другой фаил(который не прописан в системе)&lt;br /&gt;
&lt;br /&gt;
local ini =ini_file(&amp;quot;&amp;quot;) -- путь до фаила (обьявляем переменную которая хранит имя и путь).Дальше также как и с системным фаилом&lt;br /&gt;
&lt;br /&gt;
ini:r_string(section,key) -- получение строки из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
ini:r_bool(section,key) --получение булевого значения (true,false) из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
ini:r_s32(section,key) --получение (целого?)числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
ini:r_float(section,key) --получение числа(с плавающей точкой) числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Вспомогательные функции===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
system_ini():line_exist( section, key ) -- проверяет существует ли в секции [section ] ключ key&lt;br /&gt;
system_ini():section_exist(section) --проверяет существует ли секция [section ]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
EG:&lt;br /&gt;
0function eg()&lt;br /&gt;
1local ini=ini_file(&amp;quot;gamedata\\test.ltx&amp;quot;)&lt;br /&gt;
2if not ini then ini=system_ini() end&lt;br /&gt;
3if ini:section_exist(&amp;quot;test_section&amp;quot;) then&lt;br /&gt;
4if ini:line_exist(&amp;quot;test_line&amp;quot;) then&lt;br /&gt;
5return true&lt;br /&gt;
6end&lt;br /&gt;
7end&lt;br /&gt;
8end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
1. - присваиваем переменной фаил&amp;lt;br&amp;gt;&lt;br /&gt;
2. - проверяем существует ли фаил ,если нет то работаем с системой&amp;lt;br&amp;gt;&lt;br /&gt;
3. - проверяем наличие секции в фаиле(системе)&amp;lt;br&amp;gt;&lt;br /&gt;
4. - проверяем наличие ключа в секции из фаила(системы)&amp;lt;br&amp;gt;&lt;br /&gt;
5. - возвращаем истину(нашли ключ)&lt;br /&gt;
&lt;br /&gt;
Проверка ,что из себя представляет переменная&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function check_type(obj)&lt;br /&gt;
if obj then&lt;br /&gt;
if type(obj)==&amp;quot;string&amp;quot; then&lt;br /&gt;
return &amp;quot;string&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;number&amp;quot; then&lt;br /&gt;
return &amp;quot;number&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;function&amp;quot; then&lt;br /&gt;
return &amp;quot;function&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;boolean&amp;quot; then&lt;br /&gt;
return &amp;quot;boolean&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;userdata&amp;quot; then&lt;br /&gt;
return &amp;quot;userdata&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;table&amp;quot; then&lt;br /&gt;
return &amp;quot;table&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Теперь по порядку...&amp;lt;br&amp;gt;&lt;br /&gt;
Если obj это строка ,то возвращаем &amp;quot;string&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это число ,то возвращаем &amp;quot;number&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это функция ,то возвращаем &amp;quot;function&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это булево значение ,то возвращаем &amp;quot;booolean&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это юзердата(хз что это),то возвращаем &amp;quot;userdata&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это таблица, то возвращаем &amp;quot;table&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Это поможет в таких случаях ,когда неизвестно какой тип данных поступает в то или иное место...&lt;br /&gt;
&lt;br /&gt;
==Структура Lua_help==&lt;br /&gt;
Сам фаил можно найти в '''gamedata\scripts\lua_help.script'''&lt;br /&gt;
&amp;lt;code&amp;gt;C++ class [класс] {&lt;br /&gt;
     const [описание1] = [константа1];&lt;br /&gt;
     const [описание2] = [константа2];&lt;br /&gt;
     ...&lt;br /&gt;
     [константы заменяют описания при вызове методов классов];&lt;br /&gt;
     &lt;br /&gt;
     property [свойство1];&lt;br /&gt;
     property [свойство2];&lt;br /&gt;
     ...&lt;br /&gt;
[свойства (property) - это характеристика какого-либо класса, которая может подвергаться мат. операциям, слияниям, присвояниям и пр.&lt;br /&gt;
     читаются через точку: obj.health];&lt;br /&gt;
&lt;br /&gt;
     [глобальная(-ые) функция(-ии), которой вызывается класс];&lt;br /&gt;
     function [метод1] ([аргумент 1 функции 1], [аргумент 2 функции 1]...);&lt;br /&gt;
     function [метод2] ([аргумент 1 функции2]...);&lt;br /&gt;
             ...&lt;br /&gt;
     [методы - это специальные функции, выполняющие операции с классами и возвращающие значения после операций над классами.&lt;br /&gt;
     вызываются через двоеточие: obj:add_animation(...)];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Создание своего класса==&lt;br /&gt;
Свой класс можно добавить так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class &amp;quot;my_cool_class&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь &amp;quot;my_cool_class&amp;quot; - имя моего нового класса. Записывается в кавычках, т.е. это строка.&lt;br /&gt;
&lt;br /&gt;
Потом можно добавлять к этому классу свои методы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- это специальный метод - конструктор. Будет вызван при создании класса.&lt;br /&gt;
function my_cool_class:__init(num)&lt;br /&gt;
    self.my_param = num -- добавили в свой класс переменную&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- обычный метод&lt;br /&gt;
function my_cool_class:cool_method_of_my_class()&lt;br /&gt;
    get_console():execute(&amp;quot;lua_bind_in_action_&amp;quot;..self.my_param)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- деструктор, вызывается при сборке объекта сборщиком мусора. Аргументов не имеет (кроме скрытого self. об этом см. далее)&lt;br /&gt;
function my_cool_class:__finalize()&lt;br /&gt;
    get_console():execute(&amp;quot;good_by_&amp;quot;..self.my_param)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Потом можно создавать экземпляры своего класса, вызывать их методы и пр.:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local obj1 = my_cool_class(1) -- здесь создаётся новый объект. При этом вызывается конструктор и &lt;br /&gt;
                              -- ему передаются аргументы этого вызова (в данном случае число 1).&lt;br /&gt;
local obj2 = my_cool_class(4)&lt;br /&gt;
obj1:cool_method_of_my_class()&lt;br /&gt;
obj2:cool_method_of_my_class()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как только объект становится ненужным (т.е. на него больше нет ссылок) он удаляется сборщиком мусора. При этом вызывается его метод __finalize&lt;br /&gt;
&lt;br /&gt;
При чём здесь self.&lt;br /&gt;
self - это скрытый первый аргумент. Конструкция вида:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function class_name:fun_name(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
на самом деле эквивалентна конструкции &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function class_name.fun_name(self, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Обратите внимание на двоеточие в первом случае и точку во втором.&amp;lt;br&amp;gt;&lt;br /&gt;
При вызове метода конструкция вида:&lt;br /&gt;
&lt;br /&gt;
'''object_name:fun_name(&amp;lt;список аргументов&amp;gt;)'''&lt;br /&gt;
&lt;br /&gt;
эквивалентна конструкции&lt;br /&gt;
&lt;br /&gt;
'''object_name.fun_name(object_name, &amp;lt;список аргументов&amp;gt;)'''&lt;br /&gt;
&lt;br /&gt;
Это означает, что в качестве self как правило передаётся сам же объект. &amp;quot;Как правило&amp;quot; - это потому, что можно в принципе передать что-то другое. Но лучше этого соглашения не нарушать.&lt;br /&gt;
&lt;br /&gt;
Всё это здорово, но какая от этого польза? Ну сделал я свой класс, и что с ним делать?&lt;br /&gt;
&lt;br /&gt;
В общем, классы - это неплохое средство организации своего кода. Владеющие объектно-ориентированным подходом найдут это расширение весьма удобным. В частности такие, ни к чему не привязанные классы, в скриптах сталкера используются в некоторых местах. Однако, настоящая сила этой технологии не в этом. С помощью этой технологии можно расширять классы, экспортированные в Lua со стороны движка игры. Об этом пойдет речь в следующей части.&lt;br /&gt;
&lt;br /&gt;
==Наследование от экспортированных классов==&lt;br /&gt;
Итак, кроме создания собственных классов технология Luabind позволяет создавать класы на основе уже существующих. Это реализовано в виде своеобразного наследования. Делается это с помощью следующей конструкции:&lt;br /&gt;
&lt;br /&gt;
'''class &amp;quot;my_derived_class&amp;quot; (base_class)'''&lt;br /&gt;
&lt;br /&gt;
Здесь:&lt;br /&gt;
&amp;quot;my_derived_class&amp;quot; как и раньше - это имя нового класса.&amp;lt;br&amp;gt;&lt;br /&gt;
base_class - это уже существующий класс, который будет базовым для вновь созданного. Имя выбрано произвольно, но подразумевается, что такой класс экспортирован и предназначен для наследования.&amp;lt;br&amp;gt;&lt;br /&gt;
Далеко не любой класс из экспортированных со стороны хост-приложения можно использовать в качестве базового. На стороне хост-приложения должен быть создан специальный класс-обёртка. Если его нет, то ничего хорошего не выйдет. Скорее всего при попытке использовать унаследованный класс в Lua будут малопонятные проблемы и вылеты, так что надо знать совершенно точно, можно ли от конкретного класса наследовать.&amp;lt;br&amp;gt;&lt;br /&gt;
Вопрос, какой глубины может быть наследование, т.е. можно ли наследовать от производного класса, мне пока до конца не ясен. С другой стороны, в этом практически нет необходимости.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итак после выполнения указанной конструкции появляется класс my_derived_class, который является копией класса base_class. У него есть в точности те же методы, что и у его базового класса. Пока от этого мало толку. Но теперь можно переопределить методы нашего класса, изменив таким образом его поведение. Делается это так же, как и ранее, но с некоторыми дополнениями.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- конструктор&lt;br /&gt;
function my_derived_class:__init(num) super(num)&lt;br /&gt;
end&lt;br /&gt;
-- обычный метод&lt;br /&gt;
function my_cool_class:some_method(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
    base_class.some_method(self, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
-- деструктор&lt;br /&gt;
function my_cool_class:__finalize()&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На что стОит обратить внимание.&amp;lt;br&amp;gt;&lt;br /&gt;
Во-первых, конструкция super(num). Это вызов конструктора базового класса.&amp;lt;br&amp;gt;&lt;br /&gt;
Во-вторых, для вызова метода базового класса из метода унаследованного используется другая конструкция base_class.some_method(self, ). Здесь надо использовать альтернативную форму вызова метода (с точкой и явным указанием первого аргумента self).&amp;lt;br&amp;gt;&lt;br /&gt;
Наконец, метод __finalize() не требует вызова этого же метода для базового класса, поскольку тот будет вызван автоматически при удалении объекта сборщиком мусора.&lt;br /&gt;
&lt;br /&gt;
Собственно и всё. Теперь можно пользоваться созданным классом: создавать объекты этого класса, вызывать их методы и пр. Здесь уже всё зависит от конкретных целей и требует знания конкретных классов.&lt;br /&gt;
&lt;br /&gt;
==сlass alife_simulator==&lt;br /&gt;
alife_simulator - класс для управления серверными объектами. В игре существует всего один экземпляр такого класса, и получить его можно с помощью вызова глобальной функции alife().&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
level_name(level_id) -- возвращает имя уровня по его id&lt;br /&gt;
create_ammo(&amp;lt;имя секции патронов&amp;gt;, position, lvid, gvid, id, amount) - создание пачек с патронами&lt;br /&gt;
create(&amp;lt;имя секции объекта&amp;gt;, position, lvid, gvid, id) -- создание объектов в инвентаре&lt;br /&gt;
create(&amp;lt;имя секции объекта&amp;gt;, position, lvid, gvid) -- создание объектов на уровне&lt;br /&gt;
во всех функция создания объектов&lt;br /&gt;
position - объект класса vector. Не может быть nil, иначе вылет&lt;br /&gt;
lvid - level vertex id&lt;br /&gt;
gvid - game vertex id&lt;br /&gt;
id - это куда спавним. Если в инвентарь, то указываем id непися или ноль (для актора)&lt;br /&gt;
release(sobj, boolean) -- удаляет объект sobj. Зачем второй булевский аргумент - не известно. &lt;br /&gt;
                          Во всех примерах он либо отсутствует, либо установлен в true&lt;br /&gt;
object(id) -- возвращает серверный объект по его id. Если не нашёл nil&lt;br /&gt;
story_object(sid) -- возвращает серверный объект по его story id. Если не нашёл nil&lt;br /&gt;
actor() -- возвращает серверный объект актора&lt;br /&gt;
set_switch_online(id, boolean) -- переводит в онлайн объект с идентификатором id&lt;br /&gt;
set_switch_offline(id, boolean) -- то же , но в онлайн&lt;br /&gt;
dont_has_info(const number&amp;amp;, string); -- проверка на Неполученный инфопоршень(db.actor:dont_has_info(&amp;quot;infoportion&amp;quot;) &lt;br /&gt;
                                      -- или alife():actor():dont_has_info(&amp;quot;infoportion&amp;quot;)).&lt;br /&gt;
has_info - противоположная&lt;br /&gt;
&lt;br /&gt;
предположительно:&lt;br /&gt;
switch_distance() -- радиус переключения в оффлайн?&lt;br /&gt;
switch_distance(number) -- установка этого радиуса?&lt;br /&gt;
level_id() -- текущий номер уровня ?&lt;br /&gt;
object(string) -- получение объекта оп его имени. Не помню точно, что за имя.&lt;br /&gt;
object(number, boolean) - то же, что и object(number)? на что влияет второй аргумент?&lt;br /&gt;
valid_object_id(number) -- проверка наличия объекта по id?&lt;br /&gt;
alife():create( &amp;lt;индекс объекта в all.spawn&amp;gt; ) -- &lt;br /&gt;
spawn_id(number) -- индекс объекта в all.spawn для объекта с заданным id ?&lt;br /&gt;
&lt;br /&gt;
неизвестно:&lt;br /&gt;
add_out_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
set_interactive(number, boolean);&lt;br /&gt;
add_in_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
function remove_in_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
remove_out_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
kill_entity(cse_alife_monster_abstract*, const number&amp;amp;, cse_alife_schedulable*);&lt;br /&gt;
kill_entity(alife_simulator*, cse_alife_monster_abstract*, const number&amp;amp;);&lt;br /&gt;
kill_entity(alife_simulator*, cse_alife_monster_abstract*);&lt;br /&gt;
has_info(const number&amp;amp;, string);&lt;br /&gt;
remove_all_restrictions(number, const enum RestrictionSpace::ERestrictorTypes&amp;amp;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local sim = alife() -- получаем сам объект класса alife_simulator&lt;br /&gt;
local sactor = sim:actor() -- получаем серверный объект для актора&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class vector==&lt;br /&gt;
vector - вспомогательный класс, содержащий три координаты, и позволяющий выполнять с ними различные манипуляции. Объекты класса vector являются аргументами многих функций и возвращаются многими функциями. См. например выше про метод create класса alife_simulator. Отдельный объект класса вектор создаётся вызовом глобальной функции vector(). При создании имеет координаты [0,0,0].&lt;br /&gt;
&lt;br /&gt;
===Список методов класса vector===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
v:set_length(number) - оставить направление, изменить длину&lt;br /&gt;
v:normalize(); - сделать длину единичной&lt;br /&gt;
&lt;br /&gt;
v:magnitude() -- длина вектора v&lt;br /&gt;
v1:distance_to(v2) -- расстояние между v1 и v2&lt;br /&gt;
v1:distance_to_sqr(v2) -- квадрат расстояния между v1 и v2&lt;br /&gt;
v1:crossproduct(v2) -- векторное произведение. Возвращает вектор&lt;br /&gt;
v1:dotproduct(v2) -- скалярное произведение. Возвращает число&lt;br /&gt;
v:sub(number); -- вычесть из каждого компонента v число number&lt;br /&gt;
v1:sub(v2); -- вычесть почленно вектор v2 из v1 и поместить в v1&lt;br /&gt;
v1:sub(v2, v3) -- вычесть из v2 - v3 и поместить в v1&lt;br /&gt;
аналогично:&lt;br /&gt;
add - почленное сложение&lt;br /&gt;
mul - почленное умножение&lt;br /&gt;
div - почленное деление&lt;br /&gt;
max/min - почленный максимум/минимум&lt;br /&gt;
v1:clamp(v2) -- почленное обрезание первого вторым&lt;br /&gt;
average -- почленное среднее&lt;br /&gt;
invert -- почленная инверсия знака&lt;br /&gt;
&lt;br /&gt;
v1:abs(v2); -- копирует почленно положительные компоненты в v1 из v2&lt;br /&gt;
lerp(v1, v2, number) -- линейная интерполяция между двумя векторами&lt;br /&gt;
-- если number больше 1, то выходит за них - экстраполяция&lt;br /&gt;
&lt;br /&gt;
v1:reflect(v2, v3) - должно быть отражение одного вектора от плоскости, определяемой другим. Не проверял&lt;br /&gt;
v1:slide(v2, v3); - вероятно, проекция одного вектора на плоскость, определяемую другим. Не уверен&lt;br /&gt;
v1:distance_to_xz(v2) - учитывая, что плоскость XZ - это плоскость параллельная земле, то возможно это &lt;br /&gt;
                        длина проекции на землю пути от точки до точки. Не проверял&lt;br /&gt;
&lt;br /&gt;
v:getP() - зенитный угол в радианах (угол наклона над плоскостью XZ )&lt;br /&gt;
v:getH() - азимутальный угол в радианах (угол в плоскости XZ между проекцией вектора на эту плоскость и осью Z)&lt;br /&gt;
setHP - соответственно для установки этих значений&lt;br /&gt;
v1:align() - выравнивает вектор вдоль оси x или z и нормирует его. Значение по y игнорируется. &lt;br /&gt;
             В итоге всегда возвращается одно из четырёх значений ([1,0,0], [-1,0,0], [0,0,1], [0,0,-1])&lt;br /&gt;
v4:mad(v1,v2,v3) -- бешеная операция =) умножить почленно второе на третье и сложить с &lt;br /&gt;
                    первым, т.е. v4 = v1 + v2*v3 (название операции mad == mul + add)&lt;br /&gt;
v1:inertion(v2, number) -- v1 = v2 + (v1-v2)*number (тоже почленно)&lt;br /&gt;
v1:similar(v2, number) -- сравнение векторов на равенство с погрешностью number. Выдаёт 1 или 0&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local v1 = vector()&lt;br /&gt;
v1:set(1,2,3)&lt;br /&gt;
local v2 = vector():set(4,5,6)&lt;br /&gt;
local dist = v1:distance_to(v2)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class fcolor==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class fcolor {&lt;br /&gt;
    property a; --альфа-цвет, отвечающий за прозрачность.&lt;br /&gt;
    property b; --blue-цвет, отвечающий за синий оттенок цвета.&lt;br /&gt;
    property g; --green-цвет, отвечающий за зелёный оттенок цвета.&lt;br /&gt;
    property r; --red-цвет, отвечающий за красный оттенок цвет.&lt;br /&gt;
&lt;br /&gt;
    fcolor ();&lt;br /&gt;
&lt;br /&gt;
    function set(number, number, number, number); --установка цвета (r,g,b,a)&lt;br /&gt;
    function set(const fcolor&amp;amp;); --установка цвета по уже имеющемуся классу &amp;quot;fcolor()&amp;quot;&lt;br /&gt;
    function set(number); -- не знаю. предполагаю, что есть несколько заранее подготовленных цветов с индексами для каждого.&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
color = fcolor()&lt;br /&gt;
color.a = 50&lt;br /&gt;
color.g = 255&lt;br /&gt;
color.r = 100&lt;br /&gt;
color.b = 50&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
или&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
color = fcolor()&lt;br /&gt;
color:set(100,255,50,50)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class hit==&lt;br /&gt;
Бывают случаи, при которых необходимо нанести некоторый урон неписю или мобу, при этом имитировав попадание в него. Для этого существует метод класса game_object:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function hit(hit*);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Чтобы использовать этот метод, нужно указать аргументы. В данном случае имеет объект другого класса - hit. Вот его описание:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class hit {&lt;br /&gt;
    const burn = 0; --здесь идут константы типов урона, используемых в свойстве &amp;quot;type&amp;quot;. Все мы прекрасно знаем, что означает каждый.&lt;br /&gt;
    const chemical_burn = 6;&lt;br /&gt;
    const dummy = 11;&lt;br /&gt;
    const explosion = 7;&lt;br /&gt;
    const fire_wound = 8;&lt;br /&gt;
    const radiation = 4;&lt;br /&gt;
    const shock = 1;&lt;br /&gt;
    const strike = 2;&lt;br /&gt;
    const telepatic = 5;&lt;br /&gt;
    const wound = 3;&lt;br /&gt;
&lt;br /&gt;
    property direction; --дирекция урона&lt;br /&gt;
    property draftsman; --обозначает персонажа, нанёсшего урон.&lt;br /&gt;
    property impulse; --импульс урона&lt;br /&gt;
    property power; --сила урона&lt;br /&gt;
    property type; -- тип урона (см. константы)&lt;br /&gt;
&lt;br /&gt;
    hit ();&lt;br /&gt;
    hit (const hit*);&lt;br /&gt;
&lt;br /&gt;
    function bone(string); --метод с указанием кости урона&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
hit = hit() -- создание объекта класса hit&lt;br /&gt;
hit.direction = vector():set(1,0,0) --дирекция по оси x&lt;br /&gt;
hit.draftsman = db.actor --нанёс урон актор&lt;br /&gt;
hit.impulse = 600 --импульс&lt;br /&gt;
hit.power = 1.45 --хит&lt;br /&gt;
hit.type = 2 --тип урона - выстрел&lt;br /&gt;
hit:bone(&amp;quot;bip01_head&amp;quot;) -- удар приходится на голову&lt;br /&gt;
obj:hit(hit)&lt;br /&gt;
-- наносим урон&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==&amp;quot;Функции времени&amp;quot;==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
time_global() -- реальное время (в миллисекундах) с начала запуска программы&lt;br /&gt;
game.time() -- игровое время (в игровых миллисекундах) с начала игры (т.е. с начала прохождения игры)&lt;br /&gt;
level.get_time_days() -- день месяца по игровому времени&lt;br /&gt;
level.get_time_hours() -- час текущего игрового дня&lt;br /&gt;
level.get_time_minutes() -- минута текущего игрового часа&lt;br /&gt;
&lt;br /&gt;
level.get_time_factor() -- возвращает отношение скорости течения игрового времени к скорости реального &lt;br /&gt;
                        --(game_time_speed / real_time_speed)&lt;br /&gt;
level.set_time_factor(number) -- устанавливает это отношение&lt;br /&gt;
&lt;br /&gt;
game.get_game_time() -- возвращает игровое время в виде объекта класса CTime. Класс CTime я опишу подробно &lt;br /&gt;
                     -- как-нибудь потом, а пока опишу только пару его методов.&lt;br /&gt;
конструктор. Вызывается через пространство имён game&lt;br /&gt;
game.CTime()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Дефолтовые значения===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
year, month, day = 1 &lt;br /&gt;
hour, min, sek, ms = 0&lt;br /&gt;
CTime.set(year, month, day, hour, min, sek, ms) -- устанавливает все данные о времени&lt;br /&gt;
метод CTime.get описан так:&lt;br /&gt;
function get(number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;);&lt;br /&gt;
что наводит на мысль о семи аргументах. однако с точки зрения Lua этот метод не принимает аргументов, зато возвращает семь значений. &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
====Пример использования обоих методов:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local t = game.CTime() -- создания объекта с дефолтовыми значнеиями&lt;br /&gt;
t:set(2009, 7, 11, 8, 11, 22, 333) -- установили все значения&lt;br /&gt;
&lt;br /&gt;
local y,m,d,h,min,sec,ms = t:get() -- получили все значения&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
===Класс CTime (неразобранный)===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class CTime {&lt;br /&gt;
const DateToDay = 0;&lt;br /&gt;
const DateToMonth = 1;&lt;br /&gt;
const DateToYear = 2;&lt;br /&gt;
const TimeToHours = 0;&lt;br /&gt;
const TimeToMilisecs = 3;&lt;br /&gt;
const TimeToMinutes = 1;&lt;br /&gt;
const TimeToSeconds = 2;&lt;br /&gt;
&lt;br /&gt;
CTime ();&lt;br /&gt;
CTime (const CTime&amp;amp;);&lt;br /&gt;
&lt;br /&gt;
function sub(CTime*);&lt;br /&gt;
function timeToString(number);&lt;br /&gt;
function dateToString(number);&lt;br /&gt;
operator ==(const CTime&amp;amp;, CTime);&lt;br /&gt;
function get(number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;);&lt;br /&gt;
function set(number, number, number, number, number, number, number);&lt;br /&gt;
function setHMSms(number, number, number, number);&lt;br /&gt;
function diffSec(CTime*);&lt;br /&gt;
operator &amp;lt;(const CTime&amp;amp;, CTime);&lt;br /&gt;
operator +(CTime&amp;amp;, CTime);&lt;br /&gt;
operator &amp;gt;=(const CTime&amp;amp;, CTime);&lt;br /&gt;
function setHMS(number, number, number);&lt;br /&gt;
operator &amp;gt;(const CTime&amp;amp;, CTime);&lt;br /&gt;
operator -(CTime&amp;amp;, CTime);&lt;br /&gt;
operator &amp;lt;=(const CTime&amp;amp;, CTime);&lt;br /&gt;
function add(CTime*);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==класс CUIScriptWnd==&lt;br /&gt;
CUIScriptWnd(); --для работы с окном...&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    function _construct();&lt;br /&gt;
    function Register(CUIWindow*);&lt;br /&gt;
    function Register(CUIWindow*, string);&lt;br /&gt;
    function Enable(boolean);        --вкл/выкл&lt;br /&gt;
    function SetHeight(number);  --установка высоты&lt;br /&gt;
    function GetFrameLineWnd(string);&lt;br /&gt;
    function SetHolder(CDialogHolder*);&lt;br /&gt;
    function GetWidth() const;  --получение ширины контрола&lt;br /&gt;
    function GetCheckButton(string);--Получение состояния checkBox ,на выходе true или false?&lt;br /&gt;
    function DetachChild(CUIWindow*);&lt;br /&gt;
    function SetPPMode();&lt;br /&gt;
    function SetFont(CGameFont*);  --установка шрифта по имени&lt;br /&gt;
    function IsShown();                --проверка видно ли контрол иль нет?&lt;br /&gt;
    function Show(boolean);            --показывать контолили нет?&lt;br /&gt;
    function GetHeight() const;        --возвращает высоту&lt;br /&gt;
    function SetWidth(number);        --устанавливает ширину&lt;br /&gt;
    function GetListWndEx(string);&lt;br /&gt;
    function IsEnabled();&lt;br /&gt;
    function ResetPPMode();&lt;br /&gt;
    function GetPropertiesBox(string);&lt;br /&gt;
    function GetFont();                --возвращает шрифт установленный setFont?&lt;br /&gt;
    function Update();&lt;br /&gt;
    function AddCallback(string, number, const function&amp;lt;void&amp;gt;&amp;amp;); --соответские контрола с действие?&lt;br /&gt;
    function AddCallback(string, number, const function&amp;lt;void&amp;gt;&amp;amp;, object);--соответские контрола с действие?&lt;br /&gt;
    function GetButton(string);--Получаем последнюю нажатую кнопку?&lt;br /&gt;
    function SetAutoDelete(boolean);&lt;br /&gt;
    function OnKeyboard(number, enum EUIMessages);--Колбек нажатия на клавиатуре&lt;br /&gt;
    function Dispatch(number, number);&lt;br /&gt;
    function GetListWnd(string);--получение окна ListBoxa?&lt;br /&gt;
    function AttachChild(CUIWindow*);&lt;br /&gt;
    function GetStatic(string);--получение текста метки&lt;br /&gt;
    function SetWndPos(number, number);--установка позиции окна(x,y)&lt;br /&gt;
    function GetTabControl(string);&lt;br /&gt;
    function GetRadioButton(string);--состояние RadioButtton на выходите true или false&lt;br /&gt;
    function Init(number, number, number, number);--инициализация окна...читай FormInitializatione (x,y,width,height)&lt;br /&gt;
    function Init(Frect*);--инициализация окна&lt;br /&gt;
    function GetFrameWindow(string);&lt;br /&gt;
    function WindowName();&lt;br /&gt;
    function GetDialogWnd(string);&lt;br /&gt;
    function GetHolder();&lt;br /&gt;
    function SetWndRect(Frect);--установка координат углов&lt;br /&gt;
    function SetWndRect(number, number, number, number);--установка координат углов&lt;br /&gt;
    function GetEditBox(string);--получение текста из ЭдитБокса&lt;br /&gt;
    function SetWindowName(string);--Устанавливаем имя форме(caption)&lt;br /&gt;
    function GetProgressBar(string);&lt;br /&gt;
    function GetMessageBox(string);&lt;br /&gt;
    function SetWndSize(number, number);&lt;br /&gt;
    function Load(string);&lt;br /&gt;
    function IsAutoDelete();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
Статья создана: [[Участник:malandrinus|malandrinus]], [[Участник:IQDDD|IQDDD]], [[Участник:меченый|меченый]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>95.25.99.189</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC</id>
		<title>Справочник по функциям и классам</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC"/>
				<updated>2009-07-11T23:00:46Z</updated>
		
		<summary type="html">&lt;p&gt;95.25.99.189: /* Основы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Посты с форума AMK&lt;br /&gt;
&lt;br /&gt;
==Основы==&lt;br /&gt;
Lua(в Сталкере,дальше просто '''Lua''' ) можно использовать не только для игрового процесса... Доступны основные(а может и все) команды(функции) к примеру Оператор ввода/вывода..работа с фаилами и т.д.(Возможно,только в ЧН....)&lt;br /&gt;
вот простой пример:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function to_my_log(text)&lt;br /&gt;
io.open(&amp;quot;gamedata\\solinx_log.txt&amp;quot;,&amp;quot;w&amp;quot;):write( text, &amp;quot;\n&amp;quot; )&lt;br /&gt;
io.open(&amp;quot;gamedata\\solinx_log.txt&amp;quot;,&amp;quot;w&amp;quot;):close()&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Рассмотрим подробнее===&lt;br /&gt;
io.open(filename) - &amp;quot;открывает&amp;quot; для каких либо целей filename&lt;br /&gt;
:write(text,&amp;quot;\n&amp;quot;) - оператор вывода,выводит(читай вписывает) в фаил открытый с помощью io.open , строку text...после переходит на следующую строку(есть ещё:&amp;quot;\t&amp;quot;,&amp;quot;\w&amp;quot;)&lt;br /&gt;
:read(text) - оператор ввода,вводит (читай &amp;quot;читает&amp;quot;) из фаила открытого с помощью io.open,строку текст&lt;br /&gt;
:close() - закрывает фаил открытый с помощью io.open&lt;br /&gt;
&lt;br /&gt;
статьи по Lua(основам) можно найти тут http://www.lua.ru/doc/&lt;br /&gt;
&lt;br /&gt;
Также есть функции &amp;quot;преобразования&amp;quot; ,как в любом языке(скриптовом,программирования)&lt;br /&gt;
Преобразование числового значения(любого) в строку:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
tostring(c)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где с - это число&lt;br /&gt;
Преобразование строки в число:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
tonumber(string)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где string - это строка (вдруг кто не в курсе )&lt;br /&gt;
&lt;br /&gt;
Особенность Lua(по моему только в нём так,хотя кроме Lua только питон смотрел):&lt;br /&gt;
что после основных операторов(циклов,условного и т.д.)(if ,for,while...)&lt;br /&gt;
ставится end&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
if then&lt;br /&gt;
else&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for i,c do&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
while &amp;quot;true&amp;quot; do&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ещё одной особенность LUА ,можно назвать работу с массивами(читай &amp;quot;таблицами&amp;quot;) без цикла&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local tbl={}&lt;br /&gt;
&lt;br /&gt;
--заполнение&lt;br /&gt;
function objparams_to_tbl(obj)&lt;br /&gt;
if isstalker(obj) then&lt;br /&gt;
tbl.sec =obj:section()&lt;br /&gt;
tbl.hp=obj:health&lt;br /&gt;
....&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--применение&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function objparams_to_msg()&lt;br /&gt;
news_manager.send_tip(db.actor,&amp;quot;obj:section =&amp;quot;..tbl.sec..&amp;quot;obj:health =&amp;quot;..obj.hp,nil,nil,1000)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Массив можно очистить/заполнить/прочитать/преобразовать....&lt;br /&gt;
&lt;br /&gt;
И совет:Пользуйтесь SCiTE или любой другой редактор с выделением синтаксиса....&lt;br /&gt;
&lt;br /&gt;
===Работа с фаилами===&lt;br /&gt;
Через системный фаил(systems.ltx)&lt;br /&gt;
&lt;br /&gt;
system_ini():r_string(section,key) -- получение строки из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
system_ini():r_bool(section,key) --получение булевого значения (true,false) из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
system_ini():r_s32(section,key) --получение (целого?)числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
system_ini():r_float(section,key) --получение числа(с плавающей точкой) числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Через другой фаил(который не прописан в системе)&lt;br /&gt;
&lt;br /&gt;
local ini =ini_file(&amp;quot;&amp;quot;) -- путь до фаила (обьявляем переменную которая хранит имя и путь).Дальше также как и с системным фаилом&lt;br /&gt;
&lt;br /&gt;
ini:r_string(section,key) -- получение строки из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
ini:r_bool(section,key) --получение булевого значения (true,false) из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
ini:r_s32(section,key) --получение (целого?)числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
ini:r_float(section,key) --получение числа(с плавающей точкой) числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Вспомогательные функции===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
system_ini():line_exist( section, key ) -- проверяет существует ли в секции [section ] ключ key&lt;br /&gt;
system_ini():section_exist(section) --проверяет существует ли секция [section ]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
EG:&lt;br /&gt;
0function eg()&lt;br /&gt;
1local ini=ini_file(&amp;quot;gamedata\\test.ltx&amp;quot;)&lt;br /&gt;
2if not ini then ini=system_ini() end&lt;br /&gt;
3if ini:section_exist(&amp;quot;test_section&amp;quot;) then&lt;br /&gt;
4if ini:line_exist(&amp;quot;test_line&amp;quot;) then&lt;br /&gt;
5return true&lt;br /&gt;
6end&lt;br /&gt;
7end&lt;br /&gt;
8end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
1. - присваиваем переменной фаил&amp;lt;br&amp;gt;&lt;br /&gt;
2. - проверяем существует ли фаил ,если нет то работаем с системой&amp;lt;br&amp;gt;&lt;br /&gt;
3. - проверяем наличие секции в фаиле(системе)&amp;lt;br&amp;gt;&lt;br /&gt;
4. - проверяем наличие ключа в секции из фаила(системы)&amp;lt;br&amp;gt;&lt;br /&gt;
5. - возвращаем истину(нашли ключ)&lt;br /&gt;
&lt;br /&gt;
Проверка ,что из себя представляет переменная&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function check_type(obj)&lt;br /&gt;
if obj then&lt;br /&gt;
if type(obj)==&amp;quot;string&amp;quot; then&lt;br /&gt;
return &amp;quot;string&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;number&amp;quot; then&lt;br /&gt;
return &amp;quot;number&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;function&amp;quot; then&lt;br /&gt;
return &amp;quot;function&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;boolean&amp;quot; then&lt;br /&gt;
return &amp;quot;boolean&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;userdata&amp;quot; then&lt;br /&gt;
return &amp;quot;userdata&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;table&amp;quot; then&lt;br /&gt;
return &amp;quot;table&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Теперь по порядку...&amp;lt;br&amp;gt;&lt;br /&gt;
Если obj это строка ,то возвращаем &amp;quot;string&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это число ,то возвращаем &amp;quot;number&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это функция ,то возвращаем &amp;quot;function&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это булево значение ,то возвращаем &amp;quot;booolean&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это юзердата(хз что это),то возвращаем &amp;quot;userdata&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это таблица, то возвращаем &amp;quot;table&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Это поможет в таких случаях ,когда неизвестно какой тип данных поступает в то или иное место...&lt;br /&gt;
&lt;br /&gt;
==Структура Lua_help==&lt;br /&gt;
Сам фаил можно найти в '''gamedata\scripts\lua_help.script'''&lt;br /&gt;
&amp;lt;code&amp;gt;C++ class [класс] {&lt;br /&gt;
     const [описание1] = [константа1];&lt;br /&gt;
     const [описание2] = [константа2];&lt;br /&gt;
     ...&lt;br /&gt;
     [константы заменяют описания при вызове методов классов];&lt;br /&gt;
     &lt;br /&gt;
     property [свойство1];&lt;br /&gt;
     property [свойство2];&lt;br /&gt;
     ...&lt;br /&gt;
[свойства (property) - это характеристика какого-либо класса, которая может подвергаться мат. операциям, слияниям, присвояниям и пр.&lt;br /&gt;
     читаются через точку: obj.health];&lt;br /&gt;
&lt;br /&gt;
     [глобальная(-ые) функция(-ии), которой вызывается класс];&lt;br /&gt;
     function [метод1] ([аргумент 1 функции 1], [аргумент 2 функции 1]...);&lt;br /&gt;
     function [метод2] ([аргумент 1 функции2]...);&lt;br /&gt;
             ...&lt;br /&gt;
     [методы - это специальные функции, выполняющие операции с классами и возвращающие значения после операций над классами.&lt;br /&gt;
     вызываются через двоеточие: obj:add_animation(...)];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Создание своего класса==&lt;br /&gt;
Свой класс можно добавить так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class &amp;quot;my_cool_class&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь &amp;quot;my_cool_class&amp;quot; - имя моего нового класса. Записывается в кавычках, т.е. это строка.&lt;br /&gt;
&lt;br /&gt;
Потом можно добавлять к этому классу свои методы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- это специальный метод - конструктор. Будет вызван при создании класса.&lt;br /&gt;
function my_cool_class:__init(num)&lt;br /&gt;
    self.my_param = num -- добавили в свой класс переменную&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- обычный метод&lt;br /&gt;
function my_cool_class:cool_method_of_my_class()&lt;br /&gt;
    get_console():execute(&amp;quot;lua_bind_in_action_&amp;quot;..self.my_param)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- деструктор, вызывается при сборке объекта сборщиком мусора. Аргументов не имеет (кроме скрытого self. об этом см. далее)&lt;br /&gt;
function my_cool_class:__finalize()&lt;br /&gt;
    get_console():execute(&amp;quot;good_by_&amp;quot;..self.my_param)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Потом можно создавать экземпляры своего класса, вызывать их методы и пр.:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local obj1 = my_cool_class(1) -- здесь создаётся новый объект. При этом вызывается конструктор и &lt;br /&gt;
                              -- ему передаются аргументы этого вызова (в данном случае число 1).&lt;br /&gt;
local obj2 = my_cool_class(4)&lt;br /&gt;
obj1:cool_method_of_my_class()&lt;br /&gt;
obj2:cool_method_of_my_class()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как только объект становится ненужным (т.е. на него больше нет ссылок) он удаляется сборщиком мусора. При этом вызывается его метод __finalize&lt;br /&gt;
&lt;br /&gt;
При чём здесь self.&lt;br /&gt;
self - это скрытый первый аргумент. Конструкция вида:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function class_name:fun_name(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
на самом деле эквивалентна конструкции &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function class_name.fun_name(self, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Обратите внимание на двоеточие в первом случае и точку во втором.&amp;lt;br&amp;gt;&lt;br /&gt;
При вызове метода конструкция вида:&lt;br /&gt;
&lt;br /&gt;
object_name:fun_name(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
эквивалентна конструкции&lt;br /&gt;
&lt;br /&gt;
object_name.fun_name(object_name, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Это означает, что в качестве self как правило передаётся сам же объект. &amp;quot;Как правило&amp;quot; - это потому, что можно в принципе передать что-то другое. Но лучше этого соглашения не нарушать.&lt;br /&gt;
&lt;br /&gt;
Всё это здорово, но какая от этого польза? Ну сделал я свой класс, и что с ним делать?&lt;br /&gt;
&lt;br /&gt;
В общем, классы - это неплохое средство организации своего кода. Владеющие объектно-ориентированным подходом найдут это расширение весьма удобным. В частности такие, ни к чему не привязанные классы, в скриптах сталкера используются в некоторых местах. Однако, настоящая сила этой технологии не в этом. С помощью этой технологии можно расширять классы, экспортированные в Lua со стороны движка игры. Об этом пойдет речь в следующей части.&lt;br /&gt;
&lt;br /&gt;
==Наследование от экспортированных классов==&lt;br /&gt;
Итак, кроме создания собственных классов технология Luabind позволяет создавать класы на основе уже существующих. Это реализовано в виде своеобразного наследования. Делается это с помощью следующей конструкции:&lt;br /&gt;
&lt;br /&gt;
'''class &amp;quot;my_derived_class&amp;quot; (base_class)'''&lt;br /&gt;
&lt;br /&gt;
Здесь:&lt;br /&gt;
&amp;quot;my_derived_class&amp;quot; как и раньше - это имя нового класса.&amp;lt;br&amp;gt;&lt;br /&gt;
base_class - это уже существующий класс, который будет базовым для вновь созданного. Имя выбрано произвольно, но подразумевается, что такой класс экспортирован и предназначен для наследования.&amp;lt;br&amp;gt;&lt;br /&gt;
Далеко не любой класс из экспортированных со стороны хост-приложения можно использовать в качестве базового. На стороне хост-приложения должен быть создан специальный класс-обёртка. Если его нет, то ничего хорошего не выйдет. Скорее всего при попытке использовать унаследованный класс в Lua будут малопонятные проблемы и вылеты, так что надо знать совершенно точно, можно ли от конкретного класса наследовать.&amp;lt;br&amp;gt;&lt;br /&gt;
Вопрос, какой глубины может быть наследование, т.е. можно ли наследовать от производного класса, мне пока до конца не ясен. С другой стороны, в этом практически нет необходимости.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итак после выполнения указанной конструкции появляется класс my_derived_class, который является копией класса base_class. У него есть в точности те же методы, что и у его базового класса. Пока от этого мало толку. Но теперь можно переопределить методы нашего класса, изменив таким образом его поведение. Делается это так же, как и ранее, но с некоторыми дополнениями.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- конструктор&lt;br /&gt;
function my_derived_class:__init(num) super(num)&lt;br /&gt;
end&lt;br /&gt;
-- обычный метод&lt;br /&gt;
function my_cool_class:some_method(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
    base_class.some_method(self, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
-- деструктор&lt;br /&gt;
function my_cool_class:__finalize()&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На что стОит обратить внимание.&amp;lt;br&amp;gt;&lt;br /&gt;
Во-первых, конструкция super(num). Это вызов конструктора базового класса.&amp;lt;br&amp;gt;&lt;br /&gt;
Во-вторых, для вызова метода базового класса из метода унаследованного используется другая конструкция base_class.some_method(self, ). Здесь надо использовать альтернативную форму вызова метода (с точкой и явным указанием первого аргумента self).&amp;lt;br&amp;gt;&lt;br /&gt;
Наконец, метод __finalize() не требует вызова этого же метода для базового класса, поскольку тот будет вызван автоматически при удалении объекта сборщиком мусора.&lt;br /&gt;
&lt;br /&gt;
Собственно и всё. Теперь можно пользоваться созданным классом: создавать объекты этого класса, вызывать их методы и пр. Здесь уже всё зависит от конкретных целей и требует знания конкретных классов.&lt;br /&gt;
&lt;br /&gt;
==сlass alife_simulator==&lt;br /&gt;
alife_simulator - класс для управления серверными объектами. В игре существует всего один экземпляр такого класса, и получить его можно с помощью вызова глобальной функции alife().&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
level_name(level_id) -- возвращает имя уровня по его id&lt;br /&gt;
create_ammo(&amp;lt;имя секции патронов&amp;gt;, position, lvid, gvid, id, amount) - создание пачек с патронами&lt;br /&gt;
create(&amp;lt;имя секции объекта&amp;gt;, position, lvid, gvid, id) -- создание объектов в инвентаре&lt;br /&gt;
create(&amp;lt;имя секции объекта&amp;gt;, position, lvid, gvid) -- создание объектов на уровне&lt;br /&gt;
во всех функция создания объектов&lt;br /&gt;
position - объект класса vector. Не может быть nil, иначе вылет&lt;br /&gt;
lvid - level vertex id&lt;br /&gt;
gvid - game vertex id&lt;br /&gt;
id - это куда спавним. Если в инвентарь, то указываем id непися или ноль (для актора)&lt;br /&gt;
release(sobj, boolean) -- удаляет объект sobj. Зачем второй булевский аргумент - не известно. &lt;br /&gt;
                          Во всех примерах он либо отсутствует, либо установлен в true&lt;br /&gt;
object(id) -- возвращает серверный объект по его id. Если не нашёл nil&lt;br /&gt;
story_object(sid) -- возвращает серверный объект по его story id. Если не нашёл nil&lt;br /&gt;
actor() -- возвращает серверный объект актора&lt;br /&gt;
set_switch_online(id, boolean) -- переводит в онлайн объект с идентификатором id&lt;br /&gt;
set_switch_offline(id, boolean) -- то же , но в онлайн&lt;br /&gt;
dont_has_info(const number&amp;amp;, string); -- проверка на Неполученный инфопоршень(db.actor:dont_has_info(&amp;quot;infoportion&amp;quot;) &lt;br /&gt;
                                      -- или alife():actor():dont_has_info(&amp;quot;infoportion&amp;quot;)).&lt;br /&gt;
has_info - противоположная&lt;br /&gt;
&lt;br /&gt;
предположительно:&lt;br /&gt;
switch_distance() -- радиус переключения в оффлайн?&lt;br /&gt;
switch_distance(number) -- установка этого радиуса?&lt;br /&gt;
level_id() -- текущий номер уровня ?&lt;br /&gt;
object(string) -- получение объекта оп его имени. Не помню точно, что за имя.&lt;br /&gt;
object(number, boolean) - то же, что и object(number)? на что влияет второй аргумент?&lt;br /&gt;
valid_object_id(number) -- проверка наличия объекта по id?&lt;br /&gt;
alife():create( &amp;lt;индекс объекта в all.spawn&amp;gt; ) -- &lt;br /&gt;
spawn_id(number) -- индекс объекта в all.spawn для объекта с заданным id ?&lt;br /&gt;
&lt;br /&gt;
неизвестно:&lt;br /&gt;
add_out_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
set_interactive(number, boolean);&lt;br /&gt;
add_in_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
function remove_in_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
remove_out_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
kill_entity(cse_alife_monster_abstract*, const number&amp;amp;, cse_alife_schedulable*);&lt;br /&gt;
kill_entity(alife_simulator*, cse_alife_monster_abstract*, const number&amp;amp;);&lt;br /&gt;
kill_entity(alife_simulator*, cse_alife_monster_abstract*);&lt;br /&gt;
has_info(const number&amp;amp;, string);&lt;br /&gt;
remove_all_restrictions(number, const enum RestrictionSpace::ERestrictorTypes&amp;amp;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local sim = alife() -- получаем сам объект класса alife_simulator&lt;br /&gt;
local sactor = sim:actor() -- получаем серверный объект для актора&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class vector==&lt;br /&gt;
vector - вспомогательный класс, содержащий три координаты, и позволяющий выполнять с ними различные манипуляции. Объекты класса vector являются аргументами многих функций и возвращаются многими функциями. См. например выше про метод create класса alife_simulator. Отдельный объект класса вектор создаётся вызовом глобальной функции vector(). При создании имеет координаты [0,0,0].&lt;br /&gt;
&lt;br /&gt;
===Список методов класса vector===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
v:set_length(number) - оставить направление, изменить длину&lt;br /&gt;
v:normalize(); - сделать длину единичной&lt;br /&gt;
&lt;br /&gt;
v:magnitude() -- длина вектора v&lt;br /&gt;
v1:distance_to(v2) -- расстояние между v1 и v2&lt;br /&gt;
v1:distance_to_sqr(v2) -- квадрат расстояния между v1 и v2&lt;br /&gt;
v1:crossproduct(v2) -- векторное произведение. Возвращает вектор&lt;br /&gt;
v1:dotproduct(v2) -- скалярное произведение. Возвращает число&lt;br /&gt;
v:sub(number); -- вычесть из каждого компонента v число number&lt;br /&gt;
v1:sub(v2); -- вычесть почленно вектор v2 из v1 и поместить в v1&lt;br /&gt;
v1:sub(v2, v3) -- вычесть из v2 - v3 и поместить в v1&lt;br /&gt;
аналогично:&lt;br /&gt;
add - почленное сложение&lt;br /&gt;
mul - почленное умножение&lt;br /&gt;
div - почленное деление&lt;br /&gt;
max/min - почленный максимум/минимум&lt;br /&gt;
v1:clamp(v2) -- почленное обрезание первого вторым&lt;br /&gt;
average -- почленное среднее&lt;br /&gt;
invert -- почленная инверсия знака&lt;br /&gt;
&lt;br /&gt;
v1:abs(v2); -- копирует почленно положительные компоненты в v1 из v2&lt;br /&gt;
lerp(v1, v2, number) -- линейная интерполяция между двумя векторами&lt;br /&gt;
-- если number больше 1, то выходит за них - экстраполяция&lt;br /&gt;
&lt;br /&gt;
v1:reflect(v2, v3) - должно быть отражение одного вектора от плоскости, определяемой другим. Не проверял&lt;br /&gt;
v1:slide(v2, v3); - вероятно, проекция одного вектора на плоскость, определяемую другим. Не уверен&lt;br /&gt;
v1:distance_to_xz(v2) - учитывая, что плоскость XZ - это плоскость параллельная земле, то возможно это &lt;br /&gt;
                        длина проекции на землю пути от точки до точки. Не проверял&lt;br /&gt;
&lt;br /&gt;
v:getP() - зенитный угол в радианах (угол наклона над плоскостью XZ )&lt;br /&gt;
v:getH() - азимутальный угол в радианах (угол в плоскости XZ между проекцией вектора на эту плоскость и осью Z)&lt;br /&gt;
setHP - соответственно для установки этих значений&lt;br /&gt;
v1:align() - выравнивает вектор вдоль оси x или z и нормирует его. Значение по y игнорируется. &lt;br /&gt;
             В итоге всегда возвращается одно из четырёх значений ([1,0,0], [-1,0,0], [0,0,1], [0,0,-1])&lt;br /&gt;
v4:mad(v1,v2,v3) -- бешеная операция =) умножить почленно второе на третье и сложить с &lt;br /&gt;
                    первым, т.е. v4 = v1 + v2*v3 (название операции mad == mul + add)&lt;br /&gt;
v1:inertion(v2, number) -- v1 = v2 + (v1-v2)*number (тоже почленно)&lt;br /&gt;
v1:similar(v2, number) -- сравнение векторов на равенство с погрешностью number. Выдаёт 1 или 0&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local v1 = vector()&lt;br /&gt;
v1:set(1,2,3)&lt;br /&gt;
local v2 = vector():set(4,5,6)&lt;br /&gt;
local dist = v1:distance_to(v2)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class fcolor==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class fcolor {&lt;br /&gt;
    property a; --альфа-цвет, отвечающий за прозрачность.&lt;br /&gt;
    property b; --blue-цвет, отвечающий за синий оттенок цвета.&lt;br /&gt;
    property g; --green-цвет, отвечающий за зелёный оттенок цвета.&lt;br /&gt;
    property r; --red-цвет, отвечающий за красный оттенок цвет.&lt;br /&gt;
&lt;br /&gt;
    fcolor ();&lt;br /&gt;
&lt;br /&gt;
    function set(number, number, number, number); --установка цвета (r,g,b,a)&lt;br /&gt;
    function set(const fcolor&amp;amp;); --установка цвета по уже имеющемуся классу &amp;quot;fcolor()&amp;quot;&lt;br /&gt;
    function set(number); -- не знаю. предполагаю, что есть несколько заранее подготовленных цветов с индексами для каждого.&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
color = fcolor()&lt;br /&gt;
color.a = 50&lt;br /&gt;
color.g = 255&lt;br /&gt;
color.r = 100&lt;br /&gt;
color.b = 50&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
или&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
color = fcolor()&lt;br /&gt;
color:set(100,255,50,50)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class hit==&lt;br /&gt;
Бывают случаи, при которых необходимо нанести некоторый урон неписю или мобу, при этом имитировав попадание в него. Для этого существует метод класса game_object:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function hit(hit*);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Чтобы использовать этот метод, нужно указать аргументы. В данном случае имеет объект другого класса - hit. Вот его описание:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class hit {&lt;br /&gt;
    const burn = 0; --здесь идут константы типов урона, используемых в свойстве &amp;quot;type&amp;quot;. Все мы прекрасно знаем, что означает каждый.&lt;br /&gt;
    const chemical_burn = 6;&lt;br /&gt;
    const dummy = 11;&lt;br /&gt;
    const explosion = 7;&lt;br /&gt;
    const fire_wound = 8;&lt;br /&gt;
    const radiation = 4;&lt;br /&gt;
    const shock = 1;&lt;br /&gt;
    const strike = 2;&lt;br /&gt;
    const telepatic = 5;&lt;br /&gt;
    const wound = 3;&lt;br /&gt;
&lt;br /&gt;
    property direction; --дирекция урона&lt;br /&gt;
    property draftsman; --обозначает персонажа, нанёсшего урон.&lt;br /&gt;
    property impulse; --импульс урона&lt;br /&gt;
    property power; --сила урона&lt;br /&gt;
    property type; -- тип урона (см. константы)&lt;br /&gt;
&lt;br /&gt;
    hit ();&lt;br /&gt;
    hit (const hit*);&lt;br /&gt;
&lt;br /&gt;
    function bone(string); --метод с указанием кости урона&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
hit = hit() -- создание объекта класса hit&lt;br /&gt;
hit.direction = vector():set(1,0,0) --дирекция по оси x&lt;br /&gt;
hit.draftsman = db.actor --нанёс урон актор&lt;br /&gt;
hit.impulse = 600 --импульс&lt;br /&gt;
hit.power = 1.45 --хит&lt;br /&gt;
hit.type = 2 --тип урона - выстрел&lt;br /&gt;
hit:bone(&amp;quot;bip01_head&amp;quot;) -- удар приходится на голову&lt;br /&gt;
obj:hit(hit)&lt;br /&gt;
-- наносим урон&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==&amp;quot;Функции времени&amp;quot;==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
time_global() -- реальное время (в миллисекундах) с начала запуска программы&lt;br /&gt;
game.time() -- игровое время (в игровых миллисекундах) с начала игры (т.е. с начала прохождения игры)&lt;br /&gt;
level.get_time_days() -- день месяца по игровому времени&lt;br /&gt;
level.get_time_hours() -- час текущего игрового дня&lt;br /&gt;
level.get_time_minutes() -- минута текущего игрового часа&lt;br /&gt;
&lt;br /&gt;
level.get_time_factor() -- возвращает отношение скорости течения игрового времени к скорости реального &lt;br /&gt;
                        --(game_time_speed / real_time_speed)&lt;br /&gt;
level.set_time_factor(number) -- устанавливает это отношение&lt;br /&gt;
&lt;br /&gt;
game.get_game_time() -- возвращает игровое время в виде объекта класса CTime. Класс CTime я опишу подробно &lt;br /&gt;
                     -- как-нибудь потом, а пока опишу только пару его методов.&lt;br /&gt;
конструктор. Вызывается через пространство имён game&lt;br /&gt;
game.CTime()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Дефолтовые значения===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
year, month, day = 1 &lt;br /&gt;
hour, min, sek, ms = 0&lt;br /&gt;
CTime.set(year, month, day, hour, min, sek, ms) -- устанавливает все данные о времени&lt;br /&gt;
метод CTime.get описан так:&lt;br /&gt;
function get(number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;);&lt;br /&gt;
что наводит на мысль о семи аргументах. однако с точки зрения Lua этот метод не принимает аргументов, зато возвращает семь значений. &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
====Пример использования обоих методов:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local t = game.CTime() -- создания объекта с дефолтовыми значнеиями&lt;br /&gt;
t:set(2009, 7, 11, 8, 11, 22, 333) -- установили все значения&lt;br /&gt;
&lt;br /&gt;
local y,m,d,h,min,sec,ms = t:get() -- получили все значения&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
===Класс CTime (неразобранный)===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class CTime {&lt;br /&gt;
const DateToDay = 0;&lt;br /&gt;
const DateToMonth = 1;&lt;br /&gt;
const DateToYear = 2;&lt;br /&gt;
const TimeToHours = 0;&lt;br /&gt;
const TimeToMilisecs = 3;&lt;br /&gt;
const TimeToMinutes = 1;&lt;br /&gt;
const TimeToSeconds = 2;&lt;br /&gt;
&lt;br /&gt;
CTime ();&lt;br /&gt;
CTime (const CTime&amp;amp;);&lt;br /&gt;
&lt;br /&gt;
function sub(CTime*);&lt;br /&gt;
function timeToString(number);&lt;br /&gt;
function dateToString(number);&lt;br /&gt;
operator ==(const CTime&amp;amp;, CTime);&lt;br /&gt;
function get(number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;);&lt;br /&gt;
function set(number, number, number, number, number, number, number);&lt;br /&gt;
function setHMSms(number, number, number, number);&lt;br /&gt;
function diffSec(CTime*);&lt;br /&gt;
operator &amp;lt;(const CTime&amp;amp;, CTime);&lt;br /&gt;
operator +(CTime&amp;amp;, CTime);&lt;br /&gt;
operator &amp;gt;=(const CTime&amp;amp;, CTime);&lt;br /&gt;
function setHMS(number, number, number);&lt;br /&gt;
operator &amp;gt;(const CTime&amp;amp;, CTime);&lt;br /&gt;
operator -(CTime&amp;amp;, CTime);&lt;br /&gt;
operator &amp;lt;=(const CTime&amp;amp;, CTime);&lt;br /&gt;
function add(CTime*);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==класс CUIScriptWnd==&lt;br /&gt;
CUIScriptWnd(); --для работы с окном...&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    function _construct();&lt;br /&gt;
    function Register(CUIWindow*);&lt;br /&gt;
    function Register(CUIWindow*, string);&lt;br /&gt;
    function Enable(boolean);        --вкл/выкл&lt;br /&gt;
    function SetHeight(number);  --установка высоты&lt;br /&gt;
    function GetFrameLineWnd(string);&lt;br /&gt;
    function SetHolder(CDialogHolder*);&lt;br /&gt;
    function GetWidth() const;  --получение ширины контрола&lt;br /&gt;
    function GetCheckButton(string);--Получение состояния checkBox ,на выходе true или false?&lt;br /&gt;
    function DetachChild(CUIWindow*);&lt;br /&gt;
    function SetPPMode();&lt;br /&gt;
    function SetFont(CGameFont*);  --установка шрифта по имени&lt;br /&gt;
    function IsShown();                --проверка видно ли контрол иль нет?&lt;br /&gt;
    function Show(boolean);            --показывать контолили нет?&lt;br /&gt;
    function GetHeight() const;        --возвращает высоту&lt;br /&gt;
    function SetWidth(number);        --устанавливает ширину&lt;br /&gt;
    function GetListWndEx(string);&lt;br /&gt;
    function IsEnabled();&lt;br /&gt;
    function ResetPPMode();&lt;br /&gt;
    function GetPropertiesBox(string);&lt;br /&gt;
    function GetFont();                --возвращает шрифт установленный setFont?&lt;br /&gt;
    function Update();&lt;br /&gt;
    function AddCallback(string, number, const function&amp;lt;void&amp;gt;&amp;amp;); --соответские контрола с действие?&lt;br /&gt;
    function AddCallback(string, number, const function&amp;lt;void&amp;gt;&amp;amp;, object);--соответские контрола с действие?&lt;br /&gt;
    function GetButton(string);--Получаем последнюю нажатую кнопку?&lt;br /&gt;
    function SetAutoDelete(boolean);&lt;br /&gt;
    function OnKeyboard(number, enum EUIMessages);--Колбек нажатия на клавиатуре&lt;br /&gt;
    function Dispatch(number, number);&lt;br /&gt;
    function GetListWnd(string);--получение окна ListBoxa?&lt;br /&gt;
    function AttachChild(CUIWindow*);&lt;br /&gt;
    function GetStatic(string);--получение текста метки&lt;br /&gt;
    function SetWndPos(number, number);--установка позиции окна(x,y)&lt;br /&gt;
    function GetTabControl(string);&lt;br /&gt;
    function GetRadioButton(string);--состояние RadioButtton на выходите true или false&lt;br /&gt;
    function Init(number, number, number, number);--инициализация окна...читай FormInitializatione (x,y,width,height)&lt;br /&gt;
    function Init(Frect*);--инициализация окна&lt;br /&gt;
    function GetFrameWindow(string);&lt;br /&gt;
    function WindowName();&lt;br /&gt;
    function GetDialogWnd(string);&lt;br /&gt;
    function GetHolder();&lt;br /&gt;
    function SetWndRect(Frect);--установка координат углов&lt;br /&gt;
    function SetWndRect(number, number, number, number);--установка координат углов&lt;br /&gt;
    function GetEditBox(string);--получение текста из ЭдитБокса&lt;br /&gt;
    function SetWindowName(string);--Устанавливаем имя форме(caption)&lt;br /&gt;
    function GetProgressBar(string);&lt;br /&gt;
    function GetMessageBox(string);&lt;br /&gt;
    function SetWndSize(number, number);&lt;br /&gt;
    function Load(string);&lt;br /&gt;
    function IsAutoDelete();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
Статья создана: [[Участник:malandrinus|malandrinus]], [[Участник:IQDDD|IQDDD]], [[Участник:меченый|меченый]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>95.25.99.189</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC</id>
		<title>Справочник по функциям и классам</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC"/>
				<updated>2009-07-11T22:58:56Z</updated>
		
		<summary type="html">&lt;p&gt;95.25.99.189: /* Вспомогательные функции */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Посты с форума AMK&lt;br /&gt;
&lt;br /&gt;
==Основы==&lt;br /&gt;
Lua(в Сталкере,дальше буду просто писать Lua ) можно использовать не только для игрового процесса... Доступны основные(а может и все) команды(функции) к примеру Оператор ввода/вывода..работа с фаилами и т.д.(Возможно,только в ЧН....)&lt;br /&gt;
вот простой пример:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function to_my_log(text)&lt;br /&gt;
io.open(&amp;quot;gamedata\\solinx_log.txt&amp;quot;,&amp;quot;w&amp;quot;):write( text, &amp;quot;\n&amp;quot; )&lt;br /&gt;
io.open(&amp;quot;gamedata\\solinx_log.txt&amp;quot;,&amp;quot;w&amp;quot;):close()&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Рассмотрим подробнее===&lt;br /&gt;
io.open(filename) - &amp;quot;открывает&amp;quot; для каких либо целей filename&lt;br /&gt;
:write(text,&amp;quot;\n&amp;quot;) - оператор вывода,выводит(читай вписывает) в фаил открытый с помощью io.open , строку text...после переходит на следующую строку(есть ещё:&amp;quot;\t&amp;quot;,&amp;quot;\w&amp;quot;)&lt;br /&gt;
:read(text) - оператор ввода,вводит (читай &amp;quot;читает&amp;quot;) из фаила открытого с помощью io.open,строку текст&lt;br /&gt;
:close() - закрывает фаил открытый с помощью io.open&lt;br /&gt;
&lt;br /&gt;
статьи по Lua(основам) можно найти тут http://www.lua.ru/doc/&lt;br /&gt;
&lt;br /&gt;
Также есть функции &amp;quot;преобразования&amp;quot; ,как в любом языке(скриптовом,программирования)&lt;br /&gt;
Преобразование числового значения(любого) в строку:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
tostring(c)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где с - это число&lt;br /&gt;
Преобразование строки в число:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
tonumber(string)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где string - это строка (вдруг кто не в курсе )&lt;br /&gt;
&lt;br /&gt;
Особенность Lua(по моему только в нём так,хотя кроме Lua только питон смотрел):&lt;br /&gt;
что после основных операторов(циклов,условного и т.д.)(if ,for,while...)&lt;br /&gt;
ставится end&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
if then&lt;br /&gt;
else&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for i,c do&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
while &amp;quot;true&amp;quot; do&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ещё одной особенность LUА ,можно назвать работу с массивами(читай &amp;quot;таблицами&amp;quot;) без цикла&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local tbl={}&lt;br /&gt;
&lt;br /&gt;
--заполнение&lt;br /&gt;
function objparams_to_tbl(obj)&lt;br /&gt;
if isstalker(obj) then&lt;br /&gt;
tbl.sec =obj:section()&lt;br /&gt;
tbl.hp=obj:health&lt;br /&gt;
....&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--применение&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function objparams_to_msg()&lt;br /&gt;
news_manager.send_tip(db.actor,&amp;quot;obj:section =&amp;quot;..tbl.sec..&amp;quot;obj:health =&amp;quot;..obj.hp,nil,nil,1000)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Массив можно очистить/заполнить/прочитать/преобразовать....&lt;br /&gt;
&lt;br /&gt;
И совет:Пользуйтесь SCiTE или любой другой редактор с выделением синтаксиса....&lt;br /&gt;
&lt;br /&gt;
===Работа с фаилами===&lt;br /&gt;
Через системный фаил(systems.ltx)&lt;br /&gt;
&lt;br /&gt;
system_ini():r_string(section,key) -- получение строки из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
system_ini():r_bool(section,key) --получение булевого значения (true,false) из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
system_ini():r_s32(section,key) --получение (целого?)числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
system_ini():r_float(section,key) --получение числа(с плавающей точкой) числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Через другой фаил(который не прописан в системе)&lt;br /&gt;
&lt;br /&gt;
local ini =ini_file(&amp;quot;&amp;quot;) -- путь до фаила (обьявляем переменную которая хранит имя и путь).Дальше также как и с системным фаилом&lt;br /&gt;
&lt;br /&gt;
ini:r_string(section,key) -- получение строки из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
ini:r_bool(section,key) --получение булевого значения (true,false) из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
ini:r_s32(section,key) --получение (целого?)числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
ini:r_float(section,key) --получение числа(с плавающей точкой) числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Вспомогательные функции===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
system_ini():line_exist( section, key ) -- проверяет существует ли в секции [section ] ключ key&lt;br /&gt;
system_ini():section_exist(section) --проверяет существует ли секция [section ]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
EG:&lt;br /&gt;
0function eg()&lt;br /&gt;
1local ini=ini_file(&amp;quot;gamedata\\test.ltx&amp;quot;)&lt;br /&gt;
2if not ini then ini=system_ini() end&lt;br /&gt;
3if ini:section_exist(&amp;quot;test_section&amp;quot;) then&lt;br /&gt;
4if ini:line_exist(&amp;quot;test_line&amp;quot;) then&lt;br /&gt;
5return true&lt;br /&gt;
6end&lt;br /&gt;
7end&lt;br /&gt;
8end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
1. - присваиваем переменной фаил&amp;lt;br&amp;gt;&lt;br /&gt;
2. - проверяем существует ли фаил ,если нет то работаем с системой&amp;lt;br&amp;gt;&lt;br /&gt;
3. - проверяем наличие секции в фаиле(системе)&amp;lt;br&amp;gt;&lt;br /&gt;
4. - проверяем наличие ключа в секции из фаила(системы)&amp;lt;br&amp;gt;&lt;br /&gt;
5. - возвращаем истину(нашли ключ)&lt;br /&gt;
&lt;br /&gt;
Проверка ,что из себя представляет переменная&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function check_type(obj)&lt;br /&gt;
if obj then&lt;br /&gt;
if type(obj)==&amp;quot;string&amp;quot; then&lt;br /&gt;
return &amp;quot;string&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;number&amp;quot; then&lt;br /&gt;
return &amp;quot;number&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;function&amp;quot; then&lt;br /&gt;
return &amp;quot;function&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;boolean&amp;quot; then&lt;br /&gt;
return &amp;quot;boolean&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;userdata&amp;quot; then&lt;br /&gt;
return &amp;quot;userdata&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;table&amp;quot; then&lt;br /&gt;
return &amp;quot;table&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Теперь по порядку...&amp;lt;br&amp;gt;&lt;br /&gt;
Если obj это строка ,то возвращаем &amp;quot;string&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это число ,то возвращаем &amp;quot;number&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это функция ,то возвращаем &amp;quot;function&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это булево значение ,то возвращаем &amp;quot;booolean&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это юзердата(хз что это),то возвращаем &amp;quot;userdata&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это таблица, то возвращаем &amp;quot;table&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Это поможет в таких случаях ,когда неизвестно какой тип данных поступает в то или иное место...&lt;br /&gt;
&lt;br /&gt;
==Структура Lua_help==&lt;br /&gt;
Сам фаил можно найти в '''gamedata\scripts\lua_help.script'''&lt;br /&gt;
&amp;lt;code&amp;gt;C++ class [класс] {&lt;br /&gt;
     const [описание1] = [константа1];&lt;br /&gt;
     const [описание2] = [константа2];&lt;br /&gt;
     ...&lt;br /&gt;
     [константы заменяют описания при вызове методов классов];&lt;br /&gt;
     &lt;br /&gt;
     property [свойство1];&lt;br /&gt;
     property [свойство2];&lt;br /&gt;
     ...&lt;br /&gt;
[свойства (property) - это характеристика какого-либо класса, которая может подвергаться мат. операциям, слияниям, присвояниям и пр.&lt;br /&gt;
     читаются через точку: obj.health];&lt;br /&gt;
&lt;br /&gt;
     [глобальная(-ые) функция(-ии), которой вызывается класс];&lt;br /&gt;
     function [метод1] ([аргумент 1 функции 1], [аргумент 2 функции 1]...);&lt;br /&gt;
     function [метод2] ([аргумент 1 функции2]...);&lt;br /&gt;
             ...&lt;br /&gt;
     [методы - это специальные функции, выполняющие операции с классами и возвращающие значения после операций над классами.&lt;br /&gt;
     вызываются через двоеточие: obj:add_animation(...)];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Создание своего класса==&lt;br /&gt;
Свой класс можно добавить так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class &amp;quot;my_cool_class&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь &amp;quot;my_cool_class&amp;quot; - имя моего нового класса. Записывается в кавычках, т.е. это строка.&lt;br /&gt;
&lt;br /&gt;
Потом можно добавлять к этому классу свои методы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- это специальный метод - конструктор. Будет вызван при создании класса.&lt;br /&gt;
function my_cool_class:__init(num)&lt;br /&gt;
    self.my_param = num -- добавили в свой класс переменную&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- обычный метод&lt;br /&gt;
function my_cool_class:cool_method_of_my_class()&lt;br /&gt;
    get_console():execute(&amp;quot;lua_bind_in_action_&amp;quot;..self.my_param)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- деструктор, вызывается при сборке объекта сборщиком мусора. Аргументов не имеет (кроме скрытого self. об этом см. далее)&lt;br /&gt;
function my_cool_class:__finalize()&lt;br /&gt;
    get_console():execute(&amp;quot;good_by_&amp;quot;..self.my_param)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Потом можно создавать экземпляры своего класса, вызывать их методы и пр.:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local obj1 = my_cool_class(1) -- здесь создаётся новый объект. При этом вызывается конструктор и &lt;br /&gt;
                              -- ему передаются аргументы этого вызова (в данном случае число 1).&lt;br /&gt;
local obj2 = my_cool_class(4)&lt;br /&gt;
obj1:cool_method_of_my_class()&lt;br /&gt;
obj2:cool_method_of_my_class()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как только объект становится ненужным (т.е. на него больше нет ссылок) он удаляется сборщиком мусора. При этом вызывается его метод __finalize&lt;br /&gt;
&lt;br /&gt;
При чём здесь self.&lt;br /&gt;
self - это скрытый первый аргумент. Конструкция вида:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function class_name:fun_name(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
на самом деле эквивалентна конструкции &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function class_name.fun_name(self, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Обратите внимание на двоеточие в первом случае и точку во втором.&amp;lt;br&amp;gt;&lt;br /&gt;
При вызове метода конструкция вида:&lt;br /&gt;
&lt;br /&gt;
object_name:fun_name(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
эквивалентна конструкции&lt;br /&gt;
&lt;br /&gt;
object_name.fun_name(object_name, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Это означает, что в качестве self как правило передаётся сам же объект. &amp;quot;Как правило&amp;quot; - это потому, что можно в принципе передать что-то другое. Но лучше этого соглашения не нарушать.&lt;br /&gt;
&lt;br /&gt;
Всё это здорово, но какая от этого польза? Ну сделал я свой класс, и что с ним делать?&lt;br /&gt;
&lt;br /&gt;
В общем, классы - это неплохое средство организации своего кода. Владеющие объектно-ориентированным подходом найдут это расширение весьма удобным. В частности такие, ни к чему не привязанные классы, в скриптах сталкера используются в некоторых местах. Однако, настоящая сила этой технологии не в этом. С помощью этой технологии можно расширять классы, экспортированные в Lua со стороны движка игры. Об этом пойдет речь в следующей части.&lt;br /&gt;
&lt;br /&gt;
==Наследование от экспортированных классов==&lt;br /&gt;
Итак, кроме создания собственных классов технология Luabind позволяет создавать класы на основе уже существующих. Это реализовано в виде своеобразного наследования. Делается это с помощью следующей конструкции:&lt;br /&gt;
&lt;br /&gt;
'''class &amp;quot;my_derived_class&amp;quot; (base_class)'''&lt;br /&gt;
&lt;br /&gt;
Здесь:&lt;br /&gt;
&amp;quot;my_derived_class&amp;quot; как и раньше - это имя нового класса.&amp;lt;br&amp;gt;&lt;br /&gt;
base_class - это уже существующий класс, который будет базовым для вновь созданного. Имя выбрано произвольно, но подразумевается, что такой класс экспортирован и предназначен для наследования.&amp;lt;br&amp;gt;&lt;br /&gt;
Далеко не любой класс из экспортированных со стороны хост-приложения можно использовать в качестве базового. На стороне хост-приложения должен быть создан специальный класс-обёртка. Если его нет, то ничего хорошего не выйдет. Скорее всего при попытке использовать унаследованный класс в Lua будут малопонятные проблемы и вылеты, так что надо знать совершенно точно, можно ли от конкретного класса наследовать.&amp;lt;br&amp;gt;&lt;br /&gt;
Вопрос, какой глубины может быть наследование, т.е. можно ли наследовать от производного класса, мне пока до конца не ясен. С другой стороны, в этом практически нет необходимости.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итак после выполнения указанной конструкции появляется класс my_derived_class, который является копией класса base_class. У него есть в точности те же методы, что и у его базового класса. Пока от этого мало толку. Но теперь можно переопределить методы нашего класса, изменив таким образом его поведение. Делается это так же, как и ранее, но с некоторыми дополнениями.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- конструктор&lt;br /&gt;
function my_derived_class:__init(num) super(num)&lt;br /&gt;
end&lt;br /&gt;
-- обычный метод&lt;br /&gt;
function my_cool_class:some_method(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
    base_class.some_method(self, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
-- деструктор&lt;br /&gt;
function my_cool_class:__finalize()&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На что стОит обратить внимание.&amp;lt;br&amp;gt;&lt;br /&gt;
Во-первых, конструкция super(num). Это вызов конструктора базового класса.&amp;lt;br&amp;gt;&lt;br /&gt;
Во-вторых, для вызова метода базового класса из метода унаследованного используется другая конструкция base_class.some_method(self, ). Здесь надо использовать альтернативную форму вызова метода (с точкой и явным указанием первого аргумента self).&amp;lt;br&amp;gt;&lt;br /&gt;
Наконец, метод __finalize() не требует вызова этого же метода для базового класса, поскольку тот будет вызван автоматически при удалении объекта сборщиком мусора.&lt;br /&gt;
&lt;br /&gt;
Собственно и всё. Теперь можно пользоваться созданным классом: создавать объекты этого класса, вызывать их методы и пр. Здесь уже всё зависит от конкретных целей и требует знания конкретных классов.&lt;br /&gt;
&lt;br /&gt;
==сlass alife_simulator==&lt;br /&gt;
alife_simulator - класс для управления серверными объектами. В игре существует всего один экземпляр такого класса, и получить его можно с помощью вызова глобальной функции alife().&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
level_name(level_id) -- возвращает имя уровня по его id&lt;br /&gt;
create_ammo(&amp;lt;имя секции патронов&amp;gt;, position, lvid, gvid, id, amount) - создание пачек с патронами&lt;br /&gt;
create(&amp;lt;имя секции объекта&amp;gt;, position, lvid, gvid, id) -- создание объектов в инвентаре&lt;br /&gt;
create(&amp;lt;имя секции объекта&amp;gt;, position, lvid, gvid) -- создание объектов на уровне&lt;br /&gt;
во всех функция создания объектов&lt;br /&gt;
position - объект класса vector. Не может быть nil, иначе вылет&lt;br /&gt;
lvid - level vertex id&lt;br /&gt;
gvid - game vertex id&lt;br /&gt;
id - это куда спавним. Если в инвентарь, то указываем id непися или ноль (для актора)&lt;br /&gt;
release(sobj, boolean) -- удаляет объект sobj. Зачем второй булевский аргумент - не известно. &lt;br /&gt;
                          Во всех примерах он либо отсутствует, либо установлен в true&lt;br /&gt;
object(id) -- возвращает серверный объект по его id. Если не нашёл nil&lt;br /&gt;
story_object(sid) -- возвращает серверный объект по его story id. Если не нашёл nil&lt;br /&gt;
actor() -- возвращает серверный объект актора&lt;br /&gt;
set_switch_online(id, boolean) -- переводит в онлайн объект с идентификатором id&lt;br /&gt;
set_switch_offline(id, boolean) -- то же , но в онлайн&lt;br /&gt;
dont_has_info(const number&amp;amp;, string); -- проверка на Неполученный инфопоршень(db.actor:dont_has_info(&amp;quot;infoportion&amp;quot;) &lt;br /&gt;
                                      -- или alife():actor():dont_has_info(&amp;quot;infoportion&amp;quot;)).&lt;br /&gt;
has_info - противоположная&lt;br /&gt;
&lt;br /&gt;
предположительно:&lt;br /&gt;
switch_distance() -- радиус переключения в оффлайн?&lt;br /&gt;
switch_distance(number) -- установка этого радиуса?&lt;br /&gt;
level_id() -- текущий номер уровня ?&lt;br /&gt;
object(string) -- получение объекта оп его имени. Не помню точно, что за имя.&lt;br /&gt;
object(number, boolean) - то же, что и object(number)? на что влияет второй аргумент?&lt;br /&gt;
valid_object_id(number) -- проверка наличия объекта по id?&lt;br /&gt;
alife():create( &amp;lt;индекс объекта в all.spawn&amp;gt; ) -- &lt;br /&gt;
spawn_id(number) -- индекс объекта в all.spawn для объекта с заданным id ?&lt;br /&gt;
&lt;br /&gt;
неизвестно:&lt;br /&gt;
add_out_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
set_interactive(number, boolean);&lt;br /&gt;
add_in_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
function remove_in_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
remove_out_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
kill_entity(cse_alife_monster_abstract*, const number&amp;amp;, cse_alife_schedulable*);&lt;br /&gt;
kill_entity(alife_simulator*, cse_alife_monster_abstract*, const number&amp;amp;);&lt;br /&gt;
kill_entity(alife_simulator*, cse_alife_monster_abstract*);&lt;br /&gt;
has_info(const number&amp;amp;, string);&lt;br /&gt;
remove_all_restrictions(number, const enum RestrictionSpace::ERestrictorTypes&amp;amp;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local sim = alife() -- получаем сам объект класса alife_simulator&lt;br /&gt;
local sactor = sim:actor() -- получаем серверный объект для актора&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class vector==&lt;br /&gt;
vector - вспомогательный класс, содержащий три координаты, и позволяющий выполнять с ними различные манипуляции. Объекты класса vector являются аргументами многих функций и возвращаются многими функциями. См. например выше про метод create класса alife_simulator. Отдельный объект класса вектор создаётся вызовом глобальной функции vector(). При создании имеет координаты [0,0,0].&lt;br /&gt;
&lt;br /&gt;
===Список методов класса vector===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
v:set_length(number) - оставить направление, изменить длину&lt;br /&gt;
v:normalize(); - сделать длину единичной&lt;br /&gt;
&lt;br /&gt;
v:magnitude() -- длина вектора v&lt;br /&gt;
v1:distance_to(v2) -- расстояние между v1 и v2&lt;br /&gt;
v1:distance_to_sqr(v2) -- квадрат расстояния между v1 и v2&lt;br /&gt;
v1:crossproduct(v2) -- векторное произведение. Возвращает вектор&lt;br /&gt;
v1:dotproduct(v2) -- скалярное произведение. Возвращает число&lt;br /&gt;
v:sub(number); -- вычесть из каждого компонента v число number&lt;br /&gt;
v1:sub(v2); -- вычесть почленно вектор v2 из v1 и поместить в v1&lt;br /&gt;
v1:sub(v2, v3) -- вычесть из v2 - v3 и поместить в v1&lt;br /&gt;
аналогично:&lt;br /&gt;
add - почленное сложение&lt;br /&gt;
mul - почленное умножение&lt;br /&gt;
div - почленное деление&lt;br /&gt;
max/min - почленный максимум/минимум&lt;br /&gt;
v1:clamp(v2) -- почленное обрезание первого вторым&lt;br /&gt;
average -- почленное среднее&lt;br /&gt;
invert -- почленная инверсия знака&lt;br /&gt;
&lt;br /&gt;
v1:abs(v2); -- копирует почленно положительные компоненты в v1 из v2&lt;br /&gt;
lerp(v1, v2, number) -- линейная интерполяция между двумя векторами&lt;br /&gt;
-- если number больше 1, то выходит за них - экстраполяция&lt;br /&gt;
&lt;br /&gt;
v1:reflect(v2, v3) - должно быть отражение одного вектора от плоскости, определяемой другим. Не проверял&lt;br /&gt;
v1:slide(v2, v3); - вероятно, проекция одного вектора на плоскость, определяемую другим. Не уверен&lt;br /&gt;
v1:distance_to_xz(v2) - учитывая, что плоскость XZ - это плоскость параллельная земле, то возможно это &lt;br /&gt;
                        длина проекции на землю пути от точки до точки. Не проверял&lt;br /&gt;
&lt;br /&gt;
v:getP() - зенитный угол в радианах (угол наклона над плоскостью XZ )&lt;br /&gt;
v:getH() - азимутальный угол в радианах (угол в плоскости XZ между проекцией вектора на эту плоскость и осью Z)&lt;br /&gt;
setHP - соответственно для установки этих значений&lt;br /&gt;
v1:align() - выравнивает вектор вдоль оси x или z и нормирует его. Значение по y игнорируется. &lt;br /&gt;
             В итоге всегда возвращается одно из четырёх значений ([1,0,0], [-1,0,0], [0,0,1], [0,0,-1])&lt;br /&gt;
v4:mad(v1,v2,v3) -- бешеная операция =) умножить почленно второе на третье и сложить с &lt;br /&gt;
                    первым, т.е. v4 = v1 + v2*v3 (название операции mad == mul + add)&lt;br /&gt;
v1:inertion(v2, number) -- v1 = v2 + (v1-v2)*number (тоже почленно)&lt;br /&gt;
v1:similar(v2, number) -- сравнение векторов на равенство с погрешностью number. Выдаёт 1 или 0&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local v1 = vector()&lt;br /&gt;
v1:set(1,2,3)&lt;br /&gt;
local v2 = vector():set(4,5,6)&lt;br /&gt;
local dist = v1:distance_to(v2)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class fcolor==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class fcolor {&lt;br /&gt;
    property a; --альфа-цвет, отвечающий за прозрачность.&lt;br /&gt;
    property b; --blue-цвет, отвечающий за синий оттенок цвета.&lt;br /&gt;
    property g; --green-цвет, отвечающий за зелёный оттенок цвета.&lt;br /&gt;
    property r; --red-цвет, отвечающий за красный оттенок цвет.&lt;br /&gt;
&lt;br /&gt;
    fcolor ();&lt;br /&gt;
&lt;br /&gt;
    function set(number, number, number, number); --установка цвета (r,g,b,a)&lt;br /&gt;
    function set(const fcolor&amp;amp;); --установка цвета по уже имеющемуся классу &amp;quot;fcolor()&amp;quot;&lt;br /&gt;
    function set(number); -- не знаю. предполагаю, что есть несколько заранее подготовленных цветов с индексами для каждого.&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
color = fcolor()&lt;br /&gt;
color.a = 50&lt;br /&gt;
color.g = 255&lt;br /&gt;
color.r = 100&lt;br /&gt;
color.b = 50&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
или&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
color = fcolor()&lt;br /&gt;
color:set(100,255,50,50)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class hit==&lt;br /&gt;
Бывают случаи, при которых необходимо нанести некоторый урон неписю или мобу, при этом имитировав попадание в него. Для этого существует метод класса game_object:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function hit(hit*);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Чтобы использовать этот метод, нужно указать аргументы. В данном случае имеет объект другого класса - hit. Вот его описание:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class hit {&lt;br /&gt;
    const burn = 0; --здесь идут константы типов урона, используемых в свойстве &amp;quot;type&amp;quot;. Все мы прекрасно знаем, что означает каждый.&lt;br /&gt;
    const chemical_burn = 6;&lt;br /&gt;
    const dummy = 11;&lt;br /&gt;
    const explosion = 7;&lt;br /&gt;
    const fire_wound = 8;&lt;br /&gt;
    const radiation = 4;&lt;br /&gt;
    const shock = 1;&lt;br /&gt;
    const strike = 2;&lt;br /&gt;
    const telepatic = 5;&lt;br /&gt;
    const wound = 3;&lt;br /&gt;
&lt;br /&gt;
    property direction; --дирекция урона&lt;br /&gt;
    property draftsman; --обозначает персонажа, нанёсшего урон.&lt;br /&gt;
    property impulse; --импульс урона&lt;br /&gt;
    property power; --сила урона&lt;br /&gt;
    property type; -- тип урона (см. константы)&lt;br /&gt;
&lt;br /&gt;
    hit ();&lt;br /&gt;
    hit (const hit*);&lt;br /&gt;
&lt;br /&gt;
    function bone(string); --метод с указанием кости урона&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
hit = hit() -- создание объекта класса hit&lt;br /&gt;
hit.direction = vector():set(1,0,0) --дирекция по оси x&lt;br /&gt;
hit.draftsman = db.actor --нанёс урон актор&lt;br /&gt;
hit.impulse = 600 --импульс&lt;br /&gt;
hit.power = 1.45 --хит&lt;br /&gt;
hit.type = 2 --тип урона - выстрел&lt;br /&gt;
hit:bone(&amp;quot;bip01_head&amp;quot;) -- удар приходится на голову&lt;br /&gt;
obj:hit(hit)&lt;br /&gt;
-- наносим урон&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==&amp;quot;Функции времени&amp;quot;==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
time_global() -- реальное время (в миллисекундах) с начала запуска программы&lt;br /&gt;
game.time() -- игровое время (в игровых миллисекундах) с начала игры (т.е. с начала прохождения игры)&lt;br /&gt;
level.get_time_days() -- день месяца по игровому времени&lt;br /&gt;
level.get_time_hours() -- час текущего игрового дня&lt;br /&gt;
level.get_time_minutes() -- минута текущего игрового часа&lt;br /&gt;
&lt;br /&gt;
level.get_time_factor() -- возвращает отношение скорости течения игрового времени к скорости реального &lt;br /&gt;
                        --(game_time_speed / real_time_speed)&lt;br /&gt;
level.set_time_factor(number) -- устанавливает это отношение&lt;br /&gt;
&lt;br /&gt;
game.get_game_time() -- возвращает игровое время в виде объекта класса CTime. Класс CTime я опишу подробно &lt;br /&gt;
                     -- как-нибудь потом, а пока опишу только пару его методов.&lt;br /&gt;
конструктор. Вызывается через пространство имён game&lt;br /&gt;
game.CTime()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Дефолтовые значения===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
year, month, day = 1 &lt;br /&gt;
hour, min, sek, ms = 0&lt;br /&gt;
CTime.set(year, month, day, hour, min, sek, ms) -- устанавливает все данные о времени&lt;br /&gt;
метод CTime.get описан так:&lt;br /&gt;
function get(number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;);&lt;br /&gt;
что наводит на мысль о семи аргументах. однако с точки зрения Lua этот метод не принимает аргументов, зато возвращает семь значений. &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
====Пример использования обоих методов:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local t = game.CTime() -- создания объекта с дефолтовыми значнеиями&lt;br /&gt;
t:set(2009, 7, 11, 8, 11, 22, 333) -- установили все значения&lt;br /&gt;
&lt;br /&gt;
local y,m,d,h,min,sec,ms = t:get() -- получили все значения&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
===Класс CTime (неразобранный)===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class CTime {&lt;br /&gt;
const DateToDay = 0;&lt;br /&gt;
const DateToMonth = 1;&lt;br /&gt;
const DateToYear = 2;&lt;br /&gt;
const TimeToHours = 0;&lt;br /&gt;
const TimeToMilisecs = 3;&lt;br /&gt;
const TimeToMinutes = 1;&lt;br /&gt;
const TimeToSeconds = 2;&lt;br /&gt;
&lt;br /&gt;
CTime ();&lt;br /&gt;
CTime (const CTime&amp;amp;);&lt;br /&gt;
&lt;br /&gt;
function sub(CTime*);&lt;br /&gt;
function timeToString(number);&lt;br /&gt;
function dateToString(number);&lt;br /&gt;
operator ==(const CTime&amp;amp;, CTime);&lt;br /&gt;
function get(number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;);&lt;br /&gt;
function set(number, number, number, number, number, number, number);&lt;br /&gt;
function setHMSms(number, number, number, number);&lt;br /&gt;
function diffSec(CTime*);&lt;br /&gt;
operator &amp;lt;(const CTime&amp;amp;, CTime);&lt;br /&gt;
operator +(CTime&amp;amp;, CTime);&lt;br /&gt;
operator &amp;gt;=(const CTime&amp;amp;, CTime);&lt;br /&gt;
function setHMS(number, number, number);&lt;br /&gt;
operator &amp;gt;(const CTime&amp;amp;, CTime);&lt;br /&gt;
operator -(CTime&amp;amp;, CTime);&lt;br /&gt;
operator &amp;lt;=(const CTime&amp;amp;, CTime);&lt;br /&gt;
function add(CTime*);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==класс CUIScriptWnd==&lt;br /&gt;
CUIScriptWnd(); --для работы с окном...&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    function _construct();&lt;br /&gt;
    function Register(CUIWindow*);&lt;br /&gt;
    function Register(CUIWindow*, string);&lt;br /&gt;
    function Enable(boolean);        --вкл/выкл&lt;br /&gt;
    function SetHeight(number);  --установка высоты&lt;br /&gt;
    function GetFrameLineWnd(string);&lt;br /&gt;
    function SetHolder(CDialogHolder*);&lt;br /&gt;
    function GetWidth() const;  --получение ширины контрола&lt;br /&gt;
    function GetCheckButton(string);--Получение состояния checkBox ,на выходе true или false?&lt;br /&gt;
    function DetachChild(CUIWindow*);&lt;br /&gt;
    function SetPPMode();&lt;br /&gt;
    function SetFont(CGameFont*);  --установка шрифта по имени&lt;br /&gt;
    function IsShown();                --проверка видно ли контрол иль нет?&lt;br /&gt;
    function Show(boolean);            --показывать контолили нет?&lt;br /&gt;
    function GetHeight() const;        --возвращает высоту&lt;br /&gt;
    function SetWidth(number);        --устанавливает ширину&lt;br /&gt;
    function GetListWndEx(string);&lt;br /&gt;
    function IsEnabled();&lt;br /&gt;
    function ResetPPMode();&lt;br /&gt;
    function GetPropertiesBox(string);&lt;br /&gt;
    function GetFont();                --возвращает шрифт установленный setFont?&lt;br /&gt;
    function Update();&lt;br /&gt;
    function AddCallback(string, number, const function&amp;lt;void&amp;gt;&amp;amp;); --соответские контрола с действие?&lt;br /&gt;
    function AddCallback(string, number, const function&amp;lt;void&amp;gt;&amp;amp;, object);--соответские контрола с действие?&lt;br /&gt;
    function GetButton(string);--Получаем последнюю нажатую кнопку?&lt;br /&gt;
    function SetAutoDelete(boolean);&lt;br /&gt;
    function OnKeyboard(number, enum EUIMessages);--Колбек нажатия на клавиатуре&lt;br /&gt;
    function Dispatch(number, number);&lt;br /&gt;
    function GetListWnd(string);--получение окна ListBoxa?&lt;br /&gt;
    function AttachChild(CUIWindow*);&lt;br /&gt;
    function GetStatic(string);--получение текста метки&lt;br /&gt;
    function SetWndPos(number, number);--установка позиции окна(x,y)&lt;br /&gt;
    function GetTabControl(string);&lt;br /&gt;
    function GetRadioButton(string);--состояние RadioButtton на выходите true или false&lt;br /&gt;
    function Init(number, number, number, number);--инициализация окна...читай FormInitializatione (x,y,width,height)&lt;br /&gt;
    function Init(Frect*);--инициализация окна&lt;br /&gt;
    function GetFrameWindow(string);&lt;br /&gt;
    function WindowName();&lt;br /&gt;
    function GetDialogWnd(string);&lt;br /&gt;
    function GetHolder();&lt;br /&gt;
    function SetWndRect(Frect);--установка координат углов&lt;br /&gt;
    function SetWndRect(number, number, number, number);--установка координат углов&lt;br /&gt;
    function GetEditBox(string);--получение текста из ЭдитБокса&lt;br /&gt;
    function SetWindowName(string);--Устанавливаем имя форме(caption)&lt;br /&gt;
    function GetProgressBar(string);&lt;br /&gt;
    function GetMessageBox(string);&lt;br /&gt;
    function SetWndSize(number, number);&lt;br /&gt;
    function Load(string);&lt;br /&gt;
    function IsAutoDelete();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
Статья создана: [[Участник:malandrinus|malandrinus]], [[Участник:IQDDD|IQDDD]], [[Участник:меченый|меченый]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>95.25.99.189</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC</id>
		<title>Справочник по функциям и классам</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC"/>
				<updated>2009-07-11T22:55:42Z</updated>
		
		<summary type="html">&lt;p&gt;95.25.99.189: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Посты с форума AMK&lt;br /&gt;
&lt;br /&gt;
==Основы==&lt;br /&gt;
Lua(в Сталкере,дальше буду просто писать Lua ) можно использовать не только для игрового процесса... Доступны основные(а может и все) команды(функции) к примеру Оператор ввода/вывода..работа с фаилами и т.д.(Возможно,только в ЧН....)&lt;br /&gt;
вот простой пример:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function to_my_log(text)&lt;br /&gt;
io.open(&amp;quot;gamedata\\solinx_log.txt&amp;quot;,&amp;quot;w&amp;quot;):write( text, &amp;quot;\n&amp;quot; )&lt;br /&gt;
io.open(&amp;quot;gamedata\\solinx_log.txt&amp;quot;,&amp;quot;w&amp;quot;):close()&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Рассмотрим подробнее===&lt;br /&gt;
io.open(filename) - &amp;quot;открывает&amp;quot; для каких либо целей filename&lt;br /&gt;
:write(text,&amp;quot;\n&amp;quot;) - оператор вывода,выводит(читай вписывает) в фаил открытый с помощью io.open , строку text...после переходит на следующую строку(есть ещё:&amp;quot;\t&amp;quot;,&amp;quot;\w&amp;quot;)&lt;br /&gt;
:read(text) - оператор ввода,вводит (читай &amp;quot;читает&amp;quot;) из фаила открытого с помощью io.open,строку текст&lt;br /&gt;
:close() - закрывает фаил открытый с помощью io.open&lt;br /&gt;
&lt;br /&gt;
статьи по Lua(основам) можно найти тут http://www.lua.ru/doc/&lt;br /&gt;
&lt;br /&gt;
Также есть функции &amp;quot;преобразования&amp;quot; ,как в любом языке(скриптовом,программирования)&lt;br /&gt;
Преобразование числового значения(любого) в строку:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
tostring(c)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где с - это число&lt;br /&gt;
Преобразование строки в число:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
tonumber(string)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где string - это строка (вдруг кто не в курсе )&lt;br /&gt;
&lt;br /&gt;
Особенность Lua(по моему только в нём так,хотя кроме Lua только питон смотрел):&lt;br /&gt;
что после основных операторов(циклов,условного и т.д.)(if ,for,while...)&lt;br /&gt;
ставится end&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
if then&lt;br /&gt;
else&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for i,c do&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
while &amp;quot;true&amp;quot; do&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ещё одной особенность LUА ,можно назвать работу с массивами(читай &amp;quot;таблицами&amp;quot;) без цикла&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local tbl={}&lt;br /&gt;
&lt;br /&gt;
--заполнение&lt;br /&gt;
function objparams_to_tbl(obj)&lt;br /&gt;
if isstalker(obj) then&lt;br /&gt;
tbl.sec =obj:section()&lt;br /&gt;
tbl.hp=obj:health&lt;br /&gt;
....&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--применение&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function objparams_to_msg()&lt;br /&gt;
news_manager.send_tip(db.actor,&amp;quot;obj:section =&amp;quot;..tbl.sec..&amp;quot;obj:health =&amp;quot;..obj.hp,nil,nil,1000)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Массив можно очистить/заполнить/прочитать/преобразовать....&lt;br /&gt;
&lt;br /&gt;
И совет:Пользуйтесь SCiTE или любой другой редактор с выделением синтаксиса....&lt;br /&gt;
&lt;br /&gt;
===Работа с фаилами===&lt;br /&gt;
Через системный фаил(systems.ltx)&lt;br /&gt;
&lt;br /&gt;
system_ini():r_string(section,key) -- получение строки из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
system_ini():r_bool(section,key) --получение булевого значения (true,false) из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
system_ini():r_s32(section,key) --получение (целого?)числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
system_ini():r_float(section,key) --получение числа(с плавающей точкой) числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Через другой фаил(который не прописан в системе)&lt;br /&gt;
&lt;br /&gt;
local ini =ini_file(&amp;quot;&amp;quot;) -- путь до фаила (обьявляем переменную которая хранит имя и путь).Дальше также как и с системным фаилом&lt;br /&gt;
&lt;br /&gt;
ini:r_string(section,key) -- получение строки из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
ini:r_bool(section,key) --получение булевого значения (true,false) из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
ini:r_s32(section,key) --получение (целого?)числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
ini:r_float(section,key) --получение числа(с плавающей точкой) числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Вспомогательные функции===&lt;br /&gt;
&lt;br /&gt;
system_ini():line_exist( section, key ) -- проверяет существует ли в секции [section ] ключ key&lt;br /&gt;
system_ini():section_exist(section) --проверяет существует ли секция [section ]&lt;br /&gt;
&lt;br /&gt;
EG:&lt;br /&gt;
0function eg()&lt;br /&gt;
1local ini=ini_file(&amp;quot;gamedata\\test.ltx&amp;quot;)&lt;br /&gt;
2if not ini then ini=system_ini() end&lt;br /&gt;
3if ini:section_exist(&amp;quot;test_section&amp;quot;) then&lt;br /&gt;
4if ini:line_exist(&amp;quot;test_line&amp;quot;) then&lt;br /&gt;
5return true&lt;br /&gt;
6end&lt;br /&gt;
7end&lt;br /&gt;
8end&lt;br /&gt;
&lt;br /&gt;
1. - присваиваем переменной фаил&lt;br /&gt;
2. - проверяем существует ли фаил ,если нет то работаем с системой&lt;br /&gt;
3. - проверяем наличие секции в фаиле(системе)&lt;br /&gt;
4. - проверяем наличие ключа в секции из фаила(системы)&lt;br /&gt;
5. - возвращаем истину(нашли ключ)&lt;br /&gt;
&lt;br /&gt;
Проверка ,что из себя представляет переменная&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function check_type(obj)&lt;br /&gt;
if obj then&lt;br /&gt;
if type(obj)==&amp;quot;string&amp;quot; then&lt;br /&gt;
return &amp;quot;string&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;number&amp;quot; then&lt;br /&gt;
return &amp;quot;number&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;function&amp;quot; then&lt;br /&gt;
return &amp;quot;function&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;boolean&amp;quot; then&lt;br /&gt;
return &amp;quot;boolean&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;userdata&amp;quot; then&lt;br /&gt;
return &amp;quot;userdata&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;table&amp;quot; then&lt;br /&gt;
return &amp;quot;table&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Теперь по порядку...&amp;lt;br&amp;gt;&lt;br /&gt;
Если obj это строка ,то возвращаем &amp;quot;string&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это число ,то возвращаем &amp;quot;number&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это функция ,то возвращаем &amp;quot;function&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это булево значение ,то возвращаем &amp;quot;booolean&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это юзердата(хз что это),то возвращаем &amp;quot;userdata&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это таблица, то возвращаем &amp;quot;table&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Это поможет в таких случаях ,когда неизвестно какой тип данных поступает в то или иное место...&lt;br /&gt;
&lt;br /&gt;
==Структура Lua_help==&lt;br /&gt;
Сам фаил можно найти в '''gamedata\scripts\lua_help.script'''&lt;br /&gt;
&amp;lt;code&amp;gt;C++ class [класс] {&lt;br /&gt;
     const [описание1] = [константа1];&lt;br /&gt;
     const [описание2] = [константа2];&lt;br /&gt;
     ...&lt;br /&gt;
     [константы заменяют описания при вызове методов классов];&lt;br /&gt;
     &lt;br /&gt;
     property [свойство1];&lt;br /&gt;
     property [свойство2];&lt;br /&gt;
     ...&lt;br /&gt;
[свойства (property) - это характеристика какого-либо класса, которая может подвергаться мат. операциям, слияниям, присвояниям и пр.&lt;br /&gt;
     читаются через точку: obj.health];&lt;br /&gt;
&lt;br /&gt;
     [глобальная(-ые) функция(-ии), которой вызывается класс];&lt;br /&gt;
     function [метод1] ([аргумент 1 функции 1], [аргумент 2 функции 1]...);&lt;br /&gt;
     function [метод2] ([аргумент 1 функции2]...);&lt;br /&gt;
             ...&lt;br /&gt;
     [методы - это специальные функции, выполняющие операции с классами и возвращающие значения после операций над классами.&lt;br /&gt;
     вызываются через двоеточие: obj:add_animation(...)];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Создание своего класса==&lt;br /&gt;
Свой класс можно добавить так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class &amp;quot;my_cool_class&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь &amp;quot;my_cool_class&amp;quot; - имя моего нового класса. Записывается в кавычках, т.е. это строка.&lt;br /&gt;
&lt;br /&gt;
Потом можно добавлять к этому классу свои методы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- это специальный метод - конструктор. Будет вызван при создании класса.&lt;br /&gt;
function my_cool_class:__init(num)&lt;br /&gt;
    self.my_param = num -- добавили в свой класс переменную&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- обычный метод&lt;br /&gt;
function my_cool_class:cool_method_of_my_class()&lt;br /&gt;
    get_console():execute(&amp;quot;lua_bind_in_action_&amp;quot;..self.my_param)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- деструктор, вызывается при сборке объекта сборщиком мусора. Аргументов не имеет (кроме скрытого self. об этом см. далее)&lt;br /&gt;
function my_cool_class:__finalize()&lt;br /&gt;
    get_console():execute(&amp;quot;good_by_&amp;quot;..self.my_param)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Потом можно создавать экземпляры своего класса, вызывать их методы и пр.:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local obj1 = my_cool_class(1) -- здесь создаётся новый объект. При этом вызывается конструктор и &lt;br /&gt;
                              -- ему передаются аргументы этого вызова (в данном случае число 1).&lt;br /&gt;
local obj2 = my_cool_class(4)&lt;br /&gt;
obj1:cool_method_of_my_class()&lt;br /&gt;
obj2:cool_method_of_my_class()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как только объект становится ненужным (т.е. на него больше нет ссылок) он удаляется сборщиком мусора. При этом вызывается его метод __finalize&lt;br /&gt;
&lt;br /&gt;
При чём здесь self.&lt;br /&gt;
self - это скрытый первый аргумент. Конструкция вида:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function class_name:fun_name(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
на самом деле эквивалентна конструкции &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function class_name.fun_name(self, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Обратите внимание на двоеточие в первом случае и точку во втором.&amp;lt;br&amp;gt;&lt;br /&gt;
При вызове метода конструкция вида:&lt;br /&gt;
&lt;br /&gt;
object_name:fun_name(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
эквивалентна конструкции&lt;br /&gt;
&lt;br /&gt;
object_name.fun_name(object_name, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Это означает, что в качестве self как правило передаётся сам же объект. &amp;quot;Как правило&amp;quot; - это потому, что можно в принципе передать что-то другое. Но лучше этого соглашения не нарушать.&lt;br /&gt;
&lt;br /&gt;
Всё это здорово, но какая от этого польза? Ну сделал я свой класс, и что с ним делать?&lt;br /&gt;
&lt;br /&gt;
В общем, классы - это неплохое средство организации своего кода. Владеющие объектно-ориентированным подходом найдут это расширение весьма удобным. В частности такие, ни к чему не привязанные классы, в скриптах сталкера используются в некоторых местах. Однако, настоящая сила этой технологии не в этом. С помощью этой технологии можно расширять классы, экспортированные в Lua со стороны движка игры. Об этом пойдет речь в следующей части.&lt;br /&gt;
&lt;br /&gt;
==Наследование от экспортированных классов==&lt;br /&gt;
Итак, кроме создания собственных классов технология Luabind позволяет создавать класы на основе уже существующих. Это реализовано в виде своеобразного наследования. Делается это с помощью следующей конструкции:&lt;br /&gt;
&lt;br /&gt;
'''class &amp;quot;my_derived_class&amp;quot; (base_class)'''&lt;br /&gt;
&lt;br /&gt;
Здесь:&lt;br /&gt;
&amp;quot;my_derived_class&amp;quot; как и раньше - это имя нового класса.&amp;lt;br&amp;gt;&lt;br /&gt;
base_class - это уже существующий класс, который будет базовым для вновь созданного. Имя выбрано произвольно, но подразумевается, что такой класс экспортирован и предназначен для наследования.&amp;lt;br&amp;gt;&lt;br /&gt;
Далеко не любой класс из экспортированных со стороны хост-приложения можно использовать в качестве базового. На стороне хост-приложения должен быть создан специальный класс-обёртка. Если его нет, то ничего хорошего не выйдет. Скорее всего при попытке использовать унаследованный класс в Lua будут малопонятные проблемы и вылеты, так что надо знать совершенно точно, можно ли от конкретного класса наследовать.&amp;lt;br&amp;gt;&lt;br /&gt;
Вопрос, какой глубины может быть наследование, т.е. можно ли наследовать от производного класса, мне пока до конца не ясен. С другой стороны, в этом практически нет необходимости.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итак после выполнения указанной конструкции появляется класс my_derived_class, который является копией класса base_class. У него есть в точности те же методы, что и у его базового класса. Пока от этого мало толку. Но теперь можно переопределить методы нашего класса, изменив таким образом его поведение. Делается это так же, как и ранее, но с некоторыми дополнениями.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- конструктор&lt;br /&gt;
function my_derived_class:__init(num) super(num)&lt;br /&gt;
end&lt;br /&gt;
-- обычный метод&lt;br /&gt;
function my_cool_class:some_method(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
    base_class.some_method(self, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
-- деструктор&lt;br /&gt;
function my_cool_class:__finalize()&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На что стОит обратить внимание.&amp;lt;br&amp;gt;&lt;br /&gt;
Во-первых, конструкция super(num). Это вызов конструктора базового класса.&amp;lt;br&amp;gt;&lt;br /&gt;
Во-вторых, для вызова метода базового класса из метода унаследованного используется другая конструкция base_class.some_method(self, ). Здесь надо использовать альтернативную форму вызова метода (с точкой и явным указанием первого аргумента self).&amp;lt;br&amp;gt;&lt;br /&gt;
Наконец, метод __finalize() не требует вызова этого же метода для базового класса, поскольку тот будет вызван автоматически при удалении объекта сборщиком мусора.&lt;br /&gt;
&lt;br /&gt;
Собственно и всё. Теперь можно пользоваться созданным классом: создавать объекты этого класса, вызывать их методы и пр. Здесь уже всё зависит от конкретных целей и требует знания конкретных классов.&lt;br /&gt;
&lt;br /&gt;
==сlass alife_simulator==&lt;br /&gt;
alife_simulator - класс для управления серверными объектами. В игре существует всего один экземпляр такого класса, и получить его можно с помощью вызова глобальной функции alife().&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
level_name(level_id) -- возвращает имя уровня по его id&lt;br /&gt;
create_ammo(&amp;lt;имя секции патронов&amp;gt;, position, lvid, gvid, id, amount) - создание пачек с патронами&lt;br /&gt;
create(&amp;lt;имя секции объекта&amp;gt;, position, lvid, gvid, id) -- создание объектов в инвентаре&lt;br /&gt;
create(&amp;lt;имя секции объекта&amp;gt;, position, lvid, gvid) -- создание объектов на уровне&lt;br /&gt;
во всех функция создания объектов&lt;br /&gt;
position - объект класса vector. Не может быть nil, иначе вылет&lt;br /&gt;
lvid - level vertex id&lt;br /&gt;
gvid - game vertex id&lt;br /&gt;
id - это куда спавним. Если в инвентарь, то указываем id непися или ноль (для актора)&lt;br /&gt;
release(sobj, boolean) -- удаляет объект sobj. Зачем второй булевский аргумент - не известно. &lt;br /&gt;
                          Во всех примерах он либо отсутствует, либо установлен в true&lt;br /&gt;
object(id) -- возвращает серверный объект по его id. Если не нашёл nil&lt;br /&gt;
story_object(sid) -- возвращает серверный объект по его story id. Если не нашёл nil&lt;br /&gt;
actor() -- возвращает серверный объект актора&lt;br /&gt;
set_switch_online(id, boolean) -- переводит в онлайн объект с идентификатором id&lt;br /&gt;
set_switch_offline(id, boolean) -- то же , но в онлайн&lt;br /&gt;
dont_has_info(const number&amp;amp;, string); -- проверка на Неполученный инфопоршень(db.actor:dont_has_info(&amp;quot;infoportion&amp;quot;) &lt;br /&gt;
                                      -- или alife():actor():dont_has_info(&amp;quot;infoportion&amp;quot;)).&lt;br /&gt;
has_info - противоположная&lt;br /&gt;
&lt;br /&gt;
предположительно:&lt;br /&gt;
switch_distance() -- радиус переключения в оффлайн?&lt;br /&gt;
switch_distance(number) -- установка этого радиуса?&lt;br /&gt;
level_id() -- текущий номер уровня ?&lt;br /&gt;
object(string) -- получение объекта оп его имени. Не помню точно, что за имя.&lt;br /&gt;
object(number, boolean) - то же, что и object(number)? на что влияет второй аргумент?&lt;br /&gt;
valid_object_id(number) -- проверка наличия объекта по id?&lt;br /&gt;
alife():create( &amp;lt;индекс объекта в all.spawn&amp;gt; ) -- &lt;br /&gt;
spawn_id(number) -- индекс объекта в all.spawn для объекта с заданным id ?&lt;br /&gt;
&lt;br /&gt;
неизвестно:&lt;br /&gt;
add_out_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
set_interactive(number, boolean);&lt;br /&gt;
add_in_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
function remove_in_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
remove_out_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
kill_entity(cse_alife_monster_abstract*, const number&amp;amp;, cse_alife_schedulable*);&lt;br /&gt;
kill_entity(alife_simulator*, cse_alife_monster_abstract*, const number&amp;amp;);&lt;br /&gt;
kill_entity(alife_simulator*, cse_alife_monster_abstract*);&lt;br /&gt;
has_info(const number&amp;amp;, string);&lt;br /&gt;
remove_all_restrictions(number, const enum RestrictionSpace::ERestrictorTypes&amp;amp;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local sim = alife() -- получаем сам объект класса alife_simulator&lt;br /&gt;
local sactor = sim:actor() -- получаем серверный объект для актора&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class vector==&lt;br /&gt;
vector - вспомогательный класс, содержащий три координаты, и позволяющий выполнять с ними различные манипуляции. Объекты класса vector являются аргументами многих функций и возвращаются многими функциями. См. например выше про метод create класса alife_simulator. Отдельный объект класса вектор создаётся вызовом глобальной функции vector(). При создании имеет координаты [0,0,0].&lt;br /&gt;
&lt;br /&gt;
===Список методов класса vector===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
v:set_length(number) - оставить направление, изменить длину&lt;br /&gt;
v:normalize(); - сделать длину единичной&lt;br /&gt;
&lt;br /&gt;
v:magnitude() -- длина вектора v&lt;br /&gt;
v1:distance_to(v2) -- расстояние между v1 и v2&lt;br /&gt;
v1:distance_to_sqr(v2) -- квадрат расстояния между v1 и v2&lt;br /&gt;
v1:crossproduct(v2) -- векторное произведение. Возвращает вектор&lt;br /&gt;
v1:dotproduct(v2) -- скалярное произведение. Возвращает число&lt;br /&gt;
v:sub(number); -- вычесть из каждого компонента v число number&lt;br /&gt;
v1:sub(v2); -- вычесть почленно вектор v2 из v1 и поместить в v1&lt;br /&gt;
v1:sub(v2, v3) -- вычесть из v2 - v3 и поместить в v1&lt;br /&gt;
аналогично:&lt;br /&gt;
add - почленное сложение&lt;br /&gt;
mul - почленное умножение&lt;br /&gt;
div - почленное деление&lt;br /&gt;
max/min - почленный максимум/минимум&lt;br /&gt;
v1:clamp(v2) -- почленное обрезание первого вторым&lt;br /&gt;
average -- почленное среднее&lt;br /&gt;
invert -- почленная инверсия знака&lt;br /&gt;
&lt;br /&gt;
v1:abs(v2); -- копирует почленно положительные компоненты в v1 из v2&lt;br /&gt;
lerp(v1, v2, number) -- линейная интерполяция между двумя векторами&lt;br /&gt;
-- если number больше 1, то выходит за них - экстраполяция&lt;br /&gt;
&lt;br /&gt;
v1:reflect(v2, v3) - должно быть отражение одного вектора от плоскости, определяемой другим. Не проверял&lt;br /&gt;
v1:slide(v2, v3); - вероятно, проекция одного вектора на плоскость, определяемую другим. Не уверен&lt;br /&gt;
v1:distance_to_xz(v2) - учитывая, что плоскость XZ - это плоскость параллельная земле, то возможно это &lt;br /&gt;
                        длина проекции на землю пути от точки до точки. Не проверял&lt;br /&gt;
&lt;br /&gt;
v:getP() - зенитный угол в радианах (угол наклона над плоскостью XZ )&lt;br /&gt;
v:getH() - азимутальный угол в радианах (угол в плоскости XZ между проекцией вектора на эту плоскость и осью Z)&lt;br /&gt;
setHP - соответственно для установки этих значений&lt;br /&gt;
v1:align() - выравнивает вектор вдоль оси x или z и нормирует его. Значение по y игнорируется. &lt;br /&gt;
             В итоге всегда возвращается одно из четырёх значений ([1,0,0], [-1,0,0], [0,0,1], [0,0,-1])&lt;br /&gt;
v4:mad(v1,v2,v3) -- бешеная операция =) умножить почленно второе на третье и сложить с &lt;br /&gt;
                    первым, т.е. v4 = v1 + v2*v3 (название операции mad == mul + add)&lt;br /&gt;
v1:inertion(v2, number) -- v1 = v2 + (v1-v2)*number (тоже почленно)&lt;br /&gt;
v1:similar(v2, number) -- сравнение векторов на равенство с погрешностью number. Выдаёт 1 или 0&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local v1 = vector()&lt;br /&gt;
v1:set(1,2,3)&lt;br /&gt;
local v2 = vector():set(4,5,6)&lt;br /&gt;
local dist = v1:distance_to(v2)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class fcolor==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class fcolor {&lt;br /&gt;
    property a; --альфа-цвет, отвечающий за прозрачность.&lt;br /&gt;
    property b; --blue-цвет, отвечающий за синий оттенок цвета.&lt;br /&gt;
    property g; --green-цвет, отвечающий за зелёный оттенок цвета.&lt;br /&gt;
    property r; --red-цвет, отвечающий за красный оттенок цвет.&lt;br /&gt;
&lt;br /&gt;
    fcolor ();&lt;br /&gt;
&lt;br /&gt;
    function set(number, number, number, number); --установка цвета (r,g,b,a)&lt;br /&gt;
    function set(const fcolor&amp;amp;); --установка цвета по уже имеющемуся классу &amp;quot;fcolor()&amp;quot;&lt;br /&gt;
    function set(number); -- не знаю. предполагаю, что есть несколько заранее подготовленных цветов с индексами для каждого.&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
color = fcolor()&lt;br /&gt;
color.a = 50&lt;br /&gt;
color.g = 255&lt;br /&gt;
color.r = 100&lt;br /&gt;
color.b = 50&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
или&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
color = fcolor()&lt;br /&gt;
color:set(100,255,50,50)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class hit==&lt;br /&gt;
Бывают случаи, при которых необходимо нанести некоторый урон неписю или мобу, при этом имитировав попадание в него. Для этого существует метод класса game_object:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function hit(hit*);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Чтобы использовать этот метод, нужно указать аргументы. В данном случае имеет объект другого класса - hit. Вот его описание:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class hit {&lt;br /&gt;
    const burn = 0; --здесь идут константы типов урона, используемых в свойстве &amp;quot;type&amp;quot;. Все мы прекрасно знаем, что означает каждый.&lt;br /&gt;
    const chemical_burn = 6;&lt;br /&gt;
    const dummy = 11;&lt;br /&gt;
    const explosion = 7;&lt;br /&gt;
    const fire_wound = 8;&lt;br /&gt;
    const radiation = 4;&lt;br /&gt;
    const shock = 1;&lt;br /&gt;
    const strike = 2;&lt;br /&gt;
    const telepatic = 5;&lt;br /&gt;
    const wound = 3;&lt;br /&gt;
&lt;br /&gt;
    property direction; --дирекция урона&lt;br /&gt;
    property draftsman; --обозначает персонажа, нанёсшего урон.&lt;br /&gt;
    property impulse; --импульс урона&lt;br /&gt;
    property power; --сила урона&lt;br /&gt;
    property type; -- тип урона (см. константы)&lt;br /&gt;
&lt;br /&gt;
    hit ();&lt;br /&gt;
    hit (const hit*);&lt;br /&gt;
&lt;br /&gt;
    function bone(string); --метод с указанием кости урона&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
hit = hit() -- создание объекта класса hit&lt;br /&gt;
hit.direction = vector():set(1,0,0) --дирекция по оси x&lt;br /&gt;
hit.draftsman = db.actor --нанёс урон актор&lt;br /&gt;
hit.impulse = 600 --импульс&lt;br /&gt;
hit.power = 1.45 --хит&lt;br /&gt;
hit.type = 2 --тип урона - выстрел&lt;br /&gt;
hit:bone(&amp;quot;bip01_head&amp;quot;) -- удар приходится на голову&lt;br /&gt;
obj:hit(hit)&lt;br /&gt;
-- наносим урон&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==&amp;quot;Функции времени&amp;quot;==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
time_global() -- реальное время (в миллисекундах) с начала запуска программы&lt;br /&gt;
game.time() -- игровое время (в игровых миллисекундах) с начала игры (т.е. с начала прохождения игры)&lt;br /&gt;
level.get_time_days() -- день месяца по игровому времени&lt;br /&gt;
level.get_time_hours() -- час текущего игрового дня&lt;br /&gt;
level.get_time_minutes() -- минута текущего игрового часа&lt;br /&gt;
&lt;br /&gt;
level.get_time_factor() -- возвращает отношение скорости течения игрового времени к скорости реального &lt;br /&gt;
                        --(game_time_speed / real_time_speed)&lt;br /&gt;
level.set_time_factor(number) -- устанавливает это отношение&lt;br /&gt;
&lt;br /&gt;
game.get_game_time() -- возвращает игровое время в виде объекта класса CTime. Класс CTime я опишу подробно &lt;br /&gt;
                     -- как-нибудь потом, а пока опишу только пару его методов.&lt;br /&gt;
конструктор. Вызывается через пространство имён game&lt;br /&gt;
game.CTime()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Дефолтовые значения===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
year, month, day = 1 &lt;br /&gt;
hour, min, sek, ms = 0&lt;br /&gt;
CTime.set(year, month, day, hour, min, sek, ms) -- устанавливает все данные о времени&lt;br /&gt;
метод CTime.get описан так:&lt;br /&gt;
function get(number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;);&lt;br /&gt;
что наводит на мысль о семи аргументах. однако с точки зрения Lua этот метод не принимает аргументов, зато возвращает семь значений. &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
====Пример использования обоих методов:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local t = game.CTime() -- создания объекта с дефолтовыми значнеиями&lt;br /&gt;
t:set(2009, 7, 11, 8, 11, 22, 333) -- установили все значения&lt;br /&gt;
&lt;br /&gt;
local y,m,d,h,min,sec,ms = t:get() -- получили все значения&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
===Класс CTime (неразобранный)===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class CTime {&lt;br /&gt;
const DateToDay = 0;&lt;br /&gt;
const DateToMonth = 1;&lt;br /&gt;
const DateToYear = 2;&lt;br /&gt;
const TimeToHours = 0;&lt;br /&gt;
const TimeToMilisecs = 3;&lt;br /&gt;
const TimeToMinutes = 1;&lt;br /&gt;
const TimeToSeconds = 2;&lt;br /&gt;
&lt;br /&gt;
CTime ();&lt;br /&gt;
CTime (const CTime&amp;amp;);&lt;br /&gt;
&lt;br /&gt;
function sub(CTime*);&lt;br /&gt;
function timeToString(number);&lt;br /&gt;
function dateToString(number);&lt;br /&gt;
operator ==(const CTime&amp;amp;, CTime);&lt;br /&gt;
function get(number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;);&lt;br /&gt;
function set(number, number, number, number, number, number, number);&lt;br /&gt;
function setHMSms(number, number, number, number);&lt;br /&gt;
function diffSec(CTime*);&lt;br /&gt;
operator &amp;lt;(const CTime&amp;amp;, CTime);&lt;br /&gt;
operator +(CTime&amp;amp;, CTime);&lt;br /&gt;
operator &amp;gt;=(const CTime&amp;amp;, CTime);&lt;br /&gt;
function setHMS(number, number, number);&lt;br /&gt;
operator &amp;gt;(const CTime&amp;amp;, CTime);&lt;br /&gt;
operator -(CTime&amp;amp;, CTime);&lt;br /&gt;
operator &amp;lt;=(const CTime&amp;amp;, CTime);&lt;br /&gt;
function add(CTime*);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==класс CUIScriptWnd==&lt;br /&gt;
CUIScriptWnd(); --для работы с окном...&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    function _construct();&lt;br /&gt;
    function Register(CUIWindow*);&lt;br /&gt;
    function Register(CUIWindow*, string);&lt;br /&gt;
    function Enable(boolean);        --вкл/выкл&lt;br /&gt;
    function SetHeight(number);  --установка высоты&lt;br /&gt;
    function GetFrameLineWnd(string);&lt;br /&gt;
    function SetHolder(CDialogHolder*);&lt;br /&gt;
    function GetWidth() const;  --получение ширины контрола&lt;br /&gt;
    function GetCheckButton(string);--Получение состояния checkBox ,на выходе true или false?&lt;br /&gt;
    function DetachChild(CUIWindow*);&lt;br /&gt;
    function SetPPMode();&lt;br /&gt;
    function SetFont(CGameFont*);  --установка шрифта по имени&lt;br /&gt;
    function IsShown();                --проверка видно ли контрол иль нет?&lt;br /&gt;
    function Show(boolean);            --показывать контолили нет?&lt;br /&gt;
    function GetHeight() const;        --возвращает высоту&lt;br /&gt;
    function SetWidth(number);        --устанавливает ширину&lt;br /&gt;
    function GetListWndEx(string);&lt;br /&gt;
    function IsEnabled();&lt;br /&gt;
    function ResetPPMode();&lt;br /&gt;
    function GetPropertiesBox(string);&lt;br /&gt;
    function GetFont();                --возвращает шрифт установленный setFont?&lt;br /&gt;
    function Update();&lt;br /&gt;
    function AddCallback(string, number, const function&amp;lt;void&amp;gt;&amp;amp;); --соответские контрола с действие?&lt;br /&gt;
    function AddCallback(string, number, const function&amp;lt;void&amp;gt;&amp;amp;, object);--соответские контрола с действие?&lt;br /&gt;
    function GetButton(string);--Получаем последнюю нажатую кнопку?&lt;br /&gt;
    function SetAutoDelete(boolean);&lt;br /&gt;
    function OnKeyboard(number, enum EUIMessages);--Колбек нажатия на клавиатуре&lt;br /&gt;
    function Dispatch(number, number);&lt;br /&gt;
    function GetListWnd(string);--получение окна ListBoxa?&lt;br /&gt;
    function AttachChild(CUIWindow*);&lt;br /&gt;
    function GetStatic(string);--получение текста метки&lt;br /&gt;
    function SetWndPos(number, number);--установка позиции окна(x,y)&lt;br /&gt;
    function GetTabControl(string);&lt;br /&gt;
    function GetRadioButton(string);--состояние RadioButtton на выходите true или false&lt;br /&gt;
    function Init(number, number, number, number);--инициализация окна...читай FormInitializatione (x,y,width,height)&lt;br /&gt;
    function Init(Frect*);--инициализация окна&lt;br /&gt;
    function GetFrameWindow(string);&lt;br /&gt;
    function WindowName();&lt;br /&gt;
    function GetDialogWnd(string);&lt;br /&gt;
    function GetHolder();&lt;br /&gt;
    function SetWndRect(Frect);--установка координат углов&lt;br /&gt;
    function SetWndRect(number, number, number, number);--установка координат углов&lt;br /&gt;
    function GetEditBox(string);--получение текста из ЭдитБокса&lt;br /&gt;
    function SetWindowName(string);--Устанавливаем имя форме(caption)&lt;br /&gt;
    function GetProgressBar(string);&lt;br /&gt;
    function GetMessageBox(string);&lt;br /&gt;
    function SetWndSize(number, number);&lt;br /&gt;
    function Load(string);&lt;br /&gt;
    function IsAutoDelete();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
Статья создана: [[Участник:malandrinus|malandrinus]], [[Участник:IQDDD|IQDDD]], [[Участник:меченый|меченый]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>95.25.99.189</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC</id>
		<title>Справочник по функциям и классам</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC"/>
				<updated>2009-07-11T22:53:21Z</updated>
		
		<summary type="html">&lt;p&gt;95.25.99.189: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Посты с форума AMK&lt;br /&gt;
&lt;br /&gt;
==Структура Lua_help==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;C++ class [класс] {&lt;br /&gt;
     const [описание1] = [константа1];&lt;br /&gt;
     const [описание2] = [константа2];&lt;br /&gt;
     ...&lt;br /&gt;
     [константы заменяют описания при вызове методов классов];&lt;br /&gt;
     &lt;br /&gt;
     property [свойство1];&lt;br /&gt;
     property [свойство2];&lt;br /&gt;
     ...&lt;br /&gt;
[свойства (property) - это характеристика какого-либо класса, которая может подвергаться мат. операциям, слияниям, присвояниям и пр.&lt;br /&gt;
     читаются через точку: obj.health];&lt;br /&gt;
&lt;br /&gt;
     [глобальная(-ые) функция(-ии), которой вызывается класс];&lt;br /&gt;
     function [метод1] ([аргумент 1 функции 1], [аргумент 2 функции 1]...);&lt;br /&gt;
     function [метод2] ([аргумент 1 функции2]...);&lt;br /&gt;
             ...&lt;br /&gt;
     [методы - это специальные функции, выполняющие операции с классами и возвращающие значения после операций над классами.&lt;br /&gt;
     вызываются через двоеточие: obj:add_animation(...)];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Основы==&lt;br /&gt;
Lua(в Сталкере,дальше буду просто писать Lua ) можно использовать не только для игрового процесса... Доступны основные(а может и все) команды(функции) к примеру Оператор ввода/вывода..работа с фаилами и т.д.(Возможно,только в ЧН....)&lt;br /&gt;
вот простой пример:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function to_my_log(text)&lt;br /&gt;
io.open(&amp;quot;gamedata\\solinx_log.txt&amp;quot;,&amp;quot;w&amp;quot;):write( text, &amp;quot;\n&amp;quot; )&lt;br /&gt;
io.open(&amp;quot;gamedata\\solinx_log.txt&amp;quot;,&amp;quot;w&amp;quot;):close()&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Рассмотрим подробнее===&lt;br /&gt;
io.open(filename) - &amp;quot;открывает&amp;quot; для каких либо целей filename&lt;br /&gt;
:write(text,&amp;quot;\n&amp;quot;) - оператор вывода,выводит(читай вписывает) в фаил открытый с помощью io.open , строку text...после переходит на следующую строку(есть ещё:&amp;quot;\t&amp;quot;,&amp;quot;\w&amp;quot;)&lt;br /&gt;
:read(text) - оператор ввода,вводит (читай &amp;quot;читает&amp;quot;) из фаила открытого с помощью io.open,строку текст&lt;br /&gt;
:close() - закрывает фаил открытый с помощью io.open&lt;br /&gt;
&lt;br /&gt;
статьи по Lua(основам) можно найти тут http://www.lua.ru/doc/&lt;br /&gt;
&lt;br /&gt;
Также есть функции &amp;quot;преобразования&amp;quot; ,как в любом языке(скриптовом,программирования)&lt;br /&gt;
Преобразование числового значения(любого) в строку:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
tostring(c)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где с - это число&lt;br /&gt;
Преобразование строки в число:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
tonumber(string)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
где string - это строка (вдруг кто не в курсе )&lt;br /&gt;
&lt;br /&gt;
Особенность Lua(по моему только в нём так,хотя кроме Lua только питон смотрел):&lt;br /&gt;
что после основных операторов(циклов,условного и т.д.)(if ,for,while...)&lt;br /&gt;
ставится end&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
if then&lt;br /&gt;
else&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for i,c do&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
while &amp;quot;true&amp;quot; do&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ещё одной особенность LUА ,можно назвать работу с массивами(читай &amp;quot;таблицами&amp;quot;) без цикла&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local tbl={}&lt;br /&gt;
&lt;br /&gt;
--заполнение&lt;br /&gt;
function objparams_to_tbl(obj)&lt;br /&gt;
if isstalker(obj) then&lt;br /&gt;
tbl.sec =obj:section()&lt;br /&gt;
tbl.hp=obj:health&lt;br /&gt;
....&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--применение&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function objparams_to_msg()&lt;br /&gt;
news_manager.send_tip(db.actor,&amp;quot;obj:section =&amp;quot;..tbl.sec..&amp;quot;obj:health =&amp;quot;..obj.hp,nil,nil,1000)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Массив можно очистить/заполнить/прочитать/преобразовать....&lt;br /&gt;
&lt;br /&gt;
И совет:Пользуйтесь SCiTE или любой другой редактор с выделением синтаксиса....&lt;br /&gt;
&lt;br /&gt;
===Работа с фаилами===&lt;br /&gt;
Через системный фаил(systems.ltx)&lt;br /&gt;
&lt;br /&gt;
system_ini():r_string(section,key) -- получение строки из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
system_ini():r_bool(section,key) --получение булевого значения (true,false) из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
system_ini():r_s32(section,key) --получение (целого?)числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
system_ini():r_float(section,key) --получение числа(с плавающей точкой) числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Через другой фаил(который не прописан в системе)&lt;br /&gt;
&lt;br /&gt;
local ini =ini_file(&amp;quot;&amp;quot;) -- путь до фаила (обьявляем переменную которая хранит имя и путь).Дальше также как и с системным фаилом&lt;br /&gt;
&lt;br /&gt;
ini:r_string(section,key) -- получение строки из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
ini:r_bool(section,key) --получение булевого значения (true,false) из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
ini:r_s32(section,key) --получение (целого?)числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
ini:r_float(section,key) --получение числа(с плавающей точкой) числа из секции[section ] и ключа key&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Вспомогательные функции===&lt;br /&gt;
&lt;br /&gt;
system_ini():line_exist( section, key ) -- проверяет существует ли в секции [section ] ключ key&lt;br /&gt;
system_ini():section_exist(section) --проверяет существует ли секция [section ]&lt;br /&gt;
&lt;br /&gt;
EG:&lt;br /&gt;
0function eg()&lt;br /&gt;
1local ini=ini_file(&amp;quot;gamedata\\test.ltx&amp;quot;)&lt;br /&gt;
2if not ini then ini=system_ini() end&lt;br /&gt;
3if ini:section_exist(&amp;quot;test_section&amp;quot;) then&lt;br /&gt;
4if ini:line_exist(&amp;quot;test_line&amp;quot;) then&lt;br /&gt;
5return true&lt;br /&gt;
6end&lt;br /&gt;
7end&lt;br /&gt;
8end&lt;br /&gt;
&lt;br /&gt;
1. - присваиваем переменной фаил&lt;br /&gt;
2. - проверяем существует ли фаил ,если нет то работаем с системой&lt;br /&gt;
3. - проверяем наличие секции в фаиле(системе)&lt;br /&gt;
4. - проверяем наличие ключа в секции из фаила(системы)&lt;br /&gt;
5. - возвращаем истину(нашли ключ)&lt;br /&gt;
&lt;br /&gt;
Проверка ,что из себя представляет переменная&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function check_type(obj)&lt;br /&gt;
if obj then&lt;br /&gt;
if type(obj)==&amp;quot;string&amp;quot; then&lt;br /&gt;
return &amp;quot;string&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;number&amp;quot; then&lt;br /&gt;
return &amp;quot;number&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;function&amp;quot; then&lt;br /&gt;
return &amp;quot;function&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;boolean&amp;quot; then&lt;br /&gt;
return &amp;quot;boolean&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;userdata&amp;quot; then&lt;br /&gt;
return &amp;quot;userdata&amp;quot;&lt;br /&gt;
elseif type(obj)==&amp;quot;table&amp;quot; then&lt;br /&gt;
return &amp;quot;table&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Теперь по порядку...&amp;lt;br&amp;gt;&lt;br /&gt;
Если obj это строка ,то возвращаем &amp;quot;string&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это число ,то возвращаем &amp;quot;number&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это функция ,то возвращаем &amp;quot;function&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это булево значение ,то возвращаем &amp;quot;booolean&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это юзердата(хз что это),то возвращаем &amp;quot;userdata&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
Если же obj это таблица, то возвращаем &amp;quot;table&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Это поможет в таких случаях ,когда неизвестно какой тип данных поступает в то или иное место...&lt;br /&gt;
&lt;br /&gt;
==Создание своего класса==&lt;br /&gt;
Свой класс можно добавить так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class &amp;quot;my_cool_class&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь &amp;quot;my_cool_class&amp;quot; - имя моего нового класса. Записывается в кавычках, т.е. это строка.&lt;br /&gt;
&lt;br /&gt;
Потом можно добавлять к этому классу свои методы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- это специальный метод - конструктор. Будет вызван при создании класса.&lt;br /&gt;
function my_cool_class:__init(num)&lt;br /&gt;
    self.my_param = num -- добавили в свой класс переменную&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- обычный метод&lt;br /&gt;
function my_cool_class:cool_method_of_my_class()&lt;br /&gt;
    get_console():execute(&amp;quot;lua_bind_in_action_&amp;quot;..self.my_param)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- деструктор, вызывается при сборке объекта сборщиком мусора. Аргументов не имеет (кроме скрытого self. об этом см. далее)&lt;br /&gt;
function my_cool_class:__finalize()&lt;br /&gt;
    get_console():execute(&amp;quot;good_by_&amp;quot;..self.my_param)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Потом можно создавать экземпляры своего класса, вызывать их методы и пр.:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local obj1 = my_cool_class(1) -- здесь создаётся новый объект. При этом вызывается конструктор и &lt;br /&gt;
                              -- ему передаются аргументы этого вызова (в данном случае число 1).&lt;br /&gt;
local obj2 = my_cool_class(4)&lt;br /&gt;
obj1:cool_method_of_my_class()&lt;br /&gt;
obj2:cool_method_of_my_class()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как только объект становится ненужным (т.е. на него больше нет ссылок) он удаляется сборщиком мусора. При этом вызывается его метод __finalize&lt;br /&gt;
&lt;br /&gt;
При чём здесь self.&lt;br /&gt;
self - это скрытый первый аргумент. Конструкция вида:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function class_name:fun_name(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
на самом деле эквивалентна конструкции &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function class_name.fun_name(self, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Обратите внимание на двоеточие в первом случае и точку во втором.&amp;lt;br&amp;gt;&lt;br /&gt;
При вызове метода конструкция вида:&lt;br /&gt;
&lt;br /&gt;
object_name:fun_name(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
эквивалентна конструкции&lt;br /&gt;
&lt;br /&gt;
object_name.fun_name(object_name, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Это означает, что в качестве self как правило передаётся сам же объект. &amp;quot;Как правило&amp;quot; - это потому, что можно в принципе передать что-то другое. Но лучше этого соглашения не нарушать.&lt;br /&gt;
&lt;br /&gt;
Всё это здорово, но какая от этого польза? Ну сделал я свой класс, и что с ним делать?&lt;br /&gt;
&lt;br /&gt;
В общем, классы - это неплохое средство организации своего кода. Владеющие объектно-ориентированным подходом найдут это расширение весьма удобным. В частности такие, ни к чему не привязанные классы, в скриптах сталкера используются в некоторых местах. Однако, настоящая сила этой технологии не в этом. С помощью этой технологии можно расширять классы, экспортированные в Lua со стороны движка игры. Об этом пойдет речь в следующей части.&lt;br /&gt;
&lt;br /&gt;
==Наследование от экспортированных классов==&lt;br /&gt;
Итак, кроме создания собственных классов технология Luabind позволяет создавать класы на основе уже существующих. Это реализовано в виде своеобразного наследования. Делается это с помощью следующей конструкции:&lt;br /&gt;
&lt;br /&gt;
'''class &amp;quot;my_derived_class&amp;quot; (base_class)'''&lt;br /&gt;
&lt;br /&gt;
Здесь:&lt;br /&gt;
&amp;quot;my_derived_class&amp;quot; как и раньше - это имя нового класса.&amp;lt;br&amp;gt;&lt;br /&gt;
base_class - это уже существующий класс, который будет базовым для вновь созданного. Имя выбрано произвольно, но подразумевается, что такой класс экспортирован и предназначен для наследования.&amp;lt;br&amp;gt;&lt;br /&gt;
Далеко не любой класс из экспортированных со стороны хост-приложения можно использовать в качестве базового. На стороне хост-приложения должен быть создан специальный класс-обёртка. Если его нет, то ничего хорошего не выйдет. Скорее всего при попытке использовать унаследованный класс в Lua будут малопонятные проблемы и вылеты, так что надо знать совершенно точно, можно ли от конкретного класса наследовать.&amp;lt;br&amp;gt;&lt;br /&gt;
Вопрос, какой глубины может быть наследование, т.е. можно ли наследовать от производного класса, мне пока до конца не ясен. С другой стороны, в этом практически нет необходимости.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итак после выполнения указанной конструкции появляется класс my_derived_class, который является копией класса base_class. У него есть в точности те же методы, что и у его базового класса. Пока от этого мало толку. Но теперь можно переопределить методы нашего класса, изменив таким образом его поведение. Делается это так же, как и ранее, но с некоторыми дополнениями.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- конструктор&lt;br /&gt;
function my_derived_class:__init(num) super(num)&lt;br /&gt;
end&lt;br /&gt;
-- обычный метод&lt;br /&gt;
function my_cool_class:some_method(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
    base_class.some_method(self, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
-- деструктор&lt;br /&gt;
function my_cool_class:__finalize()&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На что стОит обратить внимание.&amp;lt;br&amp;gt;&lt;br /&gt;
Во-первых, конструкция super(num). Это вызов конструктора базового класса.&amp;lt;br&amp;gt;&lt;br /&gt;
Во-вторых, для вызова метода базового класса из метода унаследованного используется другая конструкция base_class.some_method(self, ). Здесь надо использовать альтернативную форму вызова метода (с точкой и явным указанием первого аргумента self).&amp;lt;br&amp;gt;&lt;br /&gt;
Наконец, метод __finalize() не требует вызова этого же метода для базового класса, поскольку тот будет вызван автоматически при удалении объекта сборщиком мусора.&lt;br /&gt;
&lt;br /&gt;
Собственно и всё. Теперь можно пользоваться созданным классом: создавать объекты этого класса, вызывать их методы и пр. Здесь уже всё зависит от конкретных целей и требует знания конкретных классов.&lt;br /&gt;
&lt;br /&gt;
==сlass alife_simulator==&lt;br /&gt;
alife_simulator - класс для управления серверными объектами. В игре существует всего один экземпляр такого класса, и получить его можно с помощью вызова глобальной функции alife().&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
level_name(level_id) -- возвращает имя уровня по его id&lt;br /&gt;
create_ammo(&amp;lt;имя секции патронов&amp;gt;, position, lvid, gvid, id, amount) - создание пачек с патронами&lt;br /&gt;
create(&amp;lt;имя секции объекта&amp;gt;, position, lvid, gvid, id) -- создание объектов в инвентаре&lt;br /&gt;
create(&amp;lt;имя секции объекта&amp;gt;, position, lvid, gvid) -- создание объектов на уровне&lt;br /&gt;
во всех функция создания объектов&lt;br /&gt;
position - объект класса vector. Не может быть nil, иначе вылет&lt;br /&gt;
lvid - level vertex id&lt;br /&gt;
gvid - game vertex id&lt;br /&gt;
id - это куда спавним. Если в инвентарь, то указываем id непися или ноль (для актора)&lt;br /&gt;
release(sobj, boolean) -- удаляет объект sobj. Зачем второй булевский аргумент - не известно. &lt;br /&gt;
                          Во всех примерах он либо отсутствует, либо установлен в true&lt;br /&gt;
object(id) -- возвращает серверный объект по его id. Если не нашёл nil&lt;br /&gt;
story_object(sid) -- возвращает серверный объект по его story id. Если не нашёл nil&lt;br /&gt;
actor() -- возвращает серверный объект актора&lt;br /&gt;
set_switch_online(id, boolean) -- переводит в онлайн объект с идентификатором id&lt;br /&gt;
set_switch_offline(id, boolean) -- то же , но в онлайн&lt;br /&gt;
dont_has_info(const number&amp;amp;, string); -- проверка на Неполученный инфопоршень(db.actor:dont_has_info(&amp;quot;infoportion&amp;quot;) &lt;br /&gt;
                                      -- или alife():actor():dont_has_info(&amp;quot;infoportion&amp;quot;)).&lt;br /&gt;
has_info - противоположная&lt;br /&gt;
&lt;br /&gt;
предположительно:&lt;br /&gt;
switch_distance() -- радиус переключения в оффлайн?&lt;br /&gt;
switch_distance(number) -- установка этого радиуса?&lt;br /&gt;
level_id() -- текущий номер уровня ?&lt;br /&gt;
object(string) -- получение объекта оп его имени. Не помню точно, что за имя.&lt;br /&gt;
object(number, boolean) - то же, что и object(number)? на что влияет второй аргумент?&lt;br /&gt;
valid_object_id(number) -- проверка наличия объекта по id?&lt;br /&gt;
alife():create( &amp;lt;индекс объекта в all.spawn&amp;gt; ) -- &lt;br /&gt;
spawn_id(number) -- индекс объекта в all.spawn для объекта с заданным id ?&lt;br /&gt;
&lt;br /&gt;
неизвестно:&lt;br /&gt;
add_out_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
set_interactive(number, boolean);&lt;br /&gt;
add_in_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
function remove_in_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
remove_out_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
kill_entity(cse_alife_monster_abstract*, const number&amp;amp;, cse_alife_schedulable*);&lt;br /&gt;
kill_entity(alife_simulator*, cse_alife_monster_abstract*, const number&amp;amp;);&lt;br /&gt;
kill_entity(alife_simulator*, cse_alife_monster_abstract*);&lt;br /&gt;
has_info(const number&amp;amp;, string);&lt;br /&gt;
remove_all_restrictions(number, const enum RestrictionSpace::ERestrictorTypes&amp;amp;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local sim = alife() -- получаем сам объект класса alife_simulator&lt;br /&gt;
local sactor = sim:actor() -- получаем серверный объект для актора&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class vector==&lt;br /&gt;
vector - вспомогательный класс, содержащий три координаты, и позволяющий выполнять с ними различные манипуляции. Объекты класса vector являются аргументами многих функций и возвращаются многими функциями. См. например выше про метод create класса alife_simulator. Отдельный объект класса вектор создаётся вызовом глобальной функции vector(). При создании имеет координаты [0,0,0].&lt;br /&gt;
&lt;br /&gt;
===Список методов класса vector===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
v:set_length(number) - оставить направление, изменить длину&lt;br /&gt;
v:normalize(); - сделать длину единичной&lt;br /&gt;
&lt;br /&gt;
v:magnitude() -- длина вектора v&lt;br /&gt;
v1:distance_to(v2) -- расстояние между v1 и v2&lt;br /&gt;
v1:distance_to_sqr(v2) -- квадрат расстояния между v1 и v2&lt;br /&gt;
v1:crossproduct(v2) -- векторное произведение. Возвращает вектор&lt;br /&gt;
v1:dotproduct(v2) -- скалярное произведение. Возвращает число&lt;br /&gt;
v:sub(number); -- вычесть из каждого компонента v число number&lt;br /&gt;
v1:sub(v2); -- вычесть почленно вектор v2 из v1 и поместить в v1&lt;br /&gt;
v1:sub(v2, v3) -- вычесть из v2 - v3 и поместить в v1&lt;br /&gt;
аналогично:&lt;br /&gt;
add - почленное сложение&lt;br /&gt;
mul - почленное умножение&lt;br /&gt;
div - почленное деление&lt;br /&gt;
max/min - почленный максимум/минимум&lt;br /&gt;
v1:clamp(v2) -- почленное обрезание первого вторым&lt;br /&gt;
average -- почленное среднее&lt;br /&gt;
invert -- почленная инверсия знака&lt;br /&gt;
&lt;br /&gt;
v1:abs(v2); -- копирует почленно положительные компоненты в v1 из v2&lt;br /&gt;
lerp(v1, v2, number) -- линейная интерполяция между двумя векторами&lt;br /&gt;
-- если number больше 1, то выходит за них - экстраполяция&lt;br /&gt;
&lt;br /&gt;
v1:reflect(v2, v3) - должно быть отражение одного вектора от плоскости, определяемой другим. Не проверял&lt;br /&gt;
v1:slide(v2, v3); - вероятно, проекция одного вектора на плоскость, определяемую другим. Не уверен&lt;br /&gt;
v1:distance_to_xz(v2) - учитывая, что плоскость XZ - это плоскость параллельная земле, то возможно это &lt;br /&gt;
                        длина проекции на землю пути от точки до точки. Не проверял&lt;br /&gt;
&lt;br /&gt;
v:getP() - зенитный угол в радианах (угол наклона над плоскостью XZ )&lt;br /&gt;
v:getH() - азимутальный угол в радианах (угол в плоскости XZ между проекцией вектора на эту плоскость и осью Z)&lt;br /&gt;
setHP - соответственно для установки этих значений&lt;br /&gt;
v1:align() - выравнивает вектор вдоль оси x или z и нормирует его. Значение по y игнорируется. &lt;br /&gt;
             В итоге всегда возвращается одно из четырёх значений ([1,0,0], [-1,0,0], [0,0,1], [0,0,-1])&lt;br /&gt;
v4:mad(v1,v2,v3) -- бешеная операция =) умножить почленно второе на третье и сложить с &lt;br /&gt;
                    первым, т.е. v4 = v1 + v2*v3 (название операции mad == mul + add)&lt;br /&gt;
v1:inertion(v2, number) -- v1 = v2 + (v1-v2)*number (тоже почленно)&lt;br /&gt;
v1:similar(v2, number) -- сравнение векторов на равенство с погрешностью number. Выдаёт 1 или 0&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local v1 = vector()&lt;br /&gt;
v1:set(1,2,3)&lt;br /&gt;
local v2 = vector():set(4,5,6)&lt;br /&gt;
local dist = v1:distance_to(v2)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class fcolor==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class fcolor {&lt;br /&gt;
    property a; --альфа-цвет, отвечающий за прозрачность.&lt;br /&gt;
    property b; --blue-цвет, отвечающий за синий оттенок цвета.&lt;br /&gt;
    property g; --green-цвет, отвечающий за зелёный оттенок цвета.&lt;br /&gt;
    property r; --red-цвет, отвечающий за красный оттенок цвет.&lt;br /&gt;
&lt;br /&gt;
    fcolor ();&lt;br /&gt;
&lt;br /&gt;
    function set(number, number, number, number); --установка цвета (r,g,b,a)&lt;br /&gt;
    function set(const fcolor&amp;amp;); --установка цвета по уже имеющемуся классу &amp;quot;fcolor()&amp;quot;&lt;br /&gt;
    function set(number); -- не знаю. предполагаю, что есть несколько заранее подготовленных цветов с индексами для каждого.&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
color = fcolor()&lt;br /&gt;
color.a = 50&lt;br /&gt;
color.g = 255&lt;br /&gt;
color.r = 100&lt;br /&gt;
color.b = 50&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
или&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
color = fcolor()&lt;br /&gt;
color:set(100,255,50,50)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class hit==&lt;br /&gt;
Бывают случаи, при которых необходимо нанести некоторый урон неписю или мобу, при этом имитировав попадание в него. Для этого существует метод класса game_object:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function hit(hit*);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Чтобы использовать этот метод, нужно указать аргументы. В данном случае имеет объект другого класса - hit. Вот его описание:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class hit {&lt;br /&gt;
    const burn = 0; --здесь идут константы типов урона, используемых в свойстве &amp;quot;type&amp;quot;. Все мы прекрасно знаем, что означает каждый.&lt;br /&gt;
    const chemical_burn = 6;&lt;br /&gt;
    const dummy = 11;&lt;br /&gt;
    const explosion = 7;&lt;br /&gt;
    const fire_wound = 8;&lt;br /&gt;
    const radiation = 4;&lt;br /&gt;
    const shock = 1;&lt;br /&gt;
    const strike = 2;&lt;br /&gt;
    const telepatic = 5;&lt;br /&gt;
    const wound = 3;&lt;br /&gt;
&lt;br /&gt;
    property direction; --дирекция урона&lt;br /&gt;
    property draftsman; --обозначает персонажа, нанёсшего урон.&lt;br /&gt;
    property impulse; --импульс урона&lt;br /&gt;
    property power; --сила урона&lt;br /&gt;
    property type; -- тип урона (см. константы)&lt;br /&gt;
&lt;br /&gt;
    hit ();&lt;br /&gt;
    hit (const hit*);&lt;br /&gt;
&lt;br /&gt;
    function bone(string); --метод с указанием кости урона&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
hit = hit() -- создание объекта класса hit&lt;br /&gt;
hit.direction = vector():set(1,0,0) --дирекция по оси x&lt;br /&gt;
hit.draftsman = db.actor --нанёс урон актор&lt;br /&gt;
hit.impulse = 600 --импульс&lt;br /&gt;
hit.power = 1.45 --хит&lt;br /&gt;
hit.type = 2 --тип урона - выстрел&lt;br /&gt;
hit:bone(&amp;quot;bip01_head&amp;quot;) -- удар приходится на голову&lt;br /&gt;
obj:hit(hit)&lt;br /&gt;
-- наносим урон&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==&amp;quot;Функции времени&amp;quot;==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
time_global() -- реальное время (в миллисекундах) с начала запуска программы&lt;br /&gt;
game.time() -- игровое время (в игровых миллисекундах) с начала игры (т.е. с начала прохождения игры)&lt;br /&gt;
level.get_time_days() -- день месяца по игровому времени&lt;br /&gt;
level.get_time_hours() -- час текущего игрового дня&lt;br /&gt;
level.get_time_minutes() -- минута текущего игрового часа&lt;br /&gt;
&lt;br /&gt;
level.get_time_factor() -- возвращает отношение скорости течения игрового времени к скорости реального &lt;br /&gt;
                        --(game_time_speed / real_time_speed)&lt;br /&gt;
level.set_time_factor(number) -- устанавливает это отношение&lt;br /&gt;
&lt;br /&gt;
game.get_game_time() -- возвращает игровое время в виде объекта класса CTime. Класс CTime я опишу подробно &lt;br /&gt;
                     -- как-нибудь потом, а пока опишу только пару его методов.&lt;br /&gt;
конструктор. Вызывается через пространство имён game&lt;br /&gt;
game.CTime()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Дефолтовые значения===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
year, month, day = 1 &lt;br /&gt;
hour, min, sek, ms = 0&lt;br /&gt;
CTime.set(year, month, day, hour, min, sek, ms) -- устанавливает все данные о времени&lt;br /&gt;
метод CTime.get описан так:&lt;br /&gt;
function get(number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;);&lt;br /&gt;
что наводит на мысль о семи аргументах. однако с точки зрения Lua этот метод не принимает аргументов, зато возвращает семь значений. &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
====Пример использования обоих методов:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local t = game.CTime() -- создания объекта с дефолтовыми значнеиями&lt;br /&gt;
t:set(2009, 7, 11, 8, 11, 22, 333) -- установили все значения&lt;br /&gt;
&lt;br /&gt;
local y,m,d,h,min,sec,ms = t:get() -- получили все значения&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
===Класс CTime (неразобранный)===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class CTime {&lt;br /&gt;
const DateToDay = 0;&lt;br /&gt;
const DateToMonth = 1;&lt;br /&gt;
const DateToYear = 2;&lt;br /&gt;
const TimeToHours = 0;&lt;br /&gt;
const TimeToMilisecs = 3;&lt;br /&gt;
const TimeToMinutes = 1;&lt;br /&gt;
const TimeToSeconds = 2;&lt;br /&gt;
&lt;br /&gt;
CTime ();&lt;br /&gt;
CTime (const CTime&amp;amp;);&lt;br /&gt;
&lt;br /&gt;
function sub(CTime*);&lt;br /&gt;
function timeToString(number);&lt;br /&gt;
function dateToString(number);&lt;br /&gt;
operator ==(const CTime&amp;amp;, CTime);&lt;br /&gt;
function get(number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;);&lt;br /&gt;
function set(number, number, number, number, number, number, number);&lt;br /&gt;
function setHMSms(number, number, number, number);&lt;br /&gt;
function diffSec(CTime*);&lt;br /&gt;
operator &amp;lt;(const CTime&amp;amp;, CTime);&lt;br /&gt;
operator +(CTime&amp;amp;, CTime);&lt;br /&gt;
operator &amp;gt;=(const CTime&amp;amp;, CTime);&lt;br /&gt;
function setHMS(number, number, number);&lt;br /&gt;
operator &amp;gt;(const CTime&amp;amp;, CTime);&lt;br /&gt;
operator -(CTime&amp;amp;, CTime);&lt;br /&gt;
operator &amp;lt;=(const CTime&amp;amp;, CTime);&lt;br /&gt;
function add(CTime*);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==класс CUIScriptWnd==&lt;br /&gt;
CUIScriptWnd(); --для работы с окном...&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    function _construct();&lt;br /&gt;
    function Register(CUIWindow*);&lt;br /&gt;
    function Register(CUIWindow*, string);&lt;br /&gt;
    function Enable(boolean);        --вкл/выкл&lt;br /&gt;
    function SetHeight(number);  --установка высоты&lt;br /&gt;
    function GetFrameLineWnd(string);&lt;br /&gt;
    function SetHolder(CDialogHolder*);&lt;br /&gt;
    function GetWidth() const;  --получение ширины контрола&lt;br /&gt;
    function GetCheckButton(string);--Получение состояния checkBox ,на выходе true или false?&lt;br /&gt;
    function DetachChild(CUIWindow*);&lt;br /&gt;
    function SetPPMode();&lt;br /&gt;
    function SetFont(CGameFont*);  --установка шрифта по имени&lt;br /&gt;
    function IsShown();                --проверка видно ли контрол иль нет?&lt;br /&gt;
    function Show(boolean);            --показывать контолили нет?&lt;br /&gt;
    function GetHeight() const;        --возвращает высоту&lt;br /&gt;
    function SetWidth(number);        --устанавливает ширину&lt;br /&gt;
    function GetListWndEx(string);&lt;br /&gt;
    function IsEnabled();&lt;br /&gt;
    function ResetPPMode();&lt;br /&gt;
    function GetPropertiesBox(string);&lt;br /&gt;
    function GetFont();                --возвращает шрифт установленный setFont?&lt;br /&gt;
    function Update();&lt;br /&gt;
    function AddCallback(string, number, const function&amp;lt;void&amp;gt;&amp;amp;); --соответские контрола с действие?&lt;br /&gt;
    function AddCallback(string, number, const function&amp;lt;void&amp;gt;&amp;amp;, object);--соответские контрола с действие?&lt;br /&gt;
    function GetButton(string);--Получаем последнюю нажатую кнопку?&lt;br /&gt;
    function SetAutoDelete(boolean);&lt;br /&gt;
    function OnKeyboard(number, enum EUIMessages);--Колбек нажатия на клавиатуре&lt;br /&gt;
    function Dispatch(number, number);&lt;br /&gt;
    function GetListWnd(string);--получение окна ListBoxa?&lt;br /&gt;
    function AttachChild(CUIWindow*);&lt;br /&gt;
    function GetStatic(string);--получение текста метки&lt;br /&gt;
    function SetWndPos(number, number);--установка позиции окна(x,y)&lt;br /&gt;
    function GetTabControl(string);&lt;br /&gt;
    function GetRadioButton(string);--состояние RadioButtton на выходите true или false&lt;br /&gt;
    function Init(number, number, number, number);--инициализация окна...читай FormInitializatione (x,y,width,height)&lt;br /&gt;
    function Init(Frect*);--инициализация окна&lt;br /&gt;
    function GetFrameWindow(string);&lt;br /&gt;
    function WindowName();&lt;br /&gt;
    function GetDialogWnd(string);&lt;br /&gt;
    function GetHolder();&lt;br /&gt;
    function SetWndRect(Frect);--установка координат углов&lt;br /&gt;
    function SetWndRect(number, number, number, number);--установка координат углов&lt;br /&gt;
    function GetEditBox(string);--получение текста из ЭдитБокса&lt;br /&gt;
    function SetWindowName(string);--Устанавливаем имя форме(caption)&lt;br /&gt;
    function GetProgressBar(string);&lt;br /&gt;
    function GetMessageBox(string);&lt;br /&gt;
    function SetWndSize(number, number);&lt;br /&gt;
    function Load(string);&lt;br /&gt;
    function IsAutoDelete();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
Статья создана: [[Участник:malandrinus|malandrinus]], [[Участник:IQDDD|IQDDD]], [[Участник:меченый|меченый]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>95.25.99.189</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC</id>
		<title>Справочник по функциям и классам</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC"/>
				<updated>2009-07-11T22:36:06Z</updated>
		
		<summary type="html">&lt;p&gt;95.25.99.189: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Посты с форума AMK&lt;br /&gt;
&lt;br /&gt;
==Структура Lua_help==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;C++ class [класс] {&lt;br /&gt;
     const [описание1] = [константа1];&lt;br /&gt;
     const [описание2] = [константа2];&lt;br /&gt;
     ...&lt;br /&gt;
     [константы заменяют описания при вызове методов классов];&lt;br /&gt;
     &lt;br /&gt;
     property [свойство1];&lt;br /&gt;
     property [свойство2];&lt;br /&gt;
     ...&lt;br /&gt;
[свойства (property) - это характеристика какого-либо класса, которая может подвергаться мат. операциям, слияниям, присвояниям и пр.&lt;br /&gt;
     читаются через точку: obj.health];&lt;br /&gt;
&lt;br /&gt;
     [глобальная(-ые) функция(-ии), которой вызывается класс];&lt;br /&gt;
     function [метод1] ([аргумент 1 функции 1], [аргумент 2 функции 1]...);&lt;br /&gt;
     function [метод2] ([аргумент 1 функции2]...);&lt;br /&gt;
             ...&lt;br /&gt;
     [методы - это специальные функции, выполняющие операции с классами и возвращающие значения после операций над классами.&lt;br /&gt;
     вызываются через двоеточие: obj:add_animation(...)];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Создание своего класса==&lt;br /&gt;
Свой класс можно добавить так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class &amp;quot;my_cool_class&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь &amp;quot;my_cool_class&amp;quot; - имя моего нового класса. Записывается в кавычках, т.е. это строка.&lt;br /&gt;
&lt;br /&gt;
Потом можно добавлять к этому классу свои методы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- это специальный метод - конструктор. Будет вызван при создании класса.&lt;br /&gt;
function my_cool_class:__init(num)&lt;br /&gt;
    self.my_param = num -- добавили в свой класс переменную&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- обычный метод&lt;br /&gt;
function my_cool_class:cool_method_of_my_class()&lt;br /&gt;
    get_console():execute(&amp;quot;lua_bind_in_action_&amp;quot;..self.my_param)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- деструктор, вызывается при сборке объекта сборщиком мусора. Аргументов не имеет (кроме скрытого self. об этом см. далее)&lt;br /&gt;
function my_cool_class:__finalize()&lt;br /&gt;
    get_console():execute(&amp;quot;good_by_&amp;quot;..self.my_param)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Потом можно создавать экземпляры своего класса, вызывать их методы и пр.:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local obj1 = my_cool_class(1) -- здесь создаётся новый объект. При этом вызывается конструктор и &lt;br /&gt;
                              -- ему передаются аргументы этого вызова (в данном случае число 1).&lt;br /&gt;
local obj2 = my_cool_class(4)&lt;br /&gt;
obj1:cool_method_of_my_class()&lt;br /&gt;
obj2:cool_method_of_my_class()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как только объект становится ненужным (т.е. на него больше нет ссылок) он удаляется сборщиком мусора. При этом вызывается его метод __finalize&lt;br /&gt;
&lt;br /&gt;
При чём здесь self.&lt;br /&gt;
self - это скрытый первый аргумент. Конструкция вида:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function class_name:fun_name(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
на самом деле эквивалентна конструкции &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function class_name.fun_name(self, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Обратите внимание на двоеточие в первом случае и точку во втором.&amp;lt;br&amp;gt;&lt;br /&gt;
При вызове метода конструкция вида:&lt;br /&gt;
&lt;br /&gt;
object_name:fun_name(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
эквивалентна конструкции&lt;br /&gt;
&lt;br /&gt;
object_name.fun_name(object_name, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Это означает, что в качестве self как правило передаётся сам же объект. &amp;quot;Как правило&amp;quot; - это потому, что можно в принципе передать что-то другое. Но лучше этого соглашения не нарушать.&lt;br /&gt;
&lt;br /&gt;
Всё это здорово, но какая от этого польза? Ну сделал я свой класс, и что с ним делать?&lt;br /&gt;
&lt;br /&gt;
В общем, классы - это неплохое средство организации своего кода. Владеющие объектно-ориентированным подходом найдут это расширение весьма удобным. В частности такие, ни к чему не привязанные классы, в скриптах сталкера используются в некоторых местах. Однако, настоящая сила этой технологии не в этом. С помощью этой технологии можно расширять классы, экспортированные в Lua со стороны движка игры. Об этом пойдет речь в следующей части.&lt;br /&gt;
&lt;br /&gt;
==Наследование от экспортированных классов==&lt;br /&gt;
Итак, кроме создания собственных классов технология Luabind позволяет создавать класы на основе уже существующих. Это реализовано в виде своеобразного наследования. Делается это с помощью следующей конструкции:&lt;br /&gt;
&lt;br /&gt;
'''class &amp;quot;my_derived_class&amp;quot; (base_class)'''&lt;br /&gt;
&lt;br /&gt;
Здесь:&lt;br /&gt;
&amp;quot;my_derived_class&amp;quot; как и раньше - это имя нового класса.&amp;lt;br&amp;gt;&lt;br /&gt;
base_class - это уже существующий класс, который будет базовым для вновь созданного. Имя выбрано произвольно, но подразумевается, что такой класс экспортирован и предназначен для наследования.&amp;lt;br&amp;gt;&lt;br /&gt;
Далеко не любой класс из экспортированных со стороны хост-приложения можно использовать в качестве базового. На стороне хост-приложения должен быть создан специальный класс-обёртка. Если его нет, то ничего хорошего не выйдет. Скорее всего при попытке использовать унаследованный класс в Lua будут малопонятные проблемы и вылеты, так что надо знать совершенно точно, можно ли от конкретного класса наследовать.&amp;lt;br&amp;gt;&lt;br /&gt;
Вопрос, какой глубины может быть наследование, т.е. можно ли наследовать от производного класса, мне пока до конца не ясен. С другой стороны, в этом практически нет необходимости.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итак после выполнения указанной конструкции появляется класс my_derived_class, который является копией класса base_class. У него есть в точности те же методы, что и у его базового класса. Пока от этого мало толку. Но теперь можно переопределить методы нашего класса, изменив таким образом его поведение. Делается это так же, как и ранее, но с некоторыми дополнениями.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- конструктор&lt;br /&gt;
function my_derived_class:__init(num) super(num)&lt;br /&gt;
end&lt;br /&gt;
-- обычный метод&lt;br /&gt;
function my_cool_class:some_method(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
    base_class.some_method(self, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
-- деструктор&lt;br /&gt;
function my_cool_class:__finalize()&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На что стОит обратить внимание.&amp;lt;br&amp;gt;&lt;br /&gt;
Во-первых, конструкция super(num). Это вызов конструктора базового класса.&amp;lt;br&amp;gt;&lt;br /&gt;
Во-вторых, для вызова метода базового класса из метода унаследованного используется другая конструкция base_class.some_method(self, ). Здесь надо использовать альтернативную форму вызова метода (с точкой и явным указанием первого аргумента self).&amp;lt;br&amp;gt;&lt;br /&gt;
Наконец, метод __finalize() не требует вызова этого же метода для базового класса, поскольку тот будет вызван автоматически при удалении объекта сборщиком мусора.&lt;br /&gt;
&lt;br /&gt;
Собственно и всё. Теперь можно пользоваться созданным классом: создавать объекты этого класса, вызывать их методы и пр. Здесь уже всё зависит от конкретных целей и требует знания конкретных классов.&lt;br /&gt;
&lt;br /&gt;
==сlass alife_simulator==&lt;br /&gt;
alife_simulator - класс для управления серверными объектами. В игре существует всего один экземпляр такого класса, и получить его можно с помощью вызова глобальной функции alife().&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
level_name(level_id) -- возвращает имя уровня по его id&lt;br /&gt;
create_ammo(&amp;lt;имя секции патронов&amp;gt;, position, lvid, gvid, id, amount) - создание пачек с патронами&lt;br /&gt;
create(&amp;lt;имя секции объекта&amp;gt;, position, lvid, gvid, id) -- создание объектов в инвентаре&lt;br /&gt;
create(&amp;lt;имя секции объекта&amp;gt;, position, lvid, gvid) -- создание объектов на уровне&lt;br /&gt;
во всех функция создания объектов&lt;br /&gt;
position - объект класса vector. Не может быть nil, иначе вылет&lt;br /&gt;
lvid - level vertex id&lt;br /&gt;
gvid - game vertex id&lt;br /&gt;
id - это куда спавним. Если в инвентарь, то указываем id непися или ноль (для актора)&lt;br /&gt;
release(sobj, boolean) -- удаляет объект sobj. Зачем второй булевский аргумент - не известно. &lt;br /&gt;
                          Во всех примерах он либо отсутствует, либо установлен в true&lt;br /&gt;
object(id) -- возвращает серверный объект по его id. Если не нашёл nil&lt;br /&gt;
story_object(sid) -- возвращает серверный объект по его story id. Если не нашёл nil&lt;br /&gt;
actor() -- возвращает серверный объект актора&lt;br /&gt;
set_switch_online(id, boolean) -- переводит в онлайн объект с идентификатором id&lt;br /&gt;
set_switch_offline(id, boolean) -- то же , но в онлайн&lt;br /&gt;
dont_has_info(const number&amp;amp;, string); -- проверка на Неполученный инфопоршень(db.actor:dont_has_info(&amp;quot;infoportion&amp;quot;) &lt;br /&gt;
                                      -- или alife():actor():dont_has_info(&amp;quot;infoportion&amp;quot;)).&lt;br /&gt;
has_info - противоположная&lt;br /&gt;
&lt;br /&gt;
предположительно:&lt;br /&gt;
switch_distance() -- радиус переключения в оффлайн?&lt;br /&gt;
switch_distance(number) -- установка этого радиуса?&lt;br /&gt;
level_id() -- текущий номер уровня ?&lt;br /&gt;
object(string) -- получение объекта оп его имени. Не помню точно, что за имя.&lt;br /&gt;
object(number, boolean) - то же, что и object(number)? на что влияет второй аргумент?&lt;br /&gt;
valid_object_id(number) -- проверка наличия объекта по id?&lt;br /&gt;
alife():create( &amp;lt;индекс объекта в all.spawn&amp;gt; ) -- &lt;br /&gt;
spawn_id(number) -- индекс объекта в all.spawn для объекта с заданным id ?&lt;br /&gt;
&lt;br /&gt;
неизвестно:&lt;br /&gt;
add_out_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
set_interactive(number, boolean);&lt;br /&gt;
add_in_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
function remove_in_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
remove_out_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
kill_entity(cse_alife_monster_abstract*, const number&amp;amp;, cse_alife_schedulable*);&lt;br /&gt;
kill_entity(alife_simulator*, cse_alife_monster_abstract*, const number&amp;amp;);&lt;br /&gt;
kill_entity(alife_simulator*, cse_alife_monster_abstract*);&lt;br /&gt;
has_info(const number&amp;amp;, string);&lt;br /&gt;
remove_all_restrictions(number, const enum RestrictionSpace::ERestrictorTypes&amp;amp;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local sim = alife() -- получаем сам объект класса alife_simulator&lt;br /&gt;
local sactor = sim:actor() -- получаем серверный объект для актора&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class vector==&lt;br /&gt;
vector - вспомогательный класс, содержащий три координаты, и позволяющий выполнять с ними различные манипуляции. Объекты класса vector являются аргументами многих функций и возвращаются многими функциями. См. например выше про метод create класса alife_simulator. Отдельный объект класса вектор создаётся вызовом глобальной функции vector(). При создании имеет координаты [0,0,0].&lt;br /&gt;
&lt;br /&gt;
===Список методов класса vector===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
v:set_length(number) - оставить направление, изменить длину&lt;br /&gt;
v:normalize(); - сделать длину единичной&lt;br /&gt;
&lt;br /&gt;
v:magnitude() -- длина вектора v&lt;br /&gt;
v1:distance_to(v2) -- расстояние между v1 и v2&lt;br /&gt;
v1:distance_to_sqr(v2) -- квадрат расстояния между v1 и v2&lt;br /&gt;
v1:crossproduct(v2) -- векторное произведение. Возвращает вектор&lt;br /&gt;
v1:dotproduct(v2) -- скалярное произведение. Возвращает число&lt;br /&gt;
v:sub(number); -- вычесть из каждого компонента v число number&lt;br /&gt;
v1:sub(v2); -- вычесть почленно вектор v2 из v1 и поместить в v1&lt;br /&gt;
v1:sub(v2, v3) -- вычесть из v2 - v3 и поместить в v1&lt;br /&gt;
аналогично:&lt;br /&gt;
add - почленное сложение&lt;br /&gt;
mul - почленное умножение&lt;br /&gt;
div - почленное деление&lt;br /&gt;
max/min - почленный максимум/минимум&lt;br /&gt;
v1:clamp(v2) -- почленное обрезание первого вторым&lt;br /&gt;
average -- почленное среднее&lt;br /&gt;
invert -- почленная инверсия знака&lt;br /&gt;
&lt;br /&gt;
v1:abs(v2); -- копирует почленно положительные компоненты в v1 из v2&lt;br /&gt;
lerp(v1, v2, number) -- линейная интерполяция между двумя векторами&lt;br /&gt;
-- если number больше 1, то выходит за них - экстраполяция&lt;br /&gt;
&lt;br /&gt;
v1:reflect(v2, v3) - должно быть отражение одного вектора от плоскости, определяемой другим. Не проверял&lt;br /&gt;
v1:slide(v2, v3); - вероятно, проекция одного вектора на плоскость, определяемую другим. Не уверен&lt;br /&gt;
v1:distance_to_xz(v2) - учитывая, что плоскость XZ - это плоскость параллельная земле, то возможно это &lt;br /&gt;
                        длина проекции на землю пути от точки до точки. Не проверял&lt;br /&gt;
&lt;br /&gt;
v:getP() - зенитный угол в радианах (угол наклона над плоскостью XZ )&lt;br /&gt;
v:getH() - азимутальный угол в радианах (угол в плоскости XZ между проекцией вектора на эту плоскость и осью Z)&lt;br /&gt;
setHP - соответственно для установки этих значений&lt;br /&gt;
v1:align() - выравнивает вектор вдоль оси x или z и нормирует его. Значение по y игнорируется. &lt;br /&gt;
             В итоге всегда возвращается одно из четырёх значений ([1,0,0], [-1,0,0], [0,0,1], [0,0,-1])&lt;br /&gt;
v4:mad(v1,v2,v3) -- бешеная операция =) умножить почленно второе на третье и сложить с &lt;br /&gt;
                    первым, т.е. v4 = v1 + v2*v3 (название операции mad == mul + add)&lt;br /&gt;
v1:inertion(v2, number) -- v1 = v2 + (v1-v2)*number (тоже почленно)&lt;br /&gt;
v1:similar(v2, number) -- сравнение векторов на равенство с погрешностью number. Выдаёт 1 или 0&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local v1 = vector()&lt;br /&gt;
v1:set(1,2,3)&lt;br /&gt;
local v2 = vector():set(4,5,6)&lt;br /&gt;
local dist = v1:distance_to(v2)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class fcolor==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class fcolor {&lt;br /&gt;
    property a; --альфа-цвет, отвечающий за прозрачность.&lt;br /&gt;
    property b; --blue-цвет, отвечающий за синий оттенок цвета.&lt;br /&gt;
    property g; --green-цвет, отвечающий за зелёный оттенок цвета.&lt;br /&gt;
    property r; --red-цвет, отвечающий за красный оттенок цвет.&lt;br /&gt;
&lt;br /&gt;
    fcolor ();&lt;br /&gt;
&lt;br /&gt;
    function set(number, number, number, number); --установка цвета (r,g,b,a)&lt;br /&gt;
    function set(const fcolor&amp;amp;); --установка цвета по уже имеющемуся классу &amp;quot;fcolor()&amp;quot;&lt;br /&gt;
    function set(number); -- не знаю. предполагаю, что есть несколько заранее подготовленных цветов с индексами для каждого.&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
color = fcolor()&lt;br /&gt;
color.a = 50&lt;br /&gt;
color.g = 255&lt;br /&gt;
color.r = 100&lt;br /&gt;
color.b = 50&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
или&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
color = fcolor()&lt;br /&gt;
color:set(100,255,50,50)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class hit==&lt;br /&gt;
Бывают случаи, при которых необходимо нанести некоторый урон неписю или мобу, при этом имитировав попадание в него. Для этого существует метод класса game_object:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function hit(hit*);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Чтобы использовать этот метод, нужно указать аргументы. В данном случае имеет объект другого класса - hit. Вот его описание:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class hit {&lt;br /&gt;
    const burn = 0; --здесь идут константы типов урона, используемых в свойстве &amp;quot;type&amp;quot;. Все мы прекрасно знаем, что означает каждый.&lt;br /&gt;
    const chemical_burn = 6;&lt;br /&gt;
    const dummy = 11;&lt;br /&gt;
    const explosion = 7;&lt;br /&gt;
    const fire_wound = 8;&lt;br /&gt;
    const radiation = 4;&lt;br /&gt;
    const shock = 1;&lt;br /&gt;
    const strike = 2;&lt;br /&gt;
    const telepatic = 5;&lt;br /&gt;
    const wound = 3;&lt;br /&gt;
&lt;br /&gt;
    property direction; --дирекция урона&lt;br /&gt;
    property draftsman; --обозначает персонажа, нанёсшего урон.&lt;br /&gt;
    property impulse; --импульс урона&lt;br /&gt;
    property power; --сила урона&lt;br /&gt;
    property type; -- тип урона (см. константы)&lt;br /&gt;
&lt;br /&gt;
    hit ();&lt;br /&gt;
    hit (const hit*);&lt;br /&gt;
&lt;br /&gt;
    function bone(string); --метод с указанием кости урона&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
hit = hit() -- создание объекта класса hit&lt;br /&gt;
hit.direction = vector():set(1,0,0) --дирекция по оси x&lt;br /&gt;
hit.draftsman = db.actor --нанёс урон актор&lt;br /&gt;
hit.impulse = 600 --импульс&lt;br /&gt;
hit.power = 1.45 --хит&lt;br /&gt;
hit.type = 2 --тип урона - выстрел&lt;br /&gt;
hit:bone(&amp;quot;bip01_head&amp;quot;) -- удар приходится на голову&lt;br /&gt;
obj:hit(hit)&lt;br /&gt;
-- наносим урон&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==&amp;quot;Функции времени&amp;quot;==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
time_global() -- реальное время (в миллисекундах) с начала запуска программы&lt;br /&gt;
game.time() -- игровое время (в игровых миллисекундах) с начала игры (т.е. с начала прохождения игры)&lt;br /&gt;
level.get_time_days() -- день месяца по игровому времени&lt;br /&gt;
level.get_time_hours() -- час текущего игрового дня&lt;br /&gt;
level.get_time_minutes() -- минута текущего игрового часа&lt;br /&gt;
&lt;br /&gt;
level.get_time_factor() -- возвращает отношение скорости течения игрового времени к скорости реального &lt;br /&gt;
                        --(game_time_speed / real_time_speed)&lt;br /&gt;
level.set_time_factor(number) -- устанавливает это отношение&lt;br /&gt;
&lt;br /&gt;
game.get_game_time() -- возвращает игровое время в виде объекта класса CTime. Класс CTime я опишу подробно &lt;br /&gt;
                     -- как-нибудь потом, а пока опишу только пару его методов.&lt;br /&gt;
конструктор. Вызывается через пространство имён game&lt;br /&gt;
game.CTime()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Дефолтовые значения===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
year, month, day = 1 &lt;br /&gt;
hour, min, sek, ms = 0&lt;br /&gt;
CTime.set(year, month, day, hour, min, sek, ms) -- устанавливает все данные о времени&lt;br /&gt;
метод CTime.get описан так:&lt;br /&gt;
function get(number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;);&lt;br /&gt;
что наводит на мысль о семи аргументах. однако с точки зрения Lua этот метод не принимает аргументов, зато возвращает семь значений. &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
====Пример использования обоих методов:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local t = game.CTime() -- создания объекта с дефолтовыми значнеиями&lt;br /&gt;
t:set(2009, 7, 11, 8, 11, 22, 333) -- установили все значения&lt;br /&gt;
&lt;br /&gt;
local y,m,d,h,min,sec,ms = t:get() -- получили все значения&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
===Класс CTime (неразобранный)===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class CTime {&lt;br /&gt;
const DateToDay = 0;&lt;br /&gt;
const DateToMonth = 1;&lt;br /&gt;
const DateToYear = 2;&lt;br /&gt;
const TimeToHours = 0;&lt;br /&gt;
const TimeToMilisecs = 3;&lt;br /&gt;
const TimeToMinutes = 1;&lt;br /&gt;
const TimeToSeconds = 2;&lt;br /&gt;
&lt;br /&gt;
CTime ();&lt;br /&gt;
CTime (const CTime&amp;amp;);&lt;br /&gt;
&lt;br /&gt;
function sub(CTime*);&lt;br /&gt;
function timeToString(number);&lt;br /&gt;
function dateToString(number);&lt;br /&gt;
operator ==(const CTime&amp;amp;, CTime);&lt;br /&gt;
function get(number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;);&lt;br /&gt;
function set(number, number, number, number, number, number, number);&lt;br /&gt;
function setHMSms(number, number, number, number);&lt;br /&gt;
function diffSec(CTime*);&lt;br /&gt;
operator &amp;lt;(const CTime&amp;amp;, CTime);&lt;br /&gt;
operator +(CTime&amp;amp;, CTime);&lt;br /&gt;
operator &amp;gt;=(const CTime&amp;amp;, CTime);&lt;br /&gt;
function setHMS(number, number, number);&lt;br /&gt;
operator &amp;gt;(const CTime&amp;amp;, CTime);&lt;br /&gt;
operator -(CTime&amp;amp;, CTime);&lt;br /&gt;
operator &amp;lt;=(const CTime&amp;amp;, CTime);&lt;br /&gt;
function add(CTime*);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
Статья создана: [[Участник:malandrinus|malandrinus]], [[Участник:IQDDD|IQDDD]], [[Участник:меченый|меченый]]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Скрипты]]&lt;/div&gt;</summary>
		<author><name>95.25.99.189</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC</id>
		<title>Справочник по функциям и классам</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC"/>
				<updated>2009-07-11T22:33:52Z</updated>
		
		<summary type="html">&lt;p&gt;95.25.99.189: /* Например */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Посты с форума AMK&lt;br /&gt;
&lt;br /&gt;
==Структура Lua_help==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;C++ class [класс] {&lt;br /&gt;
     const [описание1] = [константа1];&lt;br /&gt;
     const [описание2] = [константа2];&lt;br /&gt;
     ...&lt;br /&gt;
     [константы заменяют описания при вызове методов классов];&lt;br /&gt;
     &lt;br /&gt;
     property [свойство1];&lt;br /&gt;
     property [свойство2];&lt;br /&gt;
     ...&lt;br /&gt;
[свойства (property) - это характеристика какого-либо класса, которая может подвергаться мат. операциям, слияниям, присвояниям и пр.&lt;br /&gt;
     читаются через точку: obj.health];&lt;br /&gt;
&lt;br /&gt;
     [глобальная(-ые) функция(-ии), которой вызывается класс];&lt;br /&gt;
     function [метод1] ([аргумент 1 функции 1], [аргумент 2 функции 1]...);&lt;br /&gt;
     function [метод2] ([аргумент 1 функции2]...);&lt;br /&gt;
             ...&lt;br /&gt;
     [методы - это специальные функции, выполняющие операции с классами и возвращающие значения после операций над классами.&lt;br /&gt;
     вызываются через двоеточие: obj:add_animation(...)];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Создание своего класса==&lt;br /&gt;
Свой класс можно добавить так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class &amp;quot;my_cool_class&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь &amp;quot;my_cool_class&amp;quot; - имя моего нового класса. Записывается в кавычках, т.е. это строка.&lt;br /&gt;
&lt;br /&gt;
Потом можно добавлять к этому классу свои методы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- это специальный метод - конструктор. Будет вызван при создании класса.&lt;br /&gt;
function my_cool_class:__init(num)&lt;br /&gt;
    self.my_param = num -- добавили в свой класс переменную&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- обычный метод&lt;br /&gt;
function my_cool_class:cool_method_of_my_class()&lt;br /&gt;
    get_console():execute(&amp;quot;lua_bind_in_action_&amp;quot;..self.my_param)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- деструктор, вызывается при сборке объекта сборщиком мусора. Аргументов не имеет (кроме скрытого self. об этом см. далее)&lt;br /&gt;
function my_cool_class:__finalize()&lt;br /&gt;
    get_console():execute(&amp;quot;good_by_&amp;quot;..self.my_param)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Потом можно создавать экземпляры своего класса, вызывать их методы и пр.:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local obj1 = my_cool_class(1) -- здесь создаётся новый объект. При этом вызывается конструктор и &lt;br /&gt;
                              -- ему передаются аргументы этого вызова (в данном случае число 1).&lt;br /&gt;
local obj2 = my_cool_class(4)&lt;br /&gt;
obj1:cool_method_of_my_class()&lt;br /&gt;
obj2:cool_method_of_my_class()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как только объект становится ненужным (т.е. на него больше нет ссылок) он удаляется сборщиком мусора. При этом вызывается его метод __finalize&lt;br /&gt;
&lt;br /&gt;
При чём здесь self.&lt;br /&gt;
self - это скрытый первый аргумент. Конструкция вида:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function class_name:fun_name(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
на самом деле эквивалентна конструкции &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function class_name.fun_name(self, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Обратите внимание на двоеточие в первом случае и точку во втором.&amp;lt;br&amp;gt;&lt;br /&gt;
При вызове метода конструкция вида:&lt;br /&gt;
&lt;br /&gt;
object_name:fun_name(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
эквивалентна конструкции&lt;br /&gt;
&lt;br /&gt;
object_name.fun_name(object_name, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Это означает, что в качестве self как правило передаётся сам же объект. &amp;quot;Как правило&amp;quot; - это потому, что можно в принципе передать что-то другое. Но лучше этого соглашения не нарушать.&lt;br /&gt;
&lt;br /&gt;
Всё это здорово, но какая от этого польза? Ну сделал я свой класс, и что с ним делать?&lt;br /&gt;
&lt;br /&gt;
В общем, классы - это неплохое средство организации своего кода. Владеющие объектно-ориентированным подходом найдут это расширение весьма удобным. В частности такие, ни к чему не привязанные классы, в скриптах сталкера используются в некоторых местах. Однако, настоящая сила этой технологии не в этом. С помощью этой технологии можно расширять классы, экспортированные в Lua со стороны движка игры. Об этом пойдет речь в следующей части.&lt;br /&gt;
&lt;br /&gt;
==Наследование от экспортированных классов==&lt;br /&gt;
Итак, кроме создания собственных классов технология Luabind позволяет создавать класы на основе уже существующих. Это реализовано в виде своеобразного наследования. Делается это с помощью следующей конструкции:&lt;br /&gt;
&lt;br /&gt;
'''class &amp;quot;my_derived_class&amp;quot; (base_class)'''&lt;br /&gt;
&lt;br /&gt;
Здесь:&lt;br /&gt;
&amp;quot;my_derived_class&amp;quot; как и раньше - это имя нового класса.&amp;lt;br&amp;gt;&lt;br /&gt;
base_class - это уже существующий класс, который будет базовым для вновь созданного. Имя выбрано произвольно, но подразумевается, что такой класс экспортирован и предназначен для наследования.&amp;lt;br&amp;gt;&lt;br /&gt;
Далеко не любой класс из экспортированных со стороны хост-приложения можно использовать в качестве базового. На стороне хост-приложения должен быть создан специальный класс-обёртка. Если его нет, то ничего хорошего не выйдет. Скорее всего при попытке использовать унаследованный класс в Lua будут малопонятные проблемы и вылеты, так что надо знать совершенно точно, можно ли от конкретного класса наследовать.&amp;lt;br&amp;gt;&lt;br /&gt;
Вопрос, какой глубины может быть наследование, т.е. можно ли наследовать от производного класса, мне пока до конца не ясен. С другой стороны, в этом практически нет необходимости.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итак после выполнения указанной конструкции появляется класс my_derived_class, который является копией класса base_class. У него есть в точности те же методы, что и у его базового класса. Пока от этого мало толку. Но теперь можно переопределить методы нашего класса, изменив таким образом его поведение. Делается это так же, как и ранее, но с некоторыми дополнениями.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- конструктор&lt;br /&gt;
function my_derived_class:__init(num) super(num)&lt;br /&gt;
end&lt;br /&gt;
-- обычный метод&lt;br /&gt;
function my_cool_class:some_method(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
    base_class.some_method(self, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
-- деструктор&lt;br /&gt;
function my_cool_class:__finalize()&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На что стОит обратить внимание.&amp;lt;br&amp;gt;&lt;br /&gt;
Во-первых, конструкция super(num). Это вызов конструктора базового класса.&amp;lt;br&amp;gt;&lt;br /&gt;
Во-вторых, для вызова метода базового класса из метода унаследованного используется другая конструкция base_class.some_method(self, ). Здесь надо использовать альтернативную форму вызова метода (с точкой и явным указанием первого аргумента self).&amp;lt;br&amp;gt;&lt;br /&gt;
Наконец, метод __finalize() не требует вызова этого же метода для базового класса, поскольку тот будет вызван автоматически при удалении объекта сборщиком мусора.&lt;br /&gt;
&lt;br /&gt;
Собственно и всё. Теперь можно пользоваться созданным классом: создавать объекты этого класса, вызывать их методы и пр. Здесь уже всё зависит от конкретных целей и требует знания конкретных классов.&lt;br /&gt;
&lt;br /&gt;
==сlass alife_simulator==&lt;br /&gt;
alife_simulator - класс для управления серверными объектами. В игре существует всего один экземпляр такого класса, и получить его можно с помощью вызова глобальной функции alife().&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
level_name(level_id) -- возвращает имя уровня по его id&lt;br /&gt;
create_ammo(&amp;lt;имя секции патронов&amp;gt;, position, lvid, gvid, id, amount) - создание пачек с патронами&lt;br /&gt;
create(&amp;lt;имя секции объекта&amp;gt;, position, lvid, gvid, id) -- создание объектов в инвентаре&lt;br /&gt;
create(&amp;lt;имя секции объекта&amp;gt;, position, lvid, gvid) -- создание объектов на уровне&lt;br /&gt;
во всех функция создания объектов&lt;br /&gt;
position - объект класса vector. Не может быть nil, иначе вылет&lt;br /&gt;
lvid - level vertex id&lt;br /&gt;
gvid - game vertex id&lt;br /&gt;
id - это куда спавним. Если в инвентарь, то указываем id непися или ноль (для актора)&lt;br /&gt;
release(sobj, boolean) -- удаляет объект sobj. Зачем второй булевский аргумент - не известно. &lt;br /&gt;
                          Во всех примерах он либо отсутствует, либо установлен в true&lt;br /&gt;
object(id) -- возвращает серверный объект по его id. Если не нашёл nil&lt;br /&gt;
story_object(sid) -- возвращает серверный объект по его story id. Если не нашёл nil&lt;br /&gt;
actor() -- возвращает серверный объект актора&lt;br /&gt;
set_switch_online(id, boolean) -- переводит в онлайн объект с идентификатором id&lt;br /&gt;
set_switch_offline(id, boolean) -- то же , но в онлайн&lt;br /&gt;
dont_has_info(const number&amp;amp;, string); -- проверка на Неполученный инфопоршень(db.actor:dont_has_info(&amp;quot;infoportion&amp;quot;) &lt;br /&gt;
                                      -- или alife():actor():dont_has_info(&amp;quot;infoportion&amp;quot;)).&lt;br /&gt;
has_info - противоположная&lt;br /&gt;
&lt;br /&gt;
предположительно:&lt;br /&gt;
switch_distance() -- радиус переключения в оффлайн?&lt;br /&gt;
switch_distance(number) -- установка этого радиуса?&lt;br /&gt;
level_id() -- текущий номер уровня ?&lt;br /&gt;
object(string) -- получение объекта оп его имени. Не помню точно, что за имя.&lt;br /&gt;
object(number, boolean) - то же, что и object(number)? на что влияет второй аргумент?&lt;br /&gt;
valid_object_id(number) -- проверка наличия объекта по id?&lt;br /&gt;
alife():create( &amp;lt;индекс объекта в all.spawn&amp;gt; ) -- &lt;br /&gt;
spawn_id(number) -- индекс объекта в all.spawn для объекта с заданным id ?&lt;br /&gt;
&lt;br /&gt;
неизвестно:&lt;br /&gt;
add_out_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
set_interactive(number, boolean);&lt;br /&gt;
add_in_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
function remove_in_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
remove_out_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
kill_entity(cse_alife_monster_abstract*, const number&amp;amp;, cse_alife_schedulable*);&lt;br /&gt;
kill_entity(alife_simulator*, cse_alife_monster_abstract*, const number&amp;amp;);&lt;br /&gt;
kill_entity(alife_simulator*, cse_alife_monster_abstract*);&lt;br /&gt;
has_info(const number&amp;amp;, string);&lt;br /&gt;
remove_all_restrictions(number, const enum RestrictionSpace::ERestrictorTypes&amp;amp;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local sim = alife() -- получаем сам объект класса alife_simulator&lt;br /&gt;
local sactor = sim:actor() -- получаем серверный объект для актора&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class vector==&lt;br /&gt;
vector - вспомогательный класс, содержащий три координаты, и позволяющий выполнять с ними различные манипуляции. Объекты класса vector являются аргументами многих функций и возвращаются многими функциями. См. например выше про метод create класса alife_simulator. Отдельный объект класса вектор создаётся вызовом глобальной функции vector(). При создании имеет координаты [0,0,0].&lt;br /&gt;
&lt;br /&gt;
===Список методов класса vector===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
v:set_length(number) - оставить направление, изменить длину&lt;br /&gt;
v:normalize(); - сделать длину единичной&lt;br /&gt;
&lt;br /&gt;
v:magnitude() -- длина вектора v&lt;br /&gt;
v1:distance_to(v2) -- расстояние между v1 и v2&lt;br /&gt;
v1:distance_to_sqr(v2) -- квадрат расстояния между v1 и v2&lt;br /&gt;
v1:crossproduct(v2) -- векторное произведение. Возвращает вектор&lt;br /&gt;
v1:dotproduct(v2) -- скалярное произведение. Возвращает число&lt;br /&gt;
v:sub(number); -- вычесть из каждого компонента v число number&lt;br /&gt;
v1:sub(v2); -- вычесть почленно вектор v2 из v1 и поместить в v1&lt;br /&gt;
v1:sub(v2, v3) -- вычесть из v2 - v3 и поместить в v1&lt;br /&gt;
аналогично:&lt;br /&gt;
add - почленное сложение&lt;br /&gt;
mul - почленное умножение&lt;br /&gt;
div - почленное деление&lt;br /&gt;
max/min - почленный максимум/минимум&lt;br /&gt;
v1:clamp(v2) -- почленное обрезание первого вторым&lt;br /&gt;
average -- почленное среднее&lt;br /&gt;
invert -- почленная инверсия знака&lt;br /&gt;
&lt;br /&gt;
v1:abs(v2); -- копирует почленно положительные компоненты в v1 из v2&lt;br /&gt;
lerp(v1, v2, number) -- линейная интерполяция между двумя векторами&lt;br /&gt;
-- если number больше 1, то выходит за них - экстраполяция&lt;br /&gt;
&lt;br /&gt;
v1:reflect(v2, v3) - должно быть отражение одного вектора от плоскости, определяемой другим. Не проверял&lt;br /&gt;
v1:slide(v2, v3); - вероятно, проекция одного вектора на плоскость, определяемую другим. Не уверен&lt;br /&gt;
v1:distance_to_xz(v2) - учитывая, что плоскость XZ - это плоскость параллельная земле, то возможно это &lt;br /&gt;
                        длина проекции на землю пути от точки до точки. Не проверял&lt;br /&gt;
&lt;br /&gt;
v:getP() - зенитный угол в радианах (угол наклона над плоскостью XZ )&lt;br /&gt;
v:getH() - азимутальный угол в радианах (угол в плоскости XZ между проекцией вектора на эту плоскость и осью Z)&lt;br /&gt;
setHP - соответственно для установки этих значений&lt;br /&gt;
v1:align() - выравнивает вектор вдоль оси x или z и нормирует его. Значение по y игнорируется. &lt;br /&gt;
             В итоге всегда возвращается одно из четырёх значений ([1,0,0], [-1,0,0], [0,0,1], [0,0,-1])&lt;br /&gt;
v4:mad(v1,v2,v3) -- бешеная операция =) умножить почленно второе на третье и сложить с &lt;br /&gt;
                    первым, т.е. v4 = v1 + v2*v3 (название операции mad == mul + add)&lt;br /&gt;
v1:inertion(v2, number) -- v1 = v2 + (v1-v2)*number (тоже почленно)&lt;br /&gt;
v1:similar(v2, number) -- сравнение векторов на равенство с погрешностью number. Выдаёт 1 или 0&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local v1 = vector()&lt;br /&gt;
v1:set(1,2,3)&lt;br /&gt;
local v2 = vector():set(4,5,6)&lt;br /&gt;
local dist = v1:distance_to(v2)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class fcolor==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class fcolor {&lt;br /&gt;
    property a; --альфа-цвет, отвечающий за прозрачность.&lt;br /&gt;
    property b; --blue-цвет, отвечающий за синий оттенок цвета.&lt;br /&gt;
    property g; --green-цвет, отвечающий за зелёный оттенок цвета.&lt;br /&gt;
    property r; --red-цвет, отвечающий за красный оттенок цвет.&lt;br /&gt;
&lt;br /&gt;
    fcolor ();&lt;br /&gt;
&lt;br /&gt;
    function set(number, number, number, number); --установка цвета (r,g,b,a)&lt;br /&gt;
    function set(const fcolor&amp;amp;); --установка цвета по уже имеющемуся классу &amp;quot;fcolor()&amp;quot;&lt;br /&gt;
    function set(number); -- не знаю. предполагаю, что есть несколько заранее подготовленных цветов с индексами для каждого.&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
color = fcolor()&lt;br /&gt;
color.a = 50&lt;br /&gt;
color.g = 255&lt;br /&gt;
color.r = 100&lt;br /&gt;
color.b = 50&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
или&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
color = fcolor()&lt;br /&gt;
color:set(100,255,50,50)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class hit==&lt;br /&gt;
Бывают случаи, при которых необходимо нанести некоторый урон неписю или мобу, при этом имитировав попадание в него. Для этого существует метод класса game_object:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function hit(hit*);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Чтобы использовать этот метод, нужно указать аргументы. В данном случае имеет объект другого класса - hit. Вот его описание:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class hit {&lt;br /&gt;
    const burn = 0; --здесь идут константы типов урона, используемых в свойстве &amp;quot;type&amp;quot;. Все мы прекрасно знаем, что означает каждый.&lt;br /&gt;
    const chemical_burn = 6;&lt;br /&gt;
    const dummy = 11;&lt;br /&gt;
    const explosion = 7;&lt;br /&gt;
    const fire_wound = 8;&lt;br /&gt;
    const radiation = 4;&lt;br /&gt;
    const shock = 1;&lt;br /&gt;
    const strike = 2;&lt;br /&gt;
    const telepatic = 5;&lt;br /&gt;
    const wound = 3;&lt;br /&gt;
&lt;br /&gt;
    property direction; --дирекция урона&lt;br /&gt;
    property draftsman; --обозначает персонажа, нанёсшего урон.&lt;br /&gt;
    property impulse; --импульс урона&lt;br /&gt;
    property power; --сила урона&lt;br /&gt;
    property type; -- тип урона (см. константы)&lt;br /&gt;
&lt;br /&gt;
    hit ();&lt;br /&gt;
    hit (const hit*);&lt;br /&gt;
&lt;br /&gt;
    function bone(string); --метод с указанием кости урона&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
hit = hit() -- создание объекта класса hit&lt;br /&gt;
hit.direction = vector():set(1,0,0) --дирекция по оси x&lt;br /&gt;
hit.draftsman = db.actor --нанёс урон актор&lt;br /&gt;
hit.impulse = 600 --импульс&lt;br /&gt;
hit.power = 1.45 --хит&lt;br /&gt;
hit.type = 2 --тип урона - выстрел&lt;br /&gt;
hit:bone(&amp;quot;bip01_head&amp;quot;) -- удар приходится на голову&lt;br /&gt;
obj:hit(hit)&lt;br /&gt;
-- наносим урон&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==&amp;quot;Функции времени&amp;quot;==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
time_global() -- реальное время (в миллисекундах) с начала запуска программы&lt;br /&gt;
game.time() -- игровое время (в игровых миллисекундах) с начала игры (т.е. с начала прохождения игры)&lt;br /&gt;
level.get_time_days() -- день месяца по игровому времени&lt;br /&gt;
level.get_time_hours() -- час текущего игрового дня&lt;br /&gt;
level.get_time_minutes() -- минута текущего игрового часа&lt;br /&gt;
&lt;br /&gt;
level.get_time_factor() -- возвращает отношение скорости течения игрового времени к скорости реального &lt;br /&gt;
                        --(game_time_speed / real_time_speed)&lt;br /&gt;
level.set_time_factor(number) -- устанавливает это отношение&lt;br /&gt;
&lt;br /&gt;
game.get_game_time() -- возвращает игровое время в виде объекта класса CTime. Класс CTime я опишу подробно &lt;br /&gt;
                     -- как-нибудь потом, а пока опишу только пару его методов.&lt;br /&gt;
конструктор. Вызывается через пространство имён game&lt;br /&gt;
game.CTime()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Дефолтовые значения===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
year, month, day = 1 &lt;br /&gt;
hour, min, sek, ms = 0&lt;br /&gt;
CTime.set(year, month, day, hour, min, sek, ms) -- устанавливает все данные о времени&lt;br /&gt;
метод CTime.get описан так:&lt;br /&gt;
function get(number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;);&lt;br /&gt;
что наводит на мысль о семи аргументах. однако с точки зрения Lua этот метод не принимает аргументов, зато возвращает семь значений. &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
====Пример использования обоих методов:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local t = game.CTime() -- создания объекта с дефолтовыми значнеиями&lt;br /&gt;
t:set(2009, 7, 11, 8, 11, 22, 333) -- установили все значения&lt;br /&gt;
&lt;br /&gt;
local y,m,d,h,min,sec,ms = t:get() -- получили все значения&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
===Класс CTime (неразобранный)===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class CTime {&lt;br /&gt;
const DateToDay = 0;&lt;br /&gt;
const DateToMonth = 1;&lt;br /&gt;
const DateToYear = 2;&lt;br /&gt;
const TimeToHours = 0;&lt;br /&gt;
const TimeToMilisecs = 3;&lt;br /&gt;
const TimeToMinutes = 1;&lt;br /&gt;
const TimeToSeconds = 2;&lt;br /&gt;
&lt;br /&gt;
CTime ();&lt;br /&gt;
CTime (const CTime&amp;amp;);&lt;br /&gt;
&lt;br /&gt;
function sub(CTime*);&lt;br /&gt;
function timeToString(number);&lt;br /&gt;
function dateToString(number);&lt;br /&gt;
operator ==(const CTime&amp;amp;, CTime);&lt;br /&gt;
function get(number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;);&lt;br /&gt;
function set(number, number, number, number, number, number, number);&lt;br /&gt;
function setHMSms(number, number, number, number);&lt;br /&gt;
function diffSec(CTime*);&lt;br /&gt;
operator &amp;lt;(const CTime&amp;amp;, CTime);&lt;br /&gt;
operator +(CTime&amp;amp;, CTime);&lt;br /&gt;
operator &amp;gt;=(const CTime&amp;amp;, CTime);&lt;br /&gt;
function setHMS(number, number, number);&lt;br /&gt;
operator &amp;gt;(const CTime&amp;amp;, CTime);&lt;br /&gt;
operator -(CTime&amp;amp;, CTime);&lt;br /&gt;
operator &amp;lt;=(const CTime&amp;amp;, CTime);&lt;br /&gt;
function add(CTime*);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
Статья создана: [[Участник:malandrinus|malandrinus]], [[Участник:IQDDD|IQDDD]], [[Участник:меченый|меченый]]&lt;/div&gt;</summary>
		<author><name>95.25.99.189</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC</id>
		<title>Справочник по функциям и классам</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC"/>
				<updated>2009-07-11T22:33:13Z</updated>
		
		<summary type="html">&lt;p&gt;95.25.99.189: /* Например: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Посты с форума AMK&lt;br /&gt;
&lt;br /&gt;
==Структура Lua_help==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;C++ class [класс] {&lt;br /&gt;
     const [описание1] = [константа1];&lt;br /&gt;
     const [описание2] = [константа2];&lt;br /&gt;
     ...&lt;br /&gt;
     [константы заменяют описания при вызове методов классов];&lt;br /&gt;
     &lt;br /&gt;
     property [свойство1];&lt;br /&gt;
     property [свойство2];&lt;br /&gt;
     ...&lt;br /&gt;
[свойства (property) - это характеристика какого-либо класса, которая может подвергаться мат. операциям, слияниям, присвояниям и пр.&lt;br /&gt;
     читаются через точку: obj.health];&lt;br /&gt;
&lt;br /&gt;
     [глобальная(-ые) функция(-ии), которой вызывается класс];&lt;br /&gt;
     function [метод1] ([аргумент 1 функции 1], [аргумент 2 функции 1]...);&lt;br /&gt;
     function [метод2] ([аргумент 1 функции2]...);&lt;br /&gt;
             ...&lt;br /&gt;
     [методы - это специальные функции, выполняющие операции с классами и возвращающие значения после операций над классами.&lt;br /&gt;
     вызываются через двоеточие: obj:add_animation(...)];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Создание своего класса==&lt;br /&gt;
Свой класс можно добавить так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class &amp;quot;my_cool_class&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь &amp;quot;my_cool_class&amp;quot; - имя моего нового класса. Записывается в кавычках, т.е. это строка.&lt;br /&gt;
&lt;br /&gt;
Потом можно добавлять к этому классу свои методы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- это специальный метод - конструктор. Будет вызван при создании класса.&lt;br /&gt;
function my_cool_class:__init(num)&lt;br /&gt;
    self.my_param = num -- добавили в свой класс переменную&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- обычный метод&lt;br /&gt;
function my_cool_class:cool_method_of_my_class()&lt;br /&gt;
    get_console():execute(&amp;quot;lua_bind_in_action_&amp;quot;..self.my_param)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- деструктор, вызывается при сборке объекта сборщиком мусора. Аргументов не имеет (кроме скрытого self. об этом см. далее)&lt;br /&gt;
function my_cool_class:__finalize()&lt;br /&gt;
    get_console():execute(&amp;quot;good_by_&amp;quot;..self.my_param)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Потом можно создавать экземпляры своего класса, вызывать их методы и пр.:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local obj1 = my_cool_class(1) -- здесь создаётся новый объект. При этом вызывается конструктор и &lt;br /&gt;
                              -- ему передаются аргументы этого вызова (в данном случае число 1).&lt;br /&gt;
local obj2 = my_cool_class(4)&lt;br /&gt;
obj1:cool_method_of_my_class()&lt;br /&gt;
obj2:cool_method_of_my_class()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как только объект становится ненужным (т.е. на него больше нет ссылок) он удаляется сборщиком мусора. При этом вызывается его метод __finalize&lt;br /&gt;
&lt;br /&gt;
При чём здесь self.&lt;br /&gt;
self - это скрытый первый аргумент. Конструкция вида:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function class_name:fun_name(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
на самом деле эквивалентна конструкции &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function class_name.fun_name(self, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Обратите внимание на двоеточие в первом случае и точку во втором.&amp;lt;br&amp;gt;&lt;br /&gt;
При вызове метода конструкция вида:&lt;br /&gt;
&lt;br /&gt;
object_name:fun_name(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
эквивалентна конструкции&lt;br /&gt;
&lt;br /&gt;
object_name.fun_name(object_name, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Это означает, что в качестве self как правило передаётся сам же объект. &amp;quot;Как правило&amp;quot; - это потому, что можно в принципе передать что-то другое. Но лучше этого соглашения не нарушать.&lt;br /&gt;
&lt;br /&gt;
Всё это здорово, но какая от этого польза? Ну сделал я свой класс, и что с ним делать?&lt;br /&gt;
&lt;br /&gt;
В общем, классы - это неплохое средство организации своего кода. Владеющие объектно-ориентированным подходом найдут это расширение весьма удобным. В частности такие, ни к чему не привязанные классы, в скриптах сталкера используются в некоторых местах. Однако, настоящая сила этой технологии не в этом. С помощью этой технологии можно расширять классы, экспортированные в Lua со стороны движка игры. Об этом пойдет речь в следующей части.&lt;br /&gt;
&lt;br /&gt;
==Наследование от экспортированных классов==&lt;br /&gt;
Итак, кроме создания собственных классов технология Luabind позволяет создавать класы на основе уже существующих. Это реализовано в виде своеобразного наследования. Делается это с помощью следующей конструкции:&lt;br /&gt;
&lt;br /&gt;
'''class &amp;quot;my_derived_class&amp;quot; (base_class)'''&lt;br /&gt;
&lt;br /&gt;
Здесь:&lt;br /&gt;
&amp;quot;my_derived_class&amp;quot; как и раньше - это имя нового класса.&amp;lt;br&amp;gt;&lt;br /&gt;
base_class - это уже существующий класс, который будет базовым для вновь созданного. Имя выбрано произвольно, но подразумевается, что такой класс экспортирован и предназначен для наследования.&amp;lt;br&amp;gt;&lt;br /&gt;
Далеко не любой класс из экспортированных со стороны хост-приложения можно использовать в качестве базового. На стороне хост-приложения должен быть создан специальный класс-обёртка. Если его нет, то ничего хорошего не выйдет. Скорее всего при попытке использовать унаследованный класс в Lua будут малопонятные проблемы и вылеты, так что надо знать совершенно точно, можно ли от конкретного класса наследовать.&amp;lt;br&amp;gt;&lt;br /&gt;
Вопрос, какой глубины может быть наследование, т.е. можно ли наследовать от производного класса, мне пока до конца не ясен. С другой стороны, в этом практически нет необходимости.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итак после выполнения указанной конструкции появляется класс my_derived_class, который является копией класса base_class. У него есть в точности те же методы, что и у его базового класса. Пока от этого мало толку. Но теперь можно переопределить методы нашего класса, изменив таким образом его поведение. Делается это так же, как и ранее, но с некоторыми дополнениями.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- конструктор&lt;br /&gt;
function my_derived_class:__init(num) super(num)&lt;br /&gt;
end&lt;br /&gt;
-- обычный метод&lt;br /&gt;
function my_cool_class:some_method(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
    base_class.some_method(self, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
-- деструктор&lt;br /&gt;
function my_cool_class:__finalize()&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На что стОит обратить внимание.&amp;lt;br&amp;gt;&lt;br /&gt;
Во-первых, конструкция super(num). Это вызов конструктора базового класса.&amp;lt;br&amp;gt;&lt;br /&gt;
Во-вторых, для вызова метода базового класса из метода унаследованного используется другая конструкция base_class.some_method(self, ). Здесь надо использовать альтернативную форму вызова метода (с точкой и явным указанием первого аргумента self).&amp;lt;br&amp;gt;&lt;br /&gt;
Наконец, метод __finalize() не требует вызова этого же метода для базового класса, поскольку тот будет вызван автоматически при удалении объекта сборщиком мусора.&lt;br /&gt;
&lt;br /&gt;
Собственно и всё. Теперь можно пользоваться созданным классом: создавать объекты этого класса, вызывать их методы и пр. Здесь уже всё зависит от конкретных целей и требует знания конкретных классов.&lt;br /&gt;
&lt;br /&gt;
==сlass alife_simulator==&lt;br /&gt;
alife_simulator - класс для управления серверными объектами. В игре существует всего один экземпляр такого класса, и получить его можно с помощью вызова глобальной функции alife().&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
level_name(level_id) -- возвращает имя уровня по его id&lt;br /&gt;
create_ammo(&amp;lt;имя секции патронов&amp;gt;, position, lvid, gvid, id, amount) - создание пачек с патронами&lt;br /&gt;
create(&amp;lt;имя секции объекта&amp;gt;, position, lvid, gvid, id) -- создание объектов в инвентаре&lt;br /&gt;
create(&amp;lt;имя секции объекта&amp;gt;, position, lvid, gvid) -- создание объектов на уровне&lt;br /&gt;
во всех функция создания объектов&lt;br /&gt;
position - объект класса vector. Не может быть nil, иначе вылет&lt;br /&gt;
lvid - level vertex id&lt;br /&gt;
gvid - game vertex id&lt;br /&gt;
id - это куда спавним. Если в инвентарь, то указываем id непися или ноль (для актора)&lt;br /&gt;
release(sobj, boolean) -- удаляет объект sobj. Зачем второй булевский аргумент - не известно. &lt;br /&gt;
                          Во всех примерах он либо отсутствует, либо установлен в true&lt;br /&gt;
object(id) -- возвращает серверный объект по его id. Если не нашёл nil&lt;br /&gt;
story_object(sid) -- возвращает серверный объект по его story id. Если не нашёл nil&lt;br /&gt;
actor() -- возвращает серверный объект актора&lt;br /&gt;
set_switch_online(id, boolean) -- переводит в онлайн объект с идентификатором id&lt;br /&gt;
set_switch_offline(id, boolean) -- то же , но в онлайн&lt;br /&gt;
dont_has_info(const number&amp;amp;, string); -- проверка на Неполученный инфопоршень(db.actor:dont_has_info(&amp;quot;infoportion&amp;quot;) &lt;br /&gt;
                                      -- или alife():actor():dont_has_info(&amp;quot;infoportion&amp;quot;)).&lt;br /&gt;
has_info - противоположная&lt;br /&gt;
&lt;br /&gt;
предположительно:&lt;br /&gt;
switch_distance() -- радиус переключения в оффлайн?&lt;br /&gt;
switch_distance(number) -- установка этого радиуса?&lt;br /&gt;
level_id() -- текущий номер уровня ?&lt;br /&gt;
object(string) -- получение объекта оп его имени. Не помню точно, что за имя.&lt;br /&gt;
object(number, boolean) - то же, что и object(number)? на что влияет второй аргумент?&lt;br /&gt;
valid_object_id(number) -- проверка наличия объекта по id?&lt;br /&gt;
alife():create( &amp;lt;индекс объекта в all.spawn&amp;gt; ) -- &lt;br /&gt;
spawn_id(number) -- индекс объекта в all.spawn для объекта с заданным id ?&lt;br /&gt;
&lt;br /&gt;
неизвестно:&lt;br /&gt;
add_out_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
set_interactive(number, boolean);&lt;br /&gt;
add_in_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
function remove_in_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
remove_out_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
kill_entity(cse_alife_monster_abstract*, const number&amp;amp;, cse_alife_schedulable*);&lt;br /&gt;
kill_entity(alife_simulator*, cse_alife_monster_abstract*, const number&amp;amp;);&lt;br /&gt;
kill_entity(alife_simulator*, cse_alife_monster_abstract*);&lt;br /&gt;
has_info(const number&amp;amp;, string);&lt;br /&gt;
remove_all_restrictions(number, const enum RestrictionSpace::ERestrictorTypes&amp;amp;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local sim = alife() -- получаем сам объект класса alife_simulator&lt;br /&gt;
local sactor = sim:actor() -- получаем серверный объект для актора&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class vector==&lt;br /&gt;
vector - вспомогательный класс, содержащий три координаты, и позволяющий выполнять с ними различные манипуляции. Объекты класса vector являются аргументами многих функций и возвращаются многими функциями. См. например выше про метод create класса alife_simulator. Отдельный объект класса вектор создаётся вызовом глобальной функции vector(). При создании имеет координаты [0,0,0].&lt;br /&gt;
&lt;br /&gt;
===Список методов класса vector===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
v:set_length(number) - оставить направление, изменить длину&lt;br /&gt;
v:normalize(); - сделать длину единичной&lt;br /&gt;
&lt;br /&gt;
v:magnitude() -- длина вектора v&lt;br /&gt;
v1:distance_to(v2) -- расстояние между v1 и v2&lt;br /&gt;
v1:distance_to_sqr(v2) -- квадрат расстояния между v1 и v2&lt;br /&gt;
v1:crossproduct(v2) -- векторное произведение. Возвращает вектор&lt;br /&gt;
v1:dotproduct(v2) -- скалярное произведение. Возвращает число&lt;br /&gt;
v:sub(number); -- вычесть из каждого компонента v число number&lt;br /&gt;
v1:sub(v2); -- вычесть почленно вектор v2 из v1 и поместить в v1&lt;br /&gt;
v1:sub(v2, v3) -- вычесть из v2 - v3 и поместить в v1&lt;br /&gt;
аналогично:&lt;br /&gt;
add - почленное сложение&lt;br /&gt;
mul - почленное умножение&lt;br /&gt;
div - почленное деление&lt;br /&gt;
max/min - почленный максимум/минимум&lt;br /&gt;
v1:clamp(v2) -- почленное обрезание первого вторым&lt;br /&gt;
average -- почленное среднее&lt;br /&gt;
invert -- почленная инверсия знака&lt;br /&gt;
&lt;br /&gt;
v1:abs(v2); -- копирует почленно положительные компоненты в v1 из v2&lt;br /&gt;
lerp(v1, v2, number) -- линейная интерполяция между двумя векторами&lt;br /&gt;
-- если number больше 1, то выходит за них - экстраполяция&lt;br /&gt;
&lt;br /&gt;
v1:reflect(v2, v3) - должно быть отражение одного вектора от плоскости, определяемой другим. Не проверял&lt;br /&gt;
v1:slide(v2, v3); - вероятно, проекция одного вектора на плоскость, определяемую другим. Не уверен&lt;br /&gt;
v1:distance_to_xz(v2) - учитывая, что плоскость XZ - это плоскость параллельная земле, то возможно это &lt;br /&gt;
                        длина проекции на землю пути от точки до точки. Не проверял&lt;br /&gt;
&lt;br /&gt;
v:getP() - зенитный угол в радианах (угол наклона над плоскостью XZ )&lt;br /&gt;
v:getH() - азимутальный угол в радианах (угол в плоскости XZ между проекцией вектора на эту плоскость и осью Z)&lt;br /&gt;
setHP - соответственно для установки этих значений&lt;br /&gt;
v1:align() - выравнивает вектор вдоль оси x или z и нормирует его. Значение по y игнорируется. &lt;br /&gt;
             В итоге всегда возвращается одно из четырёх значений ([1,0,0], [-1,0,0], [0,0,1], [0,0,-1])&lt;br /&gt;
v4:mad(v1,v2,v3) -- бешеная операция =) умножить почленно второе на третье и сложить с &lt;br /&gt;
                    первым, т.е. v4 = v1 + v2*v3 (название операции mad == mul + add)&lt;br /&gt;
v1:inertion(v2, number) -- v1 = v2 + (v1-v2)*number (тоже почленно)&lt;br /&gt;
v1:similar(v2, number) -- сравнение векторов на равенство с погрешностью number. Выдаёт 1 или 0&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local v1 = vector()&lt;br /&gt;
v1:set(1,2,3)&lt;br /&gt;
local v2 = vector():set(4,5,6)&lt;br /&gt;
local dist = v1:distance_to(v2)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class fcolor==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class fcolor {&lt;br /&gt;
    property a; --альфа-цвет, отвечающий за прозрачность.&lt;br /&gt;
    property b; --blue-цвет, отвечающий за синий оттенок цвета.&lt;br /&gt;
    property g; --green-цвет, отвечающий за зелёный оттенок цвета.&lt;br /&gt;
    property r; --red-цвет, отвечающий за красный оттенок цвет.&lt;br /&gt;
&lt;br /&gt;
    fcolor ();&lt;br /&gt;
&lt;br /&gt;
    function set(number, number, number, number); --установка цвета (r,g,b,a)&lt;br /&gt;
    function set(const fcolor&amp;amp;); --установка цвета по уже имеющемуся классу &amp;quot;fcolor()&amp;quot;&lt;br /&gt;
    function set(number); -- не знаю. предполагаю, что есть несколько заранее подготовленных цветов с индексами для каждого.&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Например====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
color = fcolor()&lt;br /&gt;
color.a = 50&lt;br /&gt;
color.g = 255&lt;br /&gt;
color.r = 100&lt;br /&gt;
color.b = 50&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
или&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
color = fcolor()&lt;br /&gt;
color:set(100,255,50,50)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class hit==&lt;br /&gt;
Бывают случаи, при которых необходимо нанести некоторый урон неписю или мобу, при этом имитировав попадание в него. Для этого существует метод класса game_object:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function hit(hit*);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Чтобы использовать этот метод, нужно указать аргументы. В данном случае имеет объект другого класса - hit. Вот его описание:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class hit {&lt;br /&gt;
    const burn = 0; --здесь идут константы типов урона, используемых в свойстве &amp;quot;type&amp;quot;. Все мы прекрасно знаем, что означает каждый.&lt;br /&gt;
    const chemical_burn = 6;&lt;br /&gt;
    const dummy = 11;&lt;br /&gt;
    const explosion = 7;&lt;br /&gt;
    const fire_wound = 8;&lt;br /&gt;
    const radiation = 4;&lt;br /&gt;
    const shock = 1;&lt;br /&gt;
    const strike = 2;&lt;br /&gt;
    const telepatic = 5;&lt;br /&gt;
    const wound = 3;&lt;br /&gt;
&lt;br /&gt;
    property direction; --дирекция урона&lt;br /&gt;
    property draftsman; --обозначает персонажа, нанёсшего урон.&lt;br /&gt;
    property impulse; --импульс урона&lt;br /&gt;
    property power; --сила урона&lt;br /&gt;
    property type; -- тип урона (см. константы)&lt;br /&gt;
&lt;br /&gt;
    hit ();&lt;br /&gt;
    hit (const hit*);&lt;br /&gt;
&lt;br /&gt;
    function bone(string); --метод с указанием кости урона&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
hit = hit() -- создание объекта класса hit&lt;br /&gt;
hit.direction = vector():set(1,0,0) --дирекция по оси x&lt;br /&gt;
hit.draftsman = db.actor --нанёс урон актор&lt;br /&gt;
hit.impulse = 600 --импульс&lt;br /&gt;
hit.power = 1.45 --хит&lt;br /&gt;
hit.type = 2 --тип урона - выстрел&lt;br /&gt;
hit:bone(&amp;quot;bip01_head&amp;quot;) -- удар приходится на голову&lt;br /&gt;
obj:hit(hit)&lt;br /&gt;
-- наносим урон&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==&amp;quot;Функции времени&amp;quot;==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
time_global() -- реальное время (в миллисекундах) с начала запуска программы&lt;br /&gt;
game.time() -- игровое время (в игровых миллисекундах) с начала игры (т.е. с начала прохождения игры)&lt;br /&gt;
level.get_time_days() -- день месяца по игровому времени&lt;br /&gt;
level.get_time_hours() -- час текущего игрового дня&lt;br /&gt;
level.get_time_minutes() -- минута текущего игрового часа&lt;br /&gt;
&lt;br /&gt;
level.get_time_factor() -- возвращает отношение скорости течения игрового времени к скорости реального &lt;br /&gt;
                        --(game_time_speed / real_time_speed)&lt;br /&gt;
level.set_time_factor(number) -- устанавливает это отношение&lt;br /&gt;
&lt;br /&gt;
game.get_game_time() -- возвращает игровое время в виде объекта класса CTime. Класс CTime я опишу подробно &lt;br /&gt;
                     -- как-нибудь потом, а пока опишу только пару его методов.&lt;br /&gt;
конструктор. Вызывается через пространство имён game&lt;br /&gt;
game.CTime()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Дефолтовые значения===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
year, month, day = 1 &lt;br /&gt;
hour, min, sek, ms = 0&lt;br /&gt;
CTime.set(year, month, day, hour, min, sek, ms) -- устанавливает все данные о времени&lt;br /&gt;
метод CTime.get описан так:&lt;br /&gt;
function get(number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;);&lt;br /&gt;
что наводит на мысль о семи аргументах. однако с точки зрения Lua этот метод не принимает аргументов, зато возвращает семь значений. &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
====Пример использования обоих методов:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local t = game.CTime() -- создания объекта с дефолтовыми значнеиями&lt;br /&gt;
t:set(2009, 7, 11, 8, 11, 22, 333) -- установили все значения&lt;br /&gt;
&lt;br /&gt;
local y,m,d,h,min,sec,ms = t:get() -- получили все значения&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
===Класс CTime (неразобранный)===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class CTime {&lt;br /&gt;
const DateToDay = 0;&lt;br /&gt;
const DateToMonth = 1;&lt;br /&gt;
const DateToYear = 2;&lt;br /&gt;
const TimeToHours = 0;&lt;br /&gt;
const TimeToMilisecs = 3;&lt;br /&gt;
const TimeToMinutes = 1;&lt;br /&gt;
const TimeToSeconds = 2;&lt;br /&gt;
&lt;br /&gt;
CTime ();&lt;br /&gt;
CTime (const CTime&amp;amp;);&lt;br /&gt;
&lt;br /&gt;
function sub(CTime*);&lt;br /&gt;
function timeToString(number);&lt;br /&gt;
function dateToString(number);&lt;br /&gt;
operator ==(const CTime&amp;amp;, CTime);&lt;br /&gt;
function get(number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;);&lt;br /&gt;
function set(number, number, number, number, number, number, number);&lt;br /&gt;
function setHMSms(number, number, number, number);&lt;br /&gt;
function diffSec(CTime*);&lt;br /&gt;
operator &amp;lt;(const CTime&amp;amp;, CTime);&lt;br /&gt;
operator +(CTime&amp;amp;, CTime);&lt;br /&gt;
operator &amp;gt;=(const CTime&amp;amp;, CTime);&lt;br /&gt;
function setHMS(number, number, number);&lt;br /&gt;
operator &amp;gt;(const CTime&amp;amp;, CTime);&lt;br /&gt;
operator -(CTime&amp;amp;, CTime);&lt;br /&gt;
operator &amp;lt;=(const CTime&amp;amp;, CTime);&lt;br /&gt;
function add(CTime*);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
Статья создана: [[Участник:malandrinus|malandrinus]], [[Участник:IQDDD|IQDDD]], [[Участник:меченый|меченый]]&lt;/div&gt;</summary>
		<author><name>95.25.99.189</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC</id>
		<title>Справочник по функциям и классам</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC"/>
				<updated>2009-07-11T22:32:24Z</updated>
		
		<summary type="html">&lt;p&gt;95.25.99.189: /* Авторы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Посты с форума AMK&lt;br /&gt;
&lt;br /&gt;
==Структура Lua_help==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;C++ class [класс] {&lt;br /&gt;
     const [описание1] = [константа1];&lt;br /&gt;
     const [описание2] = [константа2];&lt;br /&gt;
     ...&lt;br /&gt;
     [константы заменяют описания при вызове методов классов];&lt;br /&gt;
     &lt;br /&gt;
     property [свойство1];&lt;br /&gt;
     property [свойство2];&lt;br /&gt;
     ...&lt;br /&gt;
[свойства (property) - это характеристика какого-либо класса, которая может подвергаться мат. операциям, слияниям, присвояниям и пр.&lt;br /&gt;
     читаются через точку: obj.health];&lt;br /&gt;
&lt;br /&gt;
     [глобальная(-ые) функция(-ии), которой вызывается класс];&lt;br /&gt;
     function [метод1] ([аргумент 1 функции 1], [аргумент 2 функции 1]...);&lt;br /&gt;
     function [метод2] ([аргумент 1 функции2]...);&lt;br /&gt;
             ...&lt;br /&gt;
     [методы - это специальные функции, выполняющие операции с классами и возвращающие значения после операций над классами.&lt;br /&gt;
     вызываются через двоеточие: obj:add_animation(...)];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Создание своего класса==&lt;br /&gt;
Свой класс можно добавить так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class &amp;quot;my_cool_class&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь &amp;quot;my_cool_class&amp;quot; - имя моего нового класса. Записывается в кавычках, т.е. это строка.&lt;br /&gt;
&lt;br /&gt;
Потом можно добавлять к этому классу свои методы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- это специальный метод - конструктор. Будет вызван при создании класса.&lt;br /&gt;
function my_cool_class:__init(num)&lt;br /&gt;
    self.my_param = num -- добавили в свой класс переменную&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- обычный метод&lt;br /&gt;
function my_cool_class:cool_method_of_my_class()&lt;br /&gt;
    get_console():execute(&amp;quot;lua_bind_in_action_&amp;quot;..self.my_param)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- деструктор, вызывается при сборке объекта сборщиком мусора. Аргументов не имеет (кроме скрытого self. об этом см. далее)&lt;br /&gt;
function my_cool_class:__finalize()&lt;br /&gt;
    get_console():execute(&amp;quot;good_by_&amp;quot;..self.my_param)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Потом можно создавать экземпляры своего класса, вызывать их методы и пр.:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local obj1 = my_cool_class(1) -- здесь создаётся новый объект. При этом вызывается конструктор и &lt;br /&gt;
                              -- ему передаются аргументы этого вызова (в данном случае число 1).&lt;br /&gt;
local obj2 = my_cool_class(4)&lt;br /&gt;
obj1:cool_method_of_my_class()&lt;br /&gt;
obj2:cool_method_of_my_class()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как только объект становится ненужным (т.е. на него больше нет ссылок) он удаляется сборщиком мусора. При этом вызывается его метод __finalize&lt;br /&gt;
&lt;br /&gt;
При чём здесь self.&lt;br /&gt;
self - это скрытый первый аргумент. Конструкция вида:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function class_name:fun_name(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
на самом деле эквивалентна конструкции &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function class_name.fun_name(self, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Обратите внимание на двоеточие в первом случае и точку во втором.&amp;lt;br&amp;gt;&lt;br /&gt;
При вызове метода конструкция вида:&lt;br /&gt;
&lt;br /&gt;
object_name:fun_name(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
эквивалентна конструкции&lt;br /&gt;
&lt;br /&gt;
object_name.fun_name(object_name, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Это означает, что в качестве self как правило передаётся сам же объект. &amp;quot;Как правило&amp;quot; - это потому, что можно в принципе передать что-то другое. Но лучше этого соглашения не нарушать.&lt;br /&gt;
&lt;br /&gt;
Всё это здорово, но какая от этого польза? Ну сделал я свой класс, и что с ним делать?&lt;br /&gt;
&lt;br /&gt;
В общем, классы - это неплохое средство организации своего кода. Владеющие объектно-ориентированным подходом найдут это расширение весьма удобным. В частности такие, ни к чему не привязанные классы, в скриптах сталкера используются в некоторых местах. Однако, настоящая сила этой технологии не в этом. С помощью этой технологии можно расширять классы, экспортированные в Lua со стороны движка игры. Об этом пойдет речь в следующей части.&lt;br /&gt;
&lt;br /&gt;
==Наследование от экспортированных классов==&lt;br /&gt;
Итак, кроме создания собственных классов технология Luabind позволяет создавать класы на основе уже существующих. Это реализовано в виде своеобразного наследования. Делается это с помощью следующей конструкции:&lt;br /&gt;
&lt;br /&gt;
'''class &amp;quot;my_derived_class&amp;quot; (base_class)'''&lt;br /&gt;
&lt;br /&gt;
Здесь:&lt;br /&gt;
&amp;quot;my_derived_class&amp;quot; как и раньше - это имя нового класса.&amp;lt;br&amp;gt;&lt;br /&gt;
base_class - это уже существующий класс, который будет базовым для вновь созданного. Имя выбрано произвольно, но подразумевается, что такой класс экспортирован и предназначен для наследования.&amp;lt;br&amp;gt;&lt;br /&gt;
Далеко не любой класс из экспортированных со стороны хост-приложения можно использовать в качестве базового. На стороне хост-приложения должен быть создан специальный класс-обёртка. Если его нет, то ничего хорошего не выйдет. Скорее всего при попытке использовать унаследованный класс в Lua будут малопонятные проблемы и вылеты, так что надо знать совершенно точно, можно ли от конкретного класса наследовать.&amp;lt;br&amp;gt;&lt;br /&gt;
Вопрос, какой глубины может быть наследование, т.е. можно ли наследовать от производного класса, мне пока до конца не ясен. С другой стороны, в этом практически нет необходимости.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итак после выполнения указанной конструкции появляется класс my_derived_class, который является копией класса base_class. У него есть в точности те же методы, что и у его базового класса. Пока от этого мало толку. Но теперь можно переопределить методы нашего класса, изменив таким образом его поведение. Делается это так же, как и ранее, но с некоторыми дополнениями.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- конструктор&lt;br /&gt;
function my_derived_class:__init(num) super(num)&lt;br /&gt;
end&lt;br /&gt;
-- обычный метод&lt;br /&gt;
function my_cool_class:some_method(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
    base_class.some_method(self, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
-- деструктор&lt;br /&gt;
function my_cool_class:__finalize()&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На что стОит обратить внимание.&amp;lt;br&amp;gt;&lt;br /&gt;
Во-первых, конструкция super(num). Это вызов конструктора базового класса.&amp;lt;br&amp;gt;&lt;br /&gt;
Во-вторых, для вызова метода базового класса из метода унаследованного используется другая конструкция base_class.some_method(self, ). Здесь надо использовать альтернативную форму вызова метода (с точкой и явным указанием первого аргумента self).&amp;lt;br&amp;gt;&lt;br /&gt;
Наконец, метод __finalize() не требует вызова этого же метода для базового класса, поскольку тот будет вызван автоматически при удалении объекта сборщиком мусора.&lt;br /&gt;
&lt;br /&gt;
Собственно и всё. Теперь можно пользоваться созданным классом: создавать объекты этого класса, вызывать их методы и пр. Здесь уже всё зависит от конкретных целей и требует знания конкретных классов.&lt;br /&gt;
&lt;br /&gt;
==сlass alife_simulator==&lt;br /&gt;
alife_simulator - класс для управления серверными объектами. В игре существует всего один экземпляр такого класса, и получить его можно с помощью вызова глобальной функции alife().&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
level_name(level_id) -- возвращает имя уровня по его id&lt;br /&gt;
create_ammo(&amp;lt;имя секции патронов&amp;gt;, position, lvid, gvid, id, amount) - создание пачек с патронами&lt;br /&gt;
create(&amp;lt;имя секции объекта&amp;gt;, position, lvid, gvid, id) -- создание объектов в инвентаре&lt;br /&gt;
create(&amp;lt;имя секции объекта&amp;gt;, position, lvid, gvid) -- создание объектов на уровне&lt;br /&gt;
во всех функция создания объектов&lt;br /&gt;
position - объект класса vector. Не может быть nil, иначе вылет&lt;br /&gt;
lvid - level vertex id&lt;br /&gt;
gvid - game vertex id&lt;br /&gt;
id - это куда спавним. Если в инвентарь, то указываем id непися или ноль (для актора)&lt;br /&gt;
release(sobj, boolean) -- удаляет объект sobj. Зачем второй булевский аргумент - не известно. &lt;br /&gt;
                          Во всех примерах он либо отсутствует, либо установлен в true&lt;br /&gt;
object(id) -- возвращает серверный объект по его id. Если не нашёл nil&lt;br /&gt;
story_object(sid) -- возвращает серверный объект по его story id. Если не нашёл nil&lt;br /&gt;
actor() -- возвращает серверный объект актора&lt;br /&gt;
set_switch_online(id, boolean) -- переводит в онлайн объект с идентификатором id&lt;br /&gt;
set_switch_offline(id, boolean) -- то же , но в онлайн&lt;br /&gt;
dont_has_info(const number&amp;amp;, string); -- проверка на Неполученный инфопоршень(db.actor:dont_has_info(&amp;quot;infoportion&amp;quot;) &lt;br /&gt;
                                      -- или alife():actor():dont_has_info(&amp;quot;infoportion&amp;quot;)).&lt;br /&gt;
has_info - противоположная&lt;br /&gt;
&lt;br /&gt;
предположительно:&lt;br /&gt;
switch_distance() -- радиус переключения в оффлайн?&lt;br /&gt;
switch_distance(number) -- установка этого радиуса?&lt;br /&gt;
level_id() -- текущий номер уровня ?&lt;br /&gt;
object(string) -- получение объекта оп его имени. Не помню точно, что за имя.&lt;br /&gt;
object(number, boolean) - то же, что и object(number)? на что влияет второй аргумент?&lt;br /&gt;
valid_object_id(number) -- проверка наличия объекта по id?&lt;br /&gt;
alife():create( &amp;lt;индекс объекта в all.spawn&amp;gt; ) -- &lt;br /&gt;
spawn_id(number) -- индекс объекта в all.spawn для объекта с заданным id ?&lt;br /&gt;
&lt;br /&gt;
неизвестно:&lt;br /&gt;
add_out_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
set_interactive(number, boolean);&lt;br /&gt;
add_in_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
function remove_in_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
remove_out_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
kill_entity(cse_alife_monster_abstract*, const number&amp;amp;, cse_alife_schedulable*);&lt;br /&gt;
kill_entity(alife_simulator*, cse_alife_monster_abstract*, const number&amp;amp;);&lt;br /&gt;
kill_entity(alife_simulator*, cse_alife_monster_abstract*);&lt;br /&gt;
has_info(const number&amp;amp;, string);&lt;br /&gt;
remove_all_restrictions(number, const enum RestrictionSpace::ERestrictorTypes&amp;amp;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local sim = alife() -- получаем сам объект класса alife_simulator&lt;br /&gt;
local sactor = sim:actor() -- получаем серверный объект для актора&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class vector==&lt;br /&gt;
vector - вспомогательный класс, содержащий три координаты, и позволяющий выполнять с ними различные манипуляции. Объекты класса vector являются аргументами многих функций и возвращаются многими функциями. См. например выше про метод create класса alife_simulator. Отдельный объект класса вектор создаётся вызовом глобальной функции vector(). При создании имеет координаты [0,0,0].&lt;br /&gt;
&lt;br /&gt;
===Список методов класса vector===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
v:set_length(number) - оставить направление, изменить длину&lt;br /&gt;
v:normalize(); - сделать длину единичной&lt;br /&gt;
&lt;br /&gt;
v:magnitude() -- длина вектора v&lt;br /&gt;
v1:distance_to(v2) -- расстояние между v1 и v2&lt;br /&gt;
v1:distance_to_sqr(v2) -- квадрат расстояния между v1 и v2&lt;br /&gt;
v1:crossproduct(v2) -- векторное произведение. Возвращает вектор&lt;br /&gt;
v1:dotproduct(v2) -- скалярное произведение. Возвращает число&lt;br /&gt;
v:sub(number); -- вычесть из каждого компонента v число number&lt;br /&gt;
v1:sub(v2); -- вычесть почленно вектор v2 из v1 и поместить в v1&lt;br /&gt;
v1:sub(v2, v3) -- вычесть из v2 - v3 и поместить в v1&lt;br /&gt;
аналогично:&lt;br /&gt;
add - почленное сложение&lt;br /&gt;
mul - почленное умножение&lt;br /&gt;
div - почленное деление&lt;br /&gt;
max/min - почленный максимум/минимум&lt;br /&gt;
v1:clamp(v2) -- почленное обрезание первого вторым&lt;br /&gt;
average -- почленное среднее&lt;br /&gt;
invert -- почленная инверсия знака&lt;br /&gt;
&lt;br /&gt;
v1:abs(v2); -- копирует почленно положительные компоненты в v1 из v2&lt;br /&gt;
lerp(v1, v2, number) -- линейная интерполяция между двумя векторами&lt;br /&gt;
-- если number больше 1, то выходит за них - экстраполяция&lt;br /&gt;
&lt;br /&gt;
v1:reflect(v2, v3) - должно быть отражение одного вектора от плоскости, определяемой другим. Не проверял&lt;br /&gt;
v1:slide(v2, v3); - вероятно, проекция одного вектора на плоскость, определяемую другим. Не уверен&lt;br /&gt;
v1:distance_to_xz(v2) - учитывая, что плоскость XZ - это плоскость параллельная земле, то возможно это &lt;br /&gt;
                        длина проекции на землю пути от точки до точки. Не проверял&lt;br /&gt;
&lt;br /&gt;
v:getP() - зенитный угол в радианах (угол наклона над плоскостью XZ )&lt;br /&gt;
v:getH() - азимутальный угол в радианах (угол в плоскости XZ между проекцией вектора на эту плоскость и осью Z)&lt;br /&gt;
setHP - соответственно для установки этих значений&lt;br /&gt;
v1:align() - выравнивает вектор вдоль оси x или z и нормирует его. Значение по y игнорируется. &lt;br /&gt;
             В итоге всегда возвращается одно из четырёх значений ([1,0,0], [-1,0,0], [0,0,1], [0,0,-1])&lt;br /&gt;
v4:mad(v1,v2,v3) -- бешеная операция =) умножить почленно второе на третье и сложить с &lt;br /&gt;
                    первым, т.е. v4 = v1 + v2*v3 (название операции mad == mul + add)&lt;br /&gt;
v1:inertion(v2, number) -- v1 = v2 + (v1-v2)*number (тоже почленно)&lt;br /&gt;
v1:similar(v2, number) -- сравнение векторов на равенство с погрешностью number. Выдаёт 1 или 0&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local v1 = vector()&lt;br /&gt;
v1:set(1,2,3)&lt;br /&gt;
local v2 = vector():set(4,5,6)&lt;br /&gt;
local dist = v1:distance_to(v2)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class fcolor==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class fcolor {&lt;br /&gt;
    property a; --альфа-цвет, отвечающий за прозрачность.&lt;br /&gt;
    property b; --blue-цвет, отвечающий за синий оттенок цвета.&lt;br /&gt;
    property g; --green-цвет, отвечающий за зелёный оттенок цвета.&lt;br /&gt;
    property r; --red-цвет, отвечающий за красный оттенок цвет.&lt;br /&gt;
&lt;br /&gt;
    fcolor ();&lt;br /&gt;
&lt;br /&gt;
    function set(number, number, number, number); --установка цвета (r,g,b,a)&lt;br /&gt;
    function set(const fcolor&amp;amp;); --установка цвета по уже имеющемуся классу &amp;quot;fcolor()&amp;quot;&lt;br /&gt;
    function set(number); -- не знаю. предполагаю, что есть несколько заранее подготовленных цветов с индексами для каждого.&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Например:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
color = fcolor()&lt;br /&gt;
color.a = 50&lt;br /&gt;
color.g = 255&lt;br /&gt;
color.r = 100&lt;br /&gt;
color.b = 50&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
или&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
color = fcolor()&lt;br /&gt;
color:set(100,255,50,50)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class hit==&lt;br /&gt;
Бывают случаи, при которых необходимо нанести некоторый урон неписю или мобу, при этом имитировав попадание в него. Для этого существует метод класса game_object:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function hit(hit*);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Чтобы использовать этот метод, нужно указать аргументы. В данном случае имеет объект другого класса - hit. Вот его описание:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class hit {&lt;br /&gt;
    const burn = 0; --здесь идут константы типов урона, используемых в свойстве &amp;quot;type&amp;quot;. Все мы прекрасно знаем, что означает каждый.&lt;br /&gt;
    const chemical_burn = 6;&lt;br /&gt;
    const dummy = 11;&lt;br /&gt;
    const explosion = 7;&lt;br /&gt;
    const fire_wound = 8;&lt;br /&gt;
    const radiation = 4;&lt;br /&gt;
    const shock = 1;&lt;br /&gt;
    const strike = 2;&lt;br /&gt;
    const telepatic = 5;&lt;br /&gt;
    const wound = 3;&lt;br /&gt;
&lt;br /&gt;
    property direction; --дирекция урона&lt;br /&gt;
    property draftsman; --обозначает персонажа, нанёсшего урон.&lt;br /&gt;
    property impulse; --импульс урона&lt;br /&gt;
    property power; --сила урона&lt;br /&gt;
    property type; -- тип урона (см. константы)&lt;br /&gt;
&lt;br /&gt;
    hit ();&lt;br /&gt;
    hit (const hit*);&lt;br /&gt;
&lt;br /&gt;
    function bone(string); --метод с указанием кости урона&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
hit = hit() -- создание объекта класса hit&lt;br /&gt;
hit.direction = vector():set(1,0,0) --дирекция по оси x&lt;br /&gt;
hit.draftsman = db.actor --нанёс урон актор&lt;br /&gt;
hit.impulse = 600 --импульс&lt;br /&gt;
hit.power = 1.45 --хит&lt;br /&gt;
hit.type = 2 --тип урона - выстрел&lt;br /&gt;
hit:bone(&amp;quot;bip01_head&amp;quot;) -- удар приходится на голову&lt;br /&gt;
obj:hit(hit)&lt;br /&gt;
-- наносим урон&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==&amp;quot;Функции времени&amp;quot;==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
time_global() -- реальное время (в миллисекундах) с начала запуска программы&lt;br /&gt;
game.time() -- игровое время (в игровых миллисекундах) с начала игры (т.е. с начала прохождения игры)&lt;br /&gt;
level.get_time_days() -- день месяца по игровому времени&lt;br /&gt;
level.get_time_hours() -- час текущего игрового дня&lt;br /&gt;
level.get_time_minutes() -- минута текущего игрового часа&lt;br /&gt;
&lt;br /&gt;
level.get_time_factor() -- возвращает отношение скорости течения игрового времени к скорости реального &lt;br /&gt;
                        --(game_time_speed / real_time_speed)&lt;br /&gt;
level.set_time_factor(number) -- устанавливает это отношение&lt;br /&gt;
&lt;br /&gt;
game.get_game_time() -- возвращает игровое время в виде объекта класса CTime. Класс CTime я опишу подробно &lt;br /&gt;
                     -- как-нибудь потом, а пока опишу только пару его методов.&lt;br /&gt;
конструктор. Вызывается через пространство имён game&lt;br /&gt;
game.CTime()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Дефолтовые значения===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
year, month, day = 1 &lt;br /&gt;
hour, min, sek, ms = 0&lt;br /&gt;
CTime.set(year, month, day, hour, min, sek, ms) -- устанавливает все данные о времени&lt;br /&gt;
метод CTime.get описан так:&lt;br /&gt;
function get(number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;);&lt;br /&gt;
что наводит на мысль о семи аргументах. однако с точки зрения Lua этот метод не принимает аргументов, зато возвращает семь значений. &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
====Пример использования обоих методов:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local t = game.CTime() -- создания объекта с дефолтовыми значнеиями&lt;br /&gt;
t:set(2009, 7, 11, 8, 11, 22, 333) -- установили все значения&lt;br /&gt;
&lt;br /&gt;
local y,m,d,h,min,sec,ms = t:get() -- получили все значения&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
===Класс CTime (неразобранный)===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class CTime {&lt;br /&gt;
const DateToDay = 0;&lt;br /&gt;
const DateToMonth = 1;&lt;br /&gt;
const DateToYear = 2;&lt;br /&gt;
const TimeToHours = 0;&lt;br /&gt;
const TimeToMilisecs = 3;&lt;br /&gt;
const TimeToMinutes = 1;&lt;br /&gt;
const TimeToSeconds = 2;&lt;br /&gt;
&lt;br /&gt;
CTime ();&lt;br /&gt;
CTime (const CTime&amp;amp;);&lt;br /&gt;
&lt;br /&gt;
function sub(CTime*);&lt;br /&gt;
function timeToString(number);&lt;br /&gt;
function dateToString(number);&lt;br /&gt;
operator ==(const CTime&amp;amp;, CTime);&lt;br /&gt;
function get(number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;);&lt;br /&gt;
function set(number, number, number, number, number, number, number);&lt;br /&gt;
function setHMSms(number, number, number, number);&lt;br /&gt;
function diffSec(CTime*);&lt;br /&gt;
operator &amp;lt;(const CTime&amp;amp;, CTime);&lt;br /&gt;
operator +(CTime&amp;amp;, CTime);&lt;br /&gt;
operator &amp;gt;=(const CTime&amp;amp;, CTime);&lt;br /&gt;
function setHMS(number, number, number);&lt;br /&gt;
operator &amp;gt;(const CTime&amp;amp;, CTime);&lt;br /&gt;
operator -(CTime&amp;amp;, CTime);&lt;br /&gt;
operator &amp;lt;=(const CTime&amp;amp;, CTime);&lt;br /&gt;
function add(CTime*);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
Статья создана: [[Участник:malandrinus|malandrinus]], [[Участник:IQDDD|IQDDD]], [[Участник:меченый|меченый]]&lt;/div&gt;</summary>
		<author><name>95.25.99.189</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC</id>
		<title>Справочник по функциям и классам</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC"/>
				<updated>2009-07-11T22:31:35Z</updated>
		
		<summary type="html">&lt;p&gt;95.25.99.189: /* Авторы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Посты с форума AMK&lt;br /&gt;
&lt;br /&gt;
==Структура Lua_help==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;C++ class [класс] {&lt;br /&gt;
     const [описание1] = [константа1];&lt;br /&gt;
     const [описание2] = [константа2];&lt;br /&gt;
     ...&lt;br /&gt;
     [константы заменяют описания при вызове методов классов];&lt;br /&gt;
     &lt;br /&gt;
     property [свойство1];&lt;br /&gt;
     property [свойство2];&lt;br /&gt;
     ...&lt;br /&gt;
[свойства (property) - это характеристика какого-либо класса, которая может подвергаться мат. операциям, слияниям, присвояниям и пр.&lt;br /&gt;
     читаются через точку: obj.health];&lt;br /&gt;
&lt;br /&gt;
     [глобальная(-ые) функция(-ии), которой вызывается класс];&lt;br /&gt;
     function [метод1] ([аргумент 1 функции 1], [аргумент 2 функции 1]...);&lt;br /&gt;
     function [метод2] ([аргумент 1 функции2]...);&lt;br /&gt;
             ...&lt;br /&gt;
     [методы - это специальные функции, выполняющие операции с классами и возвращающие значения после операций над классами.&lt;br /&gt;
     вызываются через двоеточие: obj:add_animation(...)];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Создание своего класса==&lt;br /&gt;
Свой класс можно добавить так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class &amp;quot;my_cool_class&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь &amp;quot;my_cool_class&amp;quot; - имя моего нового класса. Записывается в кавычках, т.е. это строка.&lt;br /&gt;
&lt;br /&gt;
Потом можно добавлять к этому классу свои методы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- это специальный метод - конструктор. Будет вызван при создании класса.&lt;br /&gt;
function my_cool_class:__init(num)&lt;br /&gt;
    self.my_param = num -- добавили в свой класс переменную&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- обычный метод&lt;br /&gt;
function my_cool_class:cool_method_of_my_class()&lt;br /&gt;
    get_console():execute(&amp;quot;lua_bind_in_action_&amp;quot;..self.my_param)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- деструктор, вызывается при сборке объекта сборщиком мусора. Аргументов не имеет (кроме скрытого self. об этом см. далее)&lt;br /&gt;
function my_cool_class:__finalize()&lt;br /&gt;
    get_console():execute(&amp;quot;good_by_&amp;quot;..self.my_param)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Потом можно создавать экземпляры своего класса, вызывать их методы и пр.:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local obj1 = my_cool_class(1) -- здесь создаётся новый объект. При этом вызывается конструктор и &lt;br /&gt;
                              -- ему передаются аргументы этого вызова (в данном случае число 1).&lt;br /&gt;
local obj2 = my_cool_class(4)&lt;br /&gt;
obj1:cool_method_of_my_class()&lt;br /&gt;
obj2:cool_method_of_my_class()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как только объект становится ненужным (т.е. на него больше нет ссылок) он удаляется сборщиком мусора. При этом вызывается его метод __finalize&lt;br /&gt;
&lt;br /&gt;
При чём здесь self.&lt;br /&gt;
self - это скрытый первый аргумент. Конструкция вида:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function class_name:fun_name(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
на самом деле эквивалентна конструкции &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function class_name.fun_name(self, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Обратите внимание на двоеточие в первом случае и точку во втором.&amp;lt;br&amp;gt;&lt;br /&gt;
При вызове метода конструкция вида:&lt;br /&gt;
&lt;br /&gt;
object_name:fun_name(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
эквивалентна конструкции&lt;br /&gt;
&lt;br /&gt;
object_name.fun_name(object_name, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Это означает, что в качестве self как правило передаётся сам же объект. &amp;quot;Как правило&amp;quot; - это потому, что можно в принципе передать что-то другое. Но лучше этого соглашения не нарушать.&lt;br /&gt;
&lt;br /&gt;
Всё это здорово, но какая от этого польза? Ну сделал я свой класс, и что с ним делать?&lt;br /&gt;
&lt;br /&gt;
В общем, классы - это неплохое средство организации своего кода. Владеющие объектно-ориентированным подходом найдут это расширение весьма удобным. В частности такие, ни к чему не привязанные классы, в скриптах сталкера используются в некоторых местах. Однако, настоящая сила этой технологии не в этом. С помощью этой технологии можно расширять классы, экспортированные в Lua со стороны движка игры. Об этом пойдет речь в следующей части.&lt;br /&gt;
&lt;br /&gt;
==Наследование от экспортированных классов==&lt;br /&gt;
Итак, кроме создания собственных классов технология Luabind позволяет создавать класы на основе уже существующих. Это реализовано в виде своеобразного наследования. Делается это с помощью следующей конструкции:&lt;br /&gt;
&lt;br /&gt;
'''class &amp;quot;my_derived_class&amp;quot; (base_class)'''&lt;br /&gt;
&lt;br /&gt;
Здесь:&lt;br /&gt;
&amp;quot;my_derived_class&amp;quot; как и раньше - это имя нового класса.&amp;lt;br&amp;gt;&lt;br /&gt;
base_class - это уже существующий класс, который будет базовым для вновь созданного. Имя выбрано произвольно, но подразумевается, что такой класс экспортирован и предназначен для наследования.&amp;lt;br&amp;gt;&lt;br /&gt;
Далеко не любой класс из экспортированных со стороны хост-приложения можно использовать в качестве базового. На стороне хост-приложения должен быть создан специальный класс-обёртка. Если его нет, то ничего хорошего не выйдет. Скорее всего при попытке использовать унаследованный класс в Lua будут малопонятные проблемы и вылеты, так что надо знать совершенно точно, можно ли от конкретного класса наследовать.&amp;lt;br&amp;gt;&lt;br /&gt;
Вопрос, какой глубины может быть наследование, т.е. можно ли наследовать от производного класса, мне пока до конца не ясен. С другой стороны, в этом практически нет необходимости.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итак после выполнения указанной конструкции появляется класс my_derived_class, который является копией класса base_class. У него есть в точности те же методы, что и у его базового класса. Пока от этого мало толку. Но теперь можно переопределить методы нашего класса, изменив таким образом его поведение. Делается это так же, как и ранее, но с некоторыми дополнениями.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- конструктор&lt;br /&gt;
function my_derived_class:__init(num) super(num)&lt;br /&gt;
end&lt;br /&gt;
-- обычный метод&lt;br /&gt;
function my_cool_class:some_method(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
    base_class.some_method(self, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
-- деструктор&lt;br /&gt;
function my_cool_class:__finalize()&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На что стОит обратить внимание.&amp;lt;br&amp;gt;&lt;br /&gt;
Во-первых, конструкция super(num). Это вызов конструктора базового класса.&amp;lt;br&amp;gt;&lt;br /&gt;
Во-вторых, для вызова метода базового класса из метода унаследованного используется другая конструкция base_class.some_method(self, ). Здесь надо использовать альтернативную форму вызова метода (с точкой и явным указанием первого аргумента self).&amp;lt;br&amp;gt;&lt;br /&gt;
Наконец, метод __finalize() не требует вызова этого же метода для базового класса, поскольку тот будет вызван автоматически при удалении объекта сборщиком мусора.&lt;br /&gt;
&lt;br /&gt;
Собственно и всё. Теперь можно пользоваться созданным классом: создавать объекты этого класса, вызывать их методы и пр. Здесь уже всё зависит от конкретных целей и требует знания конкретных классов.&lt;br /&gt;
&lt;br /&gt;
==сlass alife_simulator==&lt;br /&gt;
alife_simulator - класс для управления серверными объектами. В игре существует всего один экземпляр такого класса, и получить его можно с помощью вызова глобальной функции alife().&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
level_name(level_id) -- возвращает имя уровня по его id&lt;br /&gt;
create_ammo(&amp;lt;имя секции патронов&amp;gt;, position, lvid, gvid, id, amount) - создание пачек с патронами&lt;br /&gt;
create(&amp;lt;имя секции объекта&amp;gt;, position, lvid, gvid, id) -- создание объектов в инвентаре&lt;br /&gt;
create(&amp;lt;имя секции объекта&amp;gt;, position, lvid, gvid) -- создание объектов на уровне&lt;br /&gt;
во всех функция создания объектов&lt;br /&gt;
position - объект класса vector. Не может быть nil, иначе вылет&lt;br /&gt;
lvid - level vertex id&lt;br /&gt;
gvid - game vertex id&lt;br /&gt;
id - это куда спавним. Если в инвентарь, то указываем id непися или ноль (для актора)&lt;br /&gt;
release(sobj, boolean) -- удаляет объект sobj. Зачем второй булевский аргумент - не известно. &lt;br /&gt;
                          Во всех примерах он либо отсутствует, либо установлен в true&lt;br /&gt;
object(id) -- возвращает серверный объект по его id. Если не нашёл nil&lt;br /&gt;
story_object(sid) -- возвращает серверный объект по его story id. Если не нашёл nil&lt;br /&gt;
actor() -- возвращает серверный объект актора&lt;br /&gt;
set_switch_online(id, boolean) -- переводит в онлайн объект с идентификатором id&lt;br /&gt;
set_switch_offline(id, boolean) -- то же , но в онлайн&lt;br /&gt;
dont_has_info(const number&amp;amp;, string); -- проверка на Неполученный инфопоршень(db.actor:dont_has_info(&amp;quot;infoportion&amp;quot;) &lt;br /&gt;
                                      -- или alife():actor():dont_has_info(&amp;quot;infoportion&amp;quot;)).&lt;br /&gt;
has_info - противоположная&lt;br /&gt;
&lt;br /&gt;
предположительно:&lt;br /&gt;
switch_distance() -- радиус переключения в оффлайн?&lt;br /&gt;
switch_distance(number) -- установка этого радиуса?&lt;br /&gt;
level_id() -- текущий номер уровня ?&lt;br /&gt;
object(string) -- получение объекта оп его имени. Не помню точно, что за имя.&lt;br /&gt;
object(number, boolean) - то же, что и object(number)? на что влияет второй аргумент?&lt;br /&gt;
valid_object_id(number) -- проверка наличия объекта по id?&lt;br /&gt;
alife():create( &amp;lt;индекс объекта в all.spawn&amp;gt; ) -- &lt;br /&gt;
spawn_id(number) -- индекс объекта в all.spawn для объекта с заданным id ?&lt;br /&gt;
&lt;br /&gt;
неизвестно:&lt;br /&gt;
add_out_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
set_interactive(number, boolean);&lt;br /&gt;
add_in_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
function remove_in_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
remove_out_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
kill_entity(cse_alife_monster_abstract*, const number&amp;amp;, cse_alife_schedulable*);&lt;br /&gt;
kill_entity(alife_simulator*, cse_alife_monster_abstract*, const number&amp;amp;);&lt;br /&gt;
kill_entity(alife_simulator*, cse_alife_monster_abstract*);&lt;br /&gt;
has_info(const number&amp;amp;, string);&lt;br /&gt;
remove_all_restrictions(number, const enum RestrictionSpace::ERestrictorTypes&amp;amp;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local sim = alife() -- получаем сам объект класса alife_simulator&lt;br /&gt;
local sactor = sim:actor() -- получаем серверный объект для актора&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class vector==&lt;br /&gt;
vector - вспомогательный класс, содержащий три координаты, и позволяющий выполнять с ними различные манипуляции. Объекты класса vector являются аргументами многих функций и возвращаются многими функциями. См. например выше про метод create класса alife_simulator. Отдельный объект класса вектор создаётся вызовом глобальной функции vector(). При создании имеет координаты [0,0,0].&lt;br /&gt;
&lt;br /&gt;
===Список методов класса vector===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
v:set_length(number) - оставить направление, изменить длину&lt;br /&gt;
v:normalize(); - сделать длину единичной&lt;br /&gt;
&lt;br /&gt;
v:magnitude() -- длина вектора v&lt;br /&gt;
v1:distance_to(v2) -- расстояние между v1 и v2&lt;br /&gt;
v1:distance_to_sqr(v2) -- квадрат расстояния между v1 и v2&lt;br /&gt;
v1:crossproduct(v2) -- векторное произведение. Возвращает вектор&lt;br /&gt;
v1:dotproduct(v2) -- скалярное произведение. Возвращает число&lt;br /&gt;
v:sub(number); -- вычесть из каждого компонента v число number&lt;br /&gt;
v1:sub(v2); -- вычесть почленно вектор v2 из v1 и поместить в v1&lt;br /&gt;
v1:sub(v2, v3) -- вычесть из v2 - v3 и поместить в v1&lt;br /&gt;
аналогично:&lt;br /&gt;
add - почленное сложение&lt;br /&gt;
mul - почленное умножение&lt;br /&gt;
div - почленное деление&lt;br /&gt;
max/min - почленный максимум/минимум&lt;br /&gt;
v1:clamp(v2) -- почленное обрезание первого вторым&lt;br /&gt;
average -- почленное среднее&lt;br /&gt;
invert -- почленная инверсия знака&lt;br /&gt;
&lt;br /&gt;
v1:abs(v2); -- копирует почленно положительные компоненты в v1 из v2&lt;br /&gt;
lerp(v1, v2, number) -- линейная интерполяция между двумя векторами&lt;br /&gt;
-- если number больше 1, то выходит за них - экстраполяция&lt;br /&gt;
&lt;br /&gt;
v1:reflect(v2, v3) - должно быть отражение одного вектора от плоскости, определяемой другим. Не проверял&lt;br /&gt;
v1:slide(v2, v3); - вероятно, проекция одного вектора на плоскость, определяемую другим. Не уверен&lt;br /&gt;
v1:distance_to_xz(v2) - учитывая, что плоскость XZ - это плоскость параллельная земле, то возможно это &lt;br /&gt;
                        длина проекции на землю пути от точки до точки. Не проверял&lt;br /&gt;
&lt;br /&gt;
v:getP() - зенитный угол в радианах (угол наклона над плоскостью XZ )&lt;br /&gt;
v:getH() - азимутальный угол в радианах (угол в плоскости XZ между проекцией вектора на эту плоскость и осью Z)&lt;br /&gt;
setHP - соответственно для установки этих значений&lt;br /&gt;
v1:align() - выравнивает вектор вдоль оси x или z и нормирует его. Значение по y игнорируется. &lt;br /&gt;
             В итоге всегда возвращается одно из четырёх значений ([1,0,0], [-1,0,0], [0,0,1], [0,0,-1])&lt;br /&gt;
v4:mad(v1,v2,v3) -- бешеная операция =) умножить почленно второе на третье и сложить с &lt;br /&gt;
                    первым, т.е. v4 = v1 + v2*v3 (название операции mad == mul + add)&lt;br /&gt;
v1:inertion(v2, number) -- v1 = v2 + (v1-v2)*number (тоже почленно)&lt;br /&gt;
v1:similar(v2, number) -- сравнение векторов на равенство с погрешностью number. Выдаёт 1 или 0&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local v1 = vector()&lt;br /&gt;
v1:set(1,2,3)&lt;br /&gt;
local v2 = vector():set(4,5,6)&lt;br /&gt;
local dist = v1:distance_to(v2)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class fcolor==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class fcolor {&lt;br /&gt;
    property a; --альфа-цвет, отвечающий за прозрачность.&lt;br /&gt;
    property b; --blue-цвет, отвечающий за синий оттенок цвета.&lt;br /&gt;
    property g; --green-цвет, отвечающий за зелёный оттенок цвета.&lt;br /&gt;
    property r; --red-цвет, отвечающий за красный оттенок цвет.&lt;br /&gt;
&lt;br /&gt;
    fcolor ();&lt;br /&gt;
&lt;br /&gt;
    function set(number, number, number, number); --установка цвета (r,g,b,a)&lt;br /&gt;
    function set(const fcolor&amp;amp;); --установка цвета по уже имеющемуся классу &amp;quot;fcolor()&amp;quot;&lt;br /&gt;
    function set(number); -- не знаю. предполагаю, что есть несколько заранее подготовленных цветов с индексами для каждого.&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Например:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
color = fcolor()&lt;br /&gt;
color.a = 50&lt;br /&gt;
color.g = 255&lt;br /&gt;
color.r = 100&lt;br /&gt;
color.b = 50&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
или&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
color = fcolor()&lt;br /&gt;
color:set(100,255,50,50)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class hit==&lt;br /&gt;
Бывают случаи, при которых необходимо нанести некоторый урон неписю или мобу, при этом имитировав попадание в него. Для этого существует метод класса game_object:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function hit(hit*);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Чтобы использовать этот метод, нужно указать аргументы. В данном случае имеет объект другого класса - hit. Вот его описание:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class hit {&lt;br /&gt;
    const burn = 0; --здесь идут константы типов урона, используемых в свойстве &amp;quot;type&amp;quot;. Все мы прекрасно знаем, что означает каждый.&lt;br /&gt;
    const chemical_burn = 6;&lt;br /&gt;
    const dummy = 11;&lt;br /&gt;
    const explosion = 7;&lt;br /&gt;
    const fire_wound = 8;&lt;br /&gt;
    const radiation = 4;&lt;br /&gt;
    const shock = 1;&lt;br /&gt;
    const strike = 2;&lt;br /&gt;
    const telepatic = 5;&lt;br /&gt;
    const wound = 3;&lt;br /&gt;
&lt;br /&gt;
    property direction; --дирекция урона&lt;br /&gt;
    property draftsman; --обозначает персонажа, нанёсшего урон.&lt;br /&gt;
    property impulse; --импульс урона&lt;br /&gt;
    property power; --сила урона&lt;br /&gt;
    property type; -- тип урона (см. константы)&lt;br /&gt;
&lt;br /&gt;
    hit ();&lt;br /&gt;
    hit (const hit*);&lt;br /&gt;
&lt;br /&gt;
    function bone(string); --метод с указанием кости урона&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
hit = hit() -- создание объекта класса hit&lt;br /&gt;
hit.direction = vector():set(1,0,0) --дирекция по оси x&lt;br /&gt;
hit.draftsman = db.actor --нанёс урон актор&lt;br /&gt;
hit.impulse = 600 --импульс&lt;br /&gt;
hit.power = 1.45 --хит&lt;br /&gt;
hit.type = 2 --тип урона - выстрел&lt;br /&gt;
hit:bone(&amp;quot;bip01_head&amp;quot;) -- удар приходится на голову&lt;br /&gt;
obj:hit(hit)&lt;br /&gt;
-- наносим урон&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==&amp;quot;Функции времени&amp;quot;==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
time_global() -- реальное время (в миллисекундах) с начала запуска программы&lt;br /&gt;
game.time() -- игровое время (в игровых миллисекундах) с начала игры (т.е. с начала прохождения игры)&lt;br /&gt;
level.get_time_days() -- день месяца по игровому времени&lt;br /&gt;
level.get_time_hours() -- час текущего игрового дня&lt;br /&gt;
level.get_time_minutes() -- минута текущего игрового часа&lt;br /&gt;
&lt;br /&gt;
level.get_time_factor() -- возвращает отношение скорости течения игрового времени к скорости реального &lt;br /&gt;
                        --(game_time_speed / real_time_speed)&lt;br /&gt;
level.set_time_factor(number) -- устанавливает это отношение&lt;br /&gt;
&lt;br /&gt;
game.get_game_time() -- возвращает игровое время в виде объекта класса CTime. Класс CTime я опишу подробно &lt;br /&gt;
                     -- как-нибудь потом, а пока опишу только пару его методов.&lt;br /&gt;
конструктор. Вызывается через пространство имён game&lt;br /&gt;
game.CTime()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Дефолтовые значения===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
year, month, day = 1 &lt;br /&gt;
hour, min, sek, ms = 0&lt;br /&gt;
CTime.set(year, month, day, hour, min, sek, ms) -- устанавливает все данные о времени&lt;br /&gt;
метод CTime.get описан так:&lt;br /&gt;
function get(number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;);&lt;br /&gt;
что наводит на мысль о семи аргументах. однако с точки зрения Lua этот метод не принимает аргументов, зато возвращает семь значений. &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
====Пример использования обоих методов:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local t = game.CTime() -- создания объекта с дефолтовыми значнеиями&lt;br /&gt;
t:set(2009, 7, 11, 8, 11, 22, 333) -- установили все значения&lt;br /&gt;
&lt;br /&gt;
local y,m,d,h,min,sec,ms = t:get() -- получили все значения&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
===Класс CTime (неразобранный)===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class CTime {&lt;br /&gt;
const DateToDay = 0;&lt;br /&gt;
const DateToMonth = 1;&lt;br /&gt;
const DateToYear = 2;&lt;br /&gt;
const TimeToHours = 0;&lt;br /&gt;
const TimeToMilisecs = 3;&lt;br /&gt;
const TimeToMinutes = 1;&lt;br /&gt;
const TimeToSeconds = 2;&lt;br /&gt;
&lt;br /&gt;
CTime ();&lt;br /&gt;
CTime (const CTime&amp;amp;);&lt;br /&gt;
&lt;br /&gt;
function sub(CTime*);&lt;br /&gt;
function timeToString(number);&lt;br /&gt;
function dateToString(number);&lt;br /&gt;
operator ==(const CTime&amp;amp;, CTime);&lt;br /&gt;
function get(number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;);&lt;br /&gt;
function set(number, number, number, number, number, number, number);&lt;br /&gt;
function setHMSms(number, number, number, number);&lt;br /&gt;
function diffSec(CTime*);&lt;br /&gt;
operator &amp;lt;(const CTime&amp;amp;, CTime);&lt;br /&gt;
operator +(CTime&amp;amp;, CTime);&lt;br /&gt;
operator &amp;gt;=(const CTime&amp;amp;, CTime);&lt;br /&gt;
function setHMS(number, number, number);&lt;br /&gt;
operator &amp;gt;(const CTime&amp;amp;, CTime);&lt;br /&gt;
operator -(CTime&amp;amp;, CTime);&lt;br /&gt;
operator &amp;lt;=(const CTime&amp;amp;, CTime);&lt;br /&gt;
function add(CTime*);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
Статья создана:&lt;br /&gt;
 &lt;br /&gt;
[[Участник:malandrinus|malandrinus]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Участник:IQDDD|IQDDD]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Участник:меченый|меченый]]&lt;/div&gt;</summary>
		<author><name>95.25.99.189</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC</id>
		<title>Справочник по функциям и классам</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC"/>
				<updated>2009-07-11T22:31:24Z</updated>
		
		<summary type="html">&lt;p&gt;95.25.99.189: /* Авторы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Посты с форума AMK&lt;br /&gt;
&lt;br /&gt;
==Структура Lua_help==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;C++ class [класс] {&lt;br /&gt;
     const [описание1] = [константа1];&lt;br /&gt;
     const [описание2] = [константа2];&lt;br /&gt;
     ...&lt;br /&gt;
     [константы заменяют описания при вызове методов классов];&lt;br /&gt;
     &lt;br /&gt;
     property [свойство1];&lt;br /&gt;
     property [свойство2];&lt;br /&gt;
     ...&lt;br /&gt;
[свойства (property) - это характеристика какого-либо класса, которая может подвергаться мат. операциям, слияниям, присвояниям и пр.&lt;br /&gt;
     читаются через точку: obj.health];&lt;br /&gt;
&lt;br /&gt;
     [глобальная(-ые) функция(-ии), которой вызывается класс];&lt;br /&gt;
     function [метод1] ([аргумент 1 функции 1], [аргумент 2 функции 1]...);&lt;br /&gt;
     function [метод2] ([аргумент 1 функции2]...);&lt;br /&gt;
             ...&lt;br /&gt;
     [методы - это специальные функции, выполняющие операции с классами и возвращающие значения после операций над классами.&lt;br /&gt;
     вызываются через двоеточие: obj:add_animation(...)];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Создание своего класса==&lt;br /&gt;
Свой класс можно добавить так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class &amp;quot;my_cool_class&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь &amp;quot;my_cool_class&amp;quot; - имя моего нового класса. Записывается в кавычках, т.е. это строка.&lt;br /&gt;
&lt;br /&gt;
Потом можно добавлять к этому классу свои методы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- это специальный метод - конструктор. Будет вызван при создании класса.&lt;br /&gt;
function my_cool_class:__init(num)&lt;br /&gt;
    self.my_param = num -- добавили в свой класс переменную&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- обычный метод&lt;br /&gt;
function my_cool_class:cool_method_of_my_class()&lt;br /&gt;
    get_console():execute(&amp;quot;lua_bind_in_action_&amp;quot;..self.my_param)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- деструктор, вызывается при сборке объекта сборщиком мусора. Аргументов не имеет (кроме скрытого self. об этом см. далее)&lt;br /&gt;
function my_cool_class:__finalize()&lt;br /&gt;
    get_console():execute(&amp;quot;good_by_&amp;quot;..self.my_param)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Потом можно создавать экземпляры своего класса, вызывать их методы и пр.:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local obj1 = my_cool_class(1) -- здесь создаётся новый объект. При этом вызывается конструктор и &lt;br /&gt;
                              -- ему передаются аргументы этого вызова (в данном случае число 1).&lt;br /&gt;
local obj2 = my_cool_class(4)&lt;br /&gt;
obj1:cool_method_of_my_class()&lt;br /&gt;
obj2:cool_method_of_my_class()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как только объект становится ненужным (т.е. на него больше нет ссылок) он удаляется сборщиком мусора. При этом вызывается его метод __finalize&lt;br /&gt;
&lt;br /&gt;
При чём здесь self.&lt;br /&gt;
self - это скрытый первый аргумент. Конструкция вида:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function class_name:fun_name(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
на самом деле эквивалентна конструкции &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function class_name.fun_name(self, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Обратите внимание на двоеточие в первом случае и точку во втором.&amp;lt;br&amp;gt;&lt;br /&gt;
При вызове метода конструкция вида:&lt;br /&gt;
&lt;br /&gt;
object_name:fun_name(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
эквивалентна конструкции&lt;br /&gt;
&lt;br /&gt;
object_name.fun_name(object_name, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Это означает, что в качестве self как правило передаётся сам же объект. &amp;quot;Как правило&amp;quot; - это потому, что можно в принципе передать что-то другое. Но лучше этого соглашения не нарушать.&lt;br /&gt;
&lt;br /&gt;
Всё это здорово, но какая от этого польза? Ну сделал я свой класс, и что с ним делать?&lt;br /&gt;
&lt;br /&gt;
В общем, классы - это неплохое средство организации своего кода. Владеющие объектно-ориентированным подходом найдут это расширение весьма удобным. В частности такие, ни к чему не привязанные классы, в скриптах сталкера используются в некоторых местах. Однако, настоящая сила этой технологии не в этом. С помощью этой технологии можно расширять классы, экспортированные в Lua со стороны движка игры. Об этом пойдет речь в следующей части.&lt;br /&gt;
&lt;br /&gt;
==Наследование от экспортированных классов==&lt;br /&gt;
Итак, кроме создания собственных классов технология Luabind позволяет создавать класы на основе уже существующих. Это реализовано в виде своеобразного наследования. Делается это с помощью следующей конструкции:&lt;br /&gt;
&lt;br /&gt;
'''class &amp;quot;my_derived_class&amp;quot; (base_class)'''&lt;br /&gt;
&lt;br /&gt;
Здесь:&lt;br /&gt;
&amp;quot;my_derived_class&amp;quot; как и раньше - это имя нового класса.&amp;lt;br&amp;gt;&lt;br /&gt;
base_class - это уже существующий класс, который будет базовым для вновь созданного. Имя выбрано произвольно, но подразумевается, что такой класс экспортирован и предназначен для наследования.&amp;lt;br&amp;gt;&lt;br /&gt;
Далеко не любой класс из экспортированных со стороны хост-приложения можно использовать в качестве базового. На стороне хост-приложения должен быть создан специальный класс-обёртка. Если его нет, то ничего хорошего не выйдет. Скорее всего при попытке использовать унаследованный класс в Lua будут малопонятные проблемы и вылеты, так что надо знать совершенно точно, можно ли от конкретного класса наследовать.&amp;lt;br&amp;gt;&lt;br /&gt;
Вопрос, какой глубины может быть наследование, т.е. можно ли наследовать от производного класса, мне пока до конца не ясен. С другой стороны, в этом практически нет необходимости.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итак после выполнения указанной конструкции появляется класс my_derived_class, который является копией класса base_class. У него есть в точности те же методы, что и у его базового класса. Пока от этого мало толку. Но теперь можно переопределить методы нашего класса, изменив таким образом его поведение. Делается это так же, как и ранее, но с некоторыми дополнениями.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- конструктор&lt;br /&gt;
function my_derived_class:__init(num) super(num)&lt;br /&gt;
end&lt;br /&gt;
-- обычный метод&lt;br /&gt;
function my_cool_class:some_method(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
    base_class.some_method(self, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
-- деструктор&lt;br /&gt;
function my_cool_class:__finalize()&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На что стОит обратить внимание.&amp;lt;br&amp;gt;&lt;br /&gt;
Во-первых, конструкция super(num). Это вызов конструктора базового класса.&amp;lt;br&amp;gt;&lt;br /&gt;
Во-вторых, для вызова метода базового класса из метода унаследованного используется другая конструкция base_class.some_method(self, ). Здесь надо использовать альтернативную форму вызова метода (с точкой и явным указанием первого аргумента self).&amp;lt;br&amp;gt;&lt;br /&gt;
Наконец, метод __finalize() не требует вызова этого же метода для базового класса, поскольку тот будет вызван автоматически при удалении объекта сборщиком мусора.&lt;br /&gt;
&lt;br /&gt;
Собственно и всё. Теперь можно пользоваться созданным классом: создавать объекты этого класса, вызывать их методы и пр. Здесь уже всё зависит от конкретных целей и требует знания конкретных классов.&lt;br /&gt;
&lt;br /&gt;
==сlass alife_simulator==&lt;br /&gt;
alife_simulator - класс для управления серверными объектами. В игре существует всего один экземпляр такого класса, и получить его можно с помощью вызова глобальной функции alife().&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
level_name(level_id) -- возвращает имя уровня по его id&lt;br /&gt;
create_ammo(&amp;lt;имя секции патронов&amp;gt;, position, lvid, gvid, id, amount) - создание пачек с патронами&lt;br /&gt;
create(&amp;lt;имя секции объекта&amp;gt;, position, lvid, gvid, id) -- создание объектов в инвентаре&lt;br /&gt;
create(&amp;lt;имя секции объекта&amp;gt;, position, lvid, gvid) -- создание объектов на уровне&lt;br /&gt;
во всех функция создания объектов&lt;br /&gt;
position - объект класса vector. Не может быть nil, иначе вылет&lt;br /&gt;
lvid - level vertex id&lt;br /&gt;
gvid - game vertex id&lt;br /&gt;
id - это куда спавним. Если в инвентарь, то указываем id непися или ноль (для актора)&lt;br /&gt;
release(sobj, boolean) -- удаляет объект sobj. Зачем второй булевский аргумент - не известно. &lt;br /&gt;
                          Во всех примерах он либо отсутствует, либо установлен в true&lt;br /&gt;
object(id) -- возвращает серверный объект по его id. Если не нашёл nil&lt;br /&gt;
story_object(sid) -- возвращает серверный объект по его story id. Если не нашёл nil&lt;br /&gt;
actor() -- возвращает серверный объект актора&lt;br /&gt;
set_switch_online(id, boolean) -- переводит в онлайн объект с идентификатором id&lt;br /&gt;
set_switch_offline(id, boolean) -- то же , но в онлайн&lt;br /&gt;
dont_has_info(const number&amp;amp;, string); -- проверка на Неполученный инфопоршень(db.actor:dont_has_info(&amp;quot;infoportion&amp;quot;) &lt;br /&gt;
                                      -- или alife():actor():dont_has_info(&amp;quot;infoportion&amp;quot;)).&lt;br /&gt;
has_info - противоположная&lt;br /&gt;
&lt;br /&gt;
предположительно:&lt;br /&gt;
switch_distance() -- радиус переключения в оффлайн?&lt;br /&gt;
switch_distance(number) -- установка этого радиуса?&lt;br /&gt;
level_id() -- текущий номер уровня ?&lt;br /&gt;
object(string) -- получение объекта оп его имени. Не помню точно, что за имя.&lt;br /&gt;
object(number, boolean) - то же, что и object(number)? на что влияет второй аргумент?&lt;br /&gt;
valid_object_id(number) -- проверка наличия объекта по id?&lt;br /&gt;
alife():create( &amp;lt;индекс объекта в all.spawn&amp;gt; ) -- &lt;br /&gt;
spawn_id(number) -- индекс объекта в all.spawn для объекта с заданным id ?&lt;br /&gt;
&lt;br /&gt;
неизвестно:&lt;br /&gt;
add_out_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
set_interactive(number, boolean);&lt;br /&gt;
add_in_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
function remove_in_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
remove_out_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
kill_entity(cse_alife_monster_abstract*, const number&amp;amp;, cse_alife_schedulable*);&lt;br /&gt;
kill_entity(alife_simulator*, cse_alife_monster_abstract*, const number&amp;amp;);&lt;br /&gt;
kill_entity(alife_simulator*, cse_alife_monster_abstract*);&lt;br /&gt;
has_info(const number&amp;amp;, string);&lt;br /&gt;
remove_all_restrictions(number, const enum RestrictionSpace::ERestrictorTypes&amp;amp;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local sim = alife() -- получаем сам объект класса alife_simulator&lt;br /&gt;
local sactor = sim:actor() -- получаем серверный объект для актора&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class vector==&lt;br /&gt;
vector - вспомогательный класс, содержащий три координаты, и позволяющий выполнять с ними различные манипуляции. Объекты класса vector являются аргументами многих функций и возвращаются многими функциями. См. например выше про метод create класса alife_simulator. Отдельный объект класса вектор создаётся вызовом глобальной функции vector(). При создании имеет координаты [0,0,0].&lt;br /&gt;
&lt;br /&gt;
===Список методов класса vector===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
v:set_length(number) - оставить направление, изменить длину&lt;br /&gt;
v:normalize(); - сделать длину единичной&lt;br /&gt;
&lt;br /&gt;
v:magnitude() -- длина вектора v&lt;br /&gt;
v1:distance_to(v2) -- расстояние между v1 и v2&lt;br /&gt;
v1:distance_to_sqr(v2) -- квадрат расстояния между v1 и v2&lt;br /&gt;
v1:crossproduct(v2) -- векторное произведение. Возвращает вектор&lt;br /&gt;
v1:dotproduct(v2) -- скалярное произведение. Возвращает число&lt;br /&gt;
v:sub(number); -- вычесть из каждого компонента v число number&lt;br /&gt;
v1:sub(v2); -- вычесть почленно вектор v2 из v1 и поместить в v1&lt;br /&gt;
v1:sub(v2, v3) -- вычесть из v2 - v3 и поместить в v1&lt;br /&gt;
аналогично:&lt;br /&gt;
add - почленное сложение&lt;br /&gt;
mul - почленное умножение&lt;br /&gt;
div - почленное деление&lt;br /&gt;
max/min - почленный максимум/минимум&lt;br /&gt;
v1:clamp(v2) -- почленное обрезание первого вторым&lt;br /&gt;
average -- почленное среднее&lt;br /&gt;
invert -- почленная инверсия знака&lt;br /&gt;
&lt;br /&gt;
v1:abs(v2); -- копирует почленно положительные компоненты в v1 из v2&lt;br /&gt;
lerp(v1, v2, number) -- линейная интерполяция между двумя векторами&lt;br /&gt;
-- если number больше 1, то выходит за них - экстраполяция&lt;br /&gt;
&lt;br /&gt;
v1:reflect(v2, v3) - должно быть отражение одного вектора от плоскости, определяемой другим. Не проверял&lt;br /&gt;
v1:slide(v2, v3); - вероятно, проекция одного вектора на плоскость, определяемую другим. Не уверен&lt;br /&gt;
v1:distance_to_xz(v2) - учитывая, что плоскость XZ - это плоскость параллельная земле, то возможно это &lt;br /&gt;
                        длина проекции на землю пути от точки до точки. Не проверял&lt;br /&gt;
&lt;br /&gt;
v:getP() - зенитный угол в радианах (угол наклона над плоскостью XZ )&lt;br /&gt;
v:getH() - азимутальный угол в радианах (угол в плоскости XZ между проекцией вектора на эту плоскость и осью Z)&lt;br /&gt;
setHP - соответственно для установки этих значений&lt;br /&gt;
v1:align() - выравнивает вектор вдоль оси x или z и нормирует его. Значение по y игнорируется. &lt;br /&gt;
             В итоге всегда возвращается одно из четырёх значений ([1,0,0], [-1,0,0], [0,0,1], [0,0,-1])&lt;br /&gt;
v4:mad(v1,v2,v3) -- бешеная операция =) умножить почленно второе на третье и сложить с &lt;br /&gt;
                    первым, т.е. v4 = v1 + v2*v3 (название операции mad == mul + add)&lt;br /&gt;
v1:inertion(v2, number) -- v1 = v2 + (v1-v2)*number (тоже почленно)&lt;br /&gt;
v1:similar(v2, number) -- сравнение векторов на равенство с погрешностью number. Выдаёт 1 или 0&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local v1 = vector()&lt;br /&gt;
v1:set(1,2,3)&lt;br /&gt;
local v2 = vector():set(4,5,6)&lt;br /&gt;
local dist = v1:distance_to(v2)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class fcolor==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class fcolor {&lt;br /&gt;
    property a; --альфа-цвет, отвечающий за прозрачность.&lt;br /&gt;
    property b; --blue-цвет, отвечающий за синий оттенок цвета.&lt;br /&gt;
    property g; --green-цвет, отвечающий за зелёный оттенок цвета.&lt;br /&gt;
    property r; --red-цвет, отвечающий за красный оттенок цвет.&lt;br /&gt;
&lt;br /&gt;
    fcolor ();&lt;br /&gt;
&lt;br /&gt;
    function set(number, number, number, number); --установка цвета (r,g,b,a)&lt;br /&gt;
    function set(const fcolor&amp;amp;); --установка цвета по уже имеющемуся классу &amp;quot;fcolor()&amp;quot;&lt;br /&gt;
    function set(number); -- не знаю. предполагаю, что есть несколько заранее подготовленных цветов с индексами для каждого.&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Например:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
color = fcolor()&lt;br /&gt;
color.a = 50&lt;br /&gt;
color.g = 255&lt;br /&gt;
color.r = 100&lt;br /&gt;
color.b = 50&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
или&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
color = fcolor()&lt;br /&gt;
color:set(100,255,50,50)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class hit==&lt;br /&gt;
Бывают случаи, при которых необходимо нанести некоторый урон неписю или мобу, при этом имитировав попадание в него. Для этого существует метод класса game_object:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function hit(hit*);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Чтобы использовать этот метод, нужно указать аргументы. В данном случае имеет объект другого класса - hit. Вот его описание:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class hit {&lt;br /&gt;
    const burn = 0; --здесь идут константы типов урона, используемых в свойстве &amp;quot;type&amp;quot;. Все мы прекрасно знаем, что означает каждый.&lt;br /&gt;
    const chemical_burn = 6;&lt;br /&gt;
    const dummy = 11;&lt;br /&gt;
    const explosion = 7;&lt;br /&gt;
    const fire_wound = 8;&lt;br /&gt;
    const radiation = 4;&lt;br /&gt;
    const shock = 1;&lt;br /&gt;
    const strike = 2;&lt;br /&gt;
    const telepatic = 5;&lt;br /&gt;
    const wound = 3;&lt;br /&gt;
&lt;br /&gt;
    property direction; --дирекция урона&lt;br /&gt;
    property draftsman; --обозначает персонажа, нанёсшего урон.&lt;br /&gt;
    property impulse; --импульс урона&lt;br /&gt;
    property power; --сила урона&lt;br /&gt;
    property type; -- тип урона (см. константы)&lt;br /&gt;
&lt;br /&gt;
    hit ();&lt;br /&gt;
    hit (const hit*);&lt;br /&gt;
&lt;br /&gt;
    function bone(string); --метод с указанием кости урона&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
hit = hit() -- создание объекта класса hit&lt;br /&gt;
hit.direction = vector():set(1,0,0) --дирекция по оси x&lt;br /&gt;
hit.draftsman = db.actor --нанёс урон актор&lt;br /&gt;
hit.impulse = 600 --импульс&lt;br /&gt;
hit.power = 1.45 --хит&lt;br /&gt;
hit.type = 2 --тип урона - выстрел&lt;br /&gt;
hit:bone(&amp;quot;bip01_head&amp;quot;) -- удар приходится на голову&lt;br /&gt;
obj:hit(hit)&lt;br /&gt;
-- наносим урон&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==&amp;quot;Функции времени&amp;quot;==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
time_global() -- реальное время (в миллисекундах) с начала запуска программы&lt;br /&gt;
game.time() -- игровое время (в игровых миллисекундах) с начала игры (т.е. с начала прохождения игры)&lt;br /&gt;
level.get_time_days() -- день месяца по игровому времени&lt;br /&gt;
level.get_time_hours() -- час текущего игрового дня&lt;br /&gt;
level.get_time_minutes() -- минута текущего игрового часа&lt;br /&gt;
&lt;br /&gt;
level.get_time_factor() -- возвращает отношение скорости течения игрового времени к скорости реального &lt;br /&gt;
                        --(game_time_speed / real_time_speed)&lt;br /&gt;
level.set_time_factor(number) -- устанавливает это отношение&lt;br /&gt;
&lt;br /&gt;
game.get_game_time() -- возвращает игровое время в виде объекта класса CTime. Класс CTime я опишу подробно &lt;br /&gt;
                     -- как-нибудь потом, а пока опишу только пару его методов.&lt;br /&gt;
конструктор. Вызывается через пространство имён game&lt;br /&gt;
game.CTime()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Дефолтовые значения===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
year, month, day = 1 &lt;br /&gt;
hour, min, sek, ms = 0&lt;br /&gt;
CTime.set(year, month, day, hour, min, sek, ms) -- устанавливает все данные о времени&lt;br /&gt;
метод CTime.get описан так:&lt;br /&gt;
function get(number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;);&lt;br /&gt;
что наводит на мысль о семи аргументах. однако с точки зрения Lua этот метод не принимает аргументов, зато возвращает семь значений. &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
====Пример использования обоих методов:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local t = game.CTime() -- создания объекта с дефолтовыми значнеиями&lt;br /&gt;
t:set(2009, 7, 11, 8, 11, 22, 333) -- установили все значения&lt;br /&gt;
&lt;br /&gt;
local y,m,d,h,min,sec,ms = t:get() -- получили все значения&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
===Класс CTime (неразобранный)===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class CTime {&lt;br /&gt;
const DateToDay = 0;&lt;br /&gt;
const DateToMonth = 1;&lt;br /&gt;
const DateToYear = 2;&lt;br /&gt;
const TimeToHours = 0;&lt;br /&gt;
const TimeToMilisecs = 3;&lt;br /&gt;
const TimeToMinutes = 1;&lt;br /&gt;
const TimeToSeconds = 2;&lt;br /&gt;
&lt;br /&gt;
CTime ();&lt;br /&gt;
CTime (const CTime&amp;amp;);&lt;br /&gt;
&lt;br /&gt;
function sub(CTime*);&lt;br /&gt;
function timeToString(number);&lt;br /&gt;
function dateToString(number);&lt;br /&gt;
operator ==(const CTime&amp;amp;, CTime);&lt;br /&gt;
function get(number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;);&lt;br /&gt;
function set(number, number, number, number, number, number, number);&lt;br /&gt;
function setHMSms(number, number, number, number);&lt;br /&gt;
function diffSec(CTime*);&lt;br /&gt;
operator &amp;lt;(const CTime&amp;amp;, CTime);&lt;br /&gt;
operator +(CTime&amp;amp;, CTime);&lt;br /&gt;
operator &amp;gt;=(const CTime&amp;amp;, CTime);&lt;br /&gt;
function setHMS(number, number, number);&lt;br /&gt;
operator &amp;gt;(const CTime&amp;amp;, CTime);&lt;br /&gt;
operator -(CTime&amp;amp;, CTime);&lt;br /&gt;
operator &amp;lt;=(const CTime&amp;amp;, CTime);&lt;br /&gt;
function add(CTime*);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
Статья создана: &lt;br /&gt;
[[Участник:malandrinus|malandrinus]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Участник:IQDDD|IQDDD]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Участник:меченый|меченый]]&lt;/div&gt;</summary>
		<author><name>95.25.99.189</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC</id>
		<title>Справочник по функциям и классам</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA_%D0%BF%D0%BE_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D0%BC_%D0%B8_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%D0%BC"/>
				<updated>2009-07-11T22:31:16Z</updated>
		
		<summary type="html">&lt;p&gt;95.25.99.189: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Посты с форума AMK&lt;br /&gt;
&lt;br /&gt;
==Структура Lua_help==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;C++ class [класс] {&lt;br /&gt;
     const [описание1] = [константа1];&lt;br /&gt;
     const [описание2] = [константа2];&lt;br /&gt;
     ...&lt;br /&gt;
     [константы заменяют описания при вызове методов классов];&lt;br /&gt;
     &lt;br /&gt;
     property [свойство1];&lt;br /&gt;
     property [свойство2];&lt;br /&gt;
     ...&lt;br /&gt;
[свойства (property) - это характеристика какого-либо класса, которая может подвергаться мат. операциям, слияниям, присвояниям и пр.&lt;br /&gt;
     читаются через точку: obj.health];&lt;br /&gt;
&lt;br /&gt;
     [глобальная(-ые) функция(-ии), которой вызывается класс];&lt;br /&gt;
     function [метод1] ([аргумент 1 функции 1], [аргумент 2 функции 1]...);&lt;br /&gt;
     function [метод2] ([аргумент 1 функции2]...);&lt;br /&gt;
             ...&lt;br /&gt;
     [методы - это специальные функции, выполняющие операции с классами и возвращающие значения после операций над классами.&lt;br /&gt;
     вызываются через двоеточие: obj:add_animation(...)];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Создание своего класса==&lt;br /&gt;
Свой класс можно добавить так:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
class &amp;quot;my_cool_class&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Здесь &amp;quot;my_cool_class&amp;quot; - имя моего нового класса. Записывается в кавычках, т.е. это строка.&lt;br /&gt;
&lt;br /&gt;
Потом можно добавлять к этому классу свои методы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- это специальный метод - конструктор. Будет вызван при создании класса.&lt;br /&gt;
function my_cool_class:__init(num)&lt;br /&gt;
    self.my_param = num -- добавили в свой класс переменную&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- обычный метод&lt;br /&gt;
function my_cool_class:cool_method_of_my_class()&lt;br /&gt;
    get_console():execute(&amp;quot;lua_bind_in_action_&amp;quot;..self.my_param)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- деструктор, вызывается при сборке объекта сборщиком мусора. Аргументов не имеет (кроме скрытого self. об этом см. далее)&lt;br /&gt;
function my_cool_class:__finalize()&lt;br /&gt;
    get_console():execute(&amp;quot;good_by_&amp;quot;..self.my_param)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Потом можно создавать экземпляры своего класса, вызывать их методы и пр.:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local obj1 = my_cool_class(1) -- здесь создаётся новый объект. При этом вызывается конструктор и &lt;br /&gt;
                              -- ему передаются аргументы этого вызова (в данном случае число 1).&lt;br /&gt;
local obj2 = my_cool_class(4)&lt;br /&gt;
obj1:cool_method_of_my_class()&lt;br /&gt;
obj2:cool_method_of_my_class()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как только объект становится ненужным (т.е. на него больше нет ссылок) он удаляется сборщиком мусора. При этом вызывается его метод __finalize&lt;br /&gt;
&lt;br /&gt;
При чём здесь self.&lt;br /&gt;
self - это скрытый первый аргумент. Конструкция вида:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function class_name:fun_name(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
на самом деле эквивалентна конструкции &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function class_name.fun_name(self, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Обратите внимание на двоеточие в первом случае и точку во втором.&amp;lt;br&amp;gt;&lt;br /&gt;
При вызове метода конструкция вида:&lt;br /&gt;
&lt;br /&gt;
object_name:fun_name(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
эквивалентна конструкции&lt;br /&gt;
&lt;br /&gt;
object_name.fun_name(object_name, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Это означает, что в качестве self как правило передаётся сам же объект. &amp;quot;Как правило&amp;quot; - это потому, что можно в принципе передать что-то другое. Но лучше этого соглашения не нарушать.&lt;br /&gt;
&lt;br /&gt;
Всё это здорово, но какая от этого польза? Ну сделал я свой класс, и что с ним делать?&lt;br /&gt;
&lt;br /&gt;
В общем, классы - это неплохое средство организации своего кода. Владеющие объектно-ориентированным подходом найдут это расширение весьма удобным. В частности такие, ни к чему не привязанные классы, в скриптах сталкера используются в некоторых местах. Однако, настоящая сила этой технологии не в этом. С помощью этой технологии можно расширять классы, экспортированные в Lua со стороны движка игры. Об этом пойдет речь в следующей части.&lt;br /&gt;
&lt;br /&gt;
==Наследование от экспортированных классов==&lt;br /&gt;
Итак, кроме создания собственных классов технология Luabind позволяет создавать класы на основе уже существующих. Это реализовано в виде своеобразного наследования. Делается это с помощью следующей конструкции:&lt;br /&gt;
&lt;br /&gt;
'''class &amp;quot;my_derived_class&amp;quot; (base_class)'''&lt;br /&gt;
&lt;br /&gt;
Здесь:&lt;br /&gt;
&amp;quot;my_derived_class&amp;quot; как и раньше - это имя нового класса.&amp;lt;br&amp;gt;&lt;br /&gt;
base_class - это уже существующий класс, который будет базовым для вновь созданного. Имя выбрано произвольно, но подразумевается, что такой класс экспортирован и предназначен для наследования.&amp;lt;br&amp;gt;&lt;br /&gt;
Далеко не любой класс из экспортированных со стороны хост-приложения можно использовать в качестве базового. На стороне хост-приложения должен быть создан специальный класс-обёртка. Если его нет, то ничего хорошего не выйдет. Скорее всего при попытке использовать унаследованный класс в Lua будут малопонятные проблемы и вылеты, так что надо знать совершенно точно, можно ли от конкретного класса наследовать.&amp;lt;br&amp;gt;&lt;br /&gt;
Вопрос, какой глубины может быть наследование, т.е. можно ли наследовать от производного класса, мне пока до конца не ясен. С другой стороны, в этом практически нет необходимости.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Итак после выполнения указанной конструкции появляется класс my_derived_class, который является копией класса base_class. У него есть в точности те же методы, что и у его базового класса. Пока от этого мало толку. Но теперь можно переопределить методы нашего класса, изменив таким образом его поведение. Делается это так же, как и ранее, но с некоторыми дополнениями.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- конструктор&lt;br /&gt;
function my_derived_class:__init(num) super(num)&lt;br /&gt;
end&lt;br /&gt;
-- обычный метод&lt;br /&gt;
function my_cool_class:some_method(&amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
    base_class.some_method(self, &amp;lt;список аргументов&amp;gt;)&lt;br /&gt;
end&lt;br /&gt;
-- деструктор&lt;br /&gt;
function my_cool_class:__finalize()&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На что стОит обратить внимание.&amp;lt;br&amp;gt;&lt;br /&gt;
Во-первых, конструкция super(num). Это вызов конструктора базового класса.&amp;lt;br&amp;gt;&lt;br /&gt;
Во-вторых, для вызова метода базового класса из метода унаследованного используется другая конструкция base_class.some_method(self, ). Здесь надо использовать альтернативную форму вызова метода (с точкой и явным указанием первого аргумента self).&amp;lt;br&amp;gt;&lt;br /&gt;
Наконец, метод __finalize() не требует вызова этого же метода для базового класса, поскольку тот будет вызван автоматически при удалении объекта сборщиком мусора.&lt;br /&gt;
&lt;br /&gt;
Собственно и всё. Теперь можно пользоваться созданным классом: создавать объекты этого класса, вызывать их методы и пр. Здесь уже всё зависит от конкретных целей и требует знания конкретных классов.&lt;br /&gt;
&lt;br /&gt;
==сlass alife_simulator==&lt;br /&gt;
alife_simulator - класс для управления серверными объектами. В игре существует всего один экземпляр такого класса, и получить его можно с помощью вызова глобальной функции alife().&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
level_name(level_id) -- возвращает имя уровня по его id&lt;br /&gt;
create_ammo(&amp;lt;имя секции патронов&amp;gt;, position, lvid, gvid, id, amount) - создание пачек с патронами&lt;br /&gt;
create(&amp;lt;имя секции объекта&amp;gt;, position, lvid, gvid, id) -- создание объектов в инвентаре&lt;br /&gt;
create(&amp;lt;имя секции объекта&amp;gt;, position, lvid, gvid) -- создание объектов на уровне&lt;br /&gt;
во всех функция создания объектов&lt;br /&gt;
position - объект класса vector. Не может быть nil, иначе вылет&lt;br /&gt;
lvid - level vertex id&lt;br /&gt;
gvid - game vertex id&lt;br /&gt;
id - это куда спавним. Если в инвентарь, то указываем id непися или ноль (для актора)&lt;br /&gt;
release(sobj, boolean) -- удаляет объект sobj. Зачем второй булевский аргумент - не известно. &lt;br /&gt;
                          Во всех примерах он либо отсутствует, либо установлен в true&lt;br /&gt;
object(id) -- возвращает серверный объект по его id. Если не нашёл nil&lt;br /&gt;
story_object(sid) -- возвращает серверный объект по его story id. Если не нашёл nil&lt;br /&gt;
actor() -- возвращает серверный объект актора&lt;br /&gt;
set_switch_online(id, boolean) -- переводит в онлайн объект с идентификатором id&lt;br /&gt;
set_switch_offline(id, boolean) -- то же , но в онлайн&lt;br /&gt;
dont_has_info(const number&amp;amp;, string); -- проверка на Неполученный инфопоршень(db.actor:dont_has_info(&amp;quot;infoportion&amp;quot;) &lt;br /&gt;
                                      -- или alife():actor():dont_has_info(&amp;quot;infoportion&amp;quot;)).&lt;br /&gt;
has_info - противоположная&lt;br /&gt;
&lt;br /&gt;
предположительно:&lt;br /&gt;
switch_distance() -- радиус переключения в оффлайн?&lt;br /&gt;
switch_distance(number) -- установка этого радиуса?&lt;br /&gt;
level_id() -- текущий номер уровня ?&lt;br /&gt;
object(string) -- получение объекта оп его имени. Не помню точно, что за имя.&lt;br /&gt;
object(number, boolean) - то же, что и object(number)? на что влияет второй аргумент?&lt;br /&gt;
valid_object_id(number) -- проверка наличия объекта по id?&lt;br /&gt;
alife():create( &amp;lt;индекс объекта в all.spawn&amp;gt; ) -- &lt;br /&gt;
spawn_id(number) -- индекс объекта в all.spawn для объекта с заданным id ?&lt;br /&gt;
&lt;br /&gt;
неизвестно:&lt;br /&gt;
add_out_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
set_interactive(number, boolean);&lt;br /&gt;
add_in_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
function remove_in_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
remove_out_restriction(cse_alife_monster_abstract*, number);&lt;br /&gt;
kill_entity(cse_alife_monster_abstract*, const number&amp;amp;, cse_alife_schedulable*);&lt;br /&gt;
kill_entity(alife_simulator*, cse_alife_monster_abstract*, const number&amp;amp;);&lt;br /&gt;
kill_entity(alife_simulator*, cse_alife_monster_abstract*);&lt;br /&gt;
has_info(const number&amp;amp;, string);&lt;br /&gt;
remove_all_restrictions(number, const enum RestrictionSpace::ERestrictorTypes&amp;amp;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local sim = alife() -- получаем сам объект класса alife_simulator&lt;br /&gt;
local sactor = sim:actor() -- получаем серверный объект для актора&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class vector==&lt;br /&gt;
vector - вспомогательный класс, содержащий три координаты, и позволяющий выполнять с ними различные манипуляции. Объекты класса vector являются аргументами многих функций и возвращаются многими функциями. См. например выше про метод create класса alife_simulator. Отдельный объект класса вектор создаётся вызовом глобальной функции vector(). При создании имеет координаты [0,0,0].&lt;br /&gt;
&lt;br /&gt;
===Список методов класса vector===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
v:set_length(number) - оставить направление, изменить длину&lt;br /&gt;
v:normalize(); - сделать длину единичной&lt;br /&gt;
&lt;br /&gt;
v:magnitude() -- длина вектора v&lt;br /&gt;
v1:distance_to(v2) -- расстояние между v1 и v2&lt;br /&gt;
v1:distance_to_sqr(v2) -- квадрат расстояния между v1 и v2&lt;br /&gt;
v1:crossproduct(v2) -- векторное произведение. Возвращает вектор&lt;br /&gt;
v1:dotproduct(v2) -- скалярное произведение. Возвращает число&lt;br /&gt;
v:sub(number); -- вычесть из каждого компонента v число number&lt;br /&gt;
v1:sub(v2); -- вычесть почленно вектор v2 из v1 и поместить в v1&lt;br /&gt;
v1:sub(v2, v3) -- вычесть из v2 - v3 и поместить в v1&lt;br /&gt;
аналогично:&lt;br /&gt;
add - почленное сложение&lt;br /&gt;
mul - почленное умножение&lt;br /&gt;
div - почленное деление&lt;br /&gt;
max/min - почленный максимум/минимум&lt;br /&gt;
v1:clamp(v2) -- почленное обрезание первого вторым&lt;br /&gt;
average -- почленное среднее&lt;br /&gt;
invert -- почленная инверсия знака&lt;br /&gt;
&lt;br /&gt;
v1:abs(v2); -- копирует почленно положительные компоненты в v1 из v2&lt;br /&gt;
lerp(v1, v2, number) -- линейная интерполяция между двумя векторами&lt;br /&gt;
-- если number больше 1, то выходит за них - экстраполяция&lt;br /&gt;
&lt;br /&gt;
v1:reflect(v2, v3) - должно быть отражение одного вектора от плоскости, определяемой другим. Не проверял&lt;br /&gt;
v1:slide(v2, v3); - вероятно, проекция одного вектора на плоскость, определяемую другим. Не уверен&lt;br /&gt;
v1:distance_to_xz(v2) - учитывая, что плоскость XZ - это плоскость параллельная земле, то возможно это &lt;br /&gt;
                        длина проекции на землю пути от точки до точки. Не проверял&lt;br /&gt;
&lt;br /&gt;
v:getP() - зенитный угол в радианах (угол наклона над плоскостью XZ )&lt;br /&gt;
v:getH() - азимутальный угол в радианах (угол в плоскости XZ между проекцией вектора на эту плоскость и осью Z)&lt;br /&gt;
setHP - соответственно для установки этих значений&lt;br /&gt;
v1:align() - выравнивает вектор вдоль оси x или z и нормирует его. Значение по y игнорируется. &lt;br /&gt;
             В итоге всегда возвращается одно из четырёх значений ([1,0,0], [-1,0,0], [0,0,1], [0,0,-1])&lt;br /&gt;
v4:mad(v1,v2,v3) -- бешеная операция =) умножить почленно второе на третье и сложить с &lt;br /&gt;
                    первым, т.е. v4 = v1 + v2*v3 (название операции mad == mul + add)&lt;br /&gt;
v1:inertion(v2, number) -- v1 = v2 + (v1-v2)*number (тоже почленно)&lt;br /&gt;
v1:similar(v2, number) -- сравнение векторов на равенство с погрешностью number. Выдаёт 1 или 0&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local v1 = vector()&lt;br /&gt;
v1:set(1,2,3)&lt;br /&gt;
local v2 = vector():set(4,5,6)&lt;br /&gt;
local dist = v1:distance_to(v2)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class fcolor==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class fcolor {&lt;br /&gt;
    property a; --альфа-цвет, отвечающий за прозрачность.&lt;br /&gt;
    property b; --blue-цвет, отвечающий за синий оттенок цвета.&lt;br /&gt;
    property g; --green-цвет, отвечающий за зелёный оттенок цвета.&lt;br /&gt;
    property r; --red-цвет, отвечающий за красный оттенок цвет.&lt;br /&gt;
&lt;br /&gt;
    fcolor ();&lt;br /&gt;
&lt;br /&gt;
    function set(number, number, number, number); --установка цвета (r,g,b,a)&lt;br /&gt;
    function set(const fcolor&amp;amp;); --установка цвета по уже имеющемуся классу &amp;quot;fcolor()&amp;quot;&lt;br /&gt;
    function set(number); -- не знаю. предполагаю, что есть несколько заранее подготовленных цветов с индексами для каждого.&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Например:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
color = fcolor()&lt;br /&gt;
color.a = 50&lt;br /&gt;
color.g = 255&lt;br /&gt;
color.r = 100&lt;br /&gt;
color.b = 50&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
или&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
color = fcolor()&lt;br /&gt;
color:set(100,255,50,50)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==class hit==&lt;br /&gt;
Бывают случаи, при которых необходимо нанести некоторый урон неписю или мобу, при этом имитировав попадание в него. Для этого существует метод класса game_object:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
function hit(hit*);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Чтобы использовать этот метод, нужно указать аргументы. В данном случае имеет объект другого класса - hit. Вот его описание:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class hit {&lt;br /&gt;
    const burn = 0; --здесь идут константы типов урона, используемых в свойстве &amp;quot;type&amp;quot;. Все мы прекрасно знаем, что означает каждый.&lt;br /&gt;
    const chemical_burn = 6;&lt;br /&gt;
    const dummy = 11;&lt;br /&gt;
    const explosion = 7;&lt;br /&gt;
    const fire_wound = 8;&lt;br /&gt;
    const radiation = 4;&lt;br /&gt;
    const shock = 1;&lt;br /&gt;
    const strike = 2;&lt;br /&gt;
    const telepatic = 5;&lt;br /&gt;
    const wound = 3;&lt;br /&gt;
&lt;br /&gt;
    property direction; --дирекция урона&lt;br /&gt;
    property draftsman; --обозначает персонажа, нанёсшего урон.&lt;br /&gt;
    property impulse; --импульс урона&lt;br /&gt;
    property power; --сила урона&lt;br /&gt;
    property type; -- тип урона (см. константы)&lt;br /&gt;
&lt;br /&gt;
    hit ();&lt;br /&gt;
    hit (const hit*);&lt;br /&gt;
&lt;br /&gt;
    function bone(string); --метод с указанием кости урона&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Пример использования:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
hit = hit() -- создание объекта класса hit&lt;br /&gt;
hit.direction = vector():set(1,0,0) --дирекция по оси x&lt;br /&gt;
hit.draftsman = db.actor --нанёс урон актор&lt;br /&gt;
hit.impulse = 600 --импульс&lt;br /&gt;
hit.power = 1.45 --хит&lt;br /&gt;
hit.type = 2 --тип урона - выстрел&lt;br /&gt;
hit:bone(&amp;quot;bip01_head&amp;quot;) -- удар приходится на голову&lt;br /&gt;
obj:hit(hit)&lt;br /&gt;
-- наносим урон&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==&amp;quot;Функции времени&amp;quot;==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
time_global() -- реальное время (в миллисекундах) с начала запуска программы&lt;br /&gt;
game.time() -- игровое время (в игровых миллисекундах) с начала игры (т.е. с начала прохождения игры)&lt;br /&gt;
level.get_time_days() -- день месяца по игровому времени&lt;br /&gt;
level.get_time_hours() -- час текущего игрового дня&lt;br /&gt;
level.get_time_minutes() -- минута текущего игрового часа&lt;br /&gt;
&lt;br /&gt;
level.get_time_factor() -- возвращает отношение скорости течения игрового времени к скорости реального &lt;br /&gt;
                        --(game_time_speed / real_time_speed)&lt;br /&gt;
level.set_time_factor(number) -- устанавливает это отношение&lt;br /&gt;
&lt;br /&gt;
game.get_game_time() -- возвращает игровое время в виде объекта класса CTime. Класс CTime я опишу подробно &lt;br /&gt;
                     -- как-нибудь потом, а пока опишу только пару его методов.&lt;br /&gt;
конструктор. Вызывается через пространство имён game&lt;br /&gt;
game.CTime()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Дефолтовые значения===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
year, month, day = 1 &lt;br /&gt;
hour, min, sek, ms = 0&lt;br /&gt;
CTime.set(year, month, day, hour, min, sek, ms) -- устанавливает все данные о времени&lt;br /&gt;
метод CTime.get описан так:&lt;br /&gt;
function get(number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;);&lt;br /&gt;
что наводит на мысль о семи аргументах. однако с точки зрения Lua этот метод не принимает аргументов, зато возвращает семь значений. &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
====Пример использования обоих методов:====&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
local t = game.CTime() -- создания объекта с дефолтовыми значнеиями&lt;br /&gt;
t:set(2009, 7, 11, 8, 11, 22, 333) -- установили все значения&lt;br /&gt;
&lt;br /&gt;
local y,m,d,h,min,sec,ms = t:get() -- получили все значения&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
===Класс CTime (неразобранный)===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
C++ class CTime {&lt;br /&gt;
const DateToDay = 0;&lt;br /&gt;
const DateToMonth = 1;&lt;br /&gt;
const DateToYear = 2;&lt;br /&gt;
const TimeToHours = 0;&lt;br /&gt;
const TimeToMilisecs = 3;&lt;br /&gt;
const TimeToMinutes = 1;&lt;br /&gt;
const TimeToSeconds = 2;&lt;br /&gt;
&lt;br /&gt;
CTime ();&lt;br /&gt;
CTime (const CTime&amp;amp;);&lt;br /&gt;
&lt;br /&gt;
function sub(CTime*);&lt;br /&gt;
function timeToString(number);&lt;br /&gt;
function dateToString(number);&lt;br /&gt;
operator ==(const CTime&amp;amp;, CTime);&lt;br /&gt;
function get(number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;, number&amp;amp;);&lt;br /&gt;
function set(number, number, number, number, number, number, number);&lt;br /&gt;
function setHMSms(number, number, number, number);&lt;br /&gt;
function diffSec(CTime*);&lt;br /&gt;
operator &amp;lt;(const CTime&amp;amp;, CTime);&lt;br /&gt;
operator +(CTime&amp;amp;, CTime);&lt;br /&gt;
operator &amp;gt;=(const CTime&amp;amp;, CTime);&lt;br /&gt;
function setHMS(number, number, number);&lt;br /&gt;
operator &amp;gt;(const CTime&amp;amp;, CTime);&lt;br /&gt;
operator -(CTime&amp;amp;, CTime);&lt;br /&gt;
operator &amp;lt;=(const CTime&amp;amp;, CTime);&lt;br /&gt;
function add(CTime*);&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Авторы==&lt;br /&gt;
Статья создана: &lt;br /&gt;
[[Участник:malandrinus|malandrinus]]&amp;lt;br&amp;gt;&lt;br /&gt;
[[Участник:IQDDD|IQDDD]]&lt;br /&gt;
[[Участник:меченый|меченый]]&lt;/div&gt;</summary>
		<author><name>95.25.99.189</name></author>	</entry>

	</feed>