Начальные сведения о скриптах — различия между версиями — S.T.A.L.K.E.R. Inside Wiki

Начальные сведения о скриптах — различия между версиями

Материал из S.T.A.L.K.E.R. Inside Wiki

Перейти к: навигация, поиск
(Добавил в статью новые материалы.Меченый(Стрелок))
 
(не показаны 24 промежуточных версий 11 участников)
Строка 1: Строка 1:
ПРЕДИСЛОВИЕ
+
[[Категория:Скрипты]]
 +
== ПРЕДИСЛОВИЕ ==
 
{{Message_box|
 
{{Message_box|
 
id =pseudoscience|
 
id =pseudoscience|
Строка 5: Строка 6:
 
backgroundcolor = #f9f9f9|
 
backgroundcolor = #f9f9f9|
 
image =Lamp.gif|
 
image =Lamp.gif|
heading = Для чего нужны срипты и сведения и их использовании - Rez@niy|
+
heading = Для чего нужны скрипты и сведения и их использовании - Rez@niy aka Oxygenium|
message = В скриптах содержаться данные для выполнения по условиям.
+
message = В скриптах содержаться инструкции для выполнения по условиям.
 
+
 
+
 
}}
 
}}
 
<br clear="both" />
 
<br clear="both" />
  
<pre>Итак начнём. Рассмотрим простой скрипт спавна предмета:
+
Итак, начнём. Создадим в папке '''gamedata/scripts''' файл с любым названием и расширением '''.script'''. Пускай, '''my_test.script'''. В нем будем прописывать функции. 
--*********************************************
+
Рассмотрим простой скрипт спавна предмета в рюкзак ГГ. Пропишем:<lua>--*********************************************
 
--**TESTING**
 
--**TESTING**
 
--*********************************************
 
--*********************************************
 
--
 
--
-- Создает в заданном месте ящик с динамитом
+
-- Создает в рюкзаке ГГ "калаш"
function bandit_create()
+
function ak_create()
local a = vector() -- db.actor:position()
+
    alife():create("wpn_ak74", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
a.x = -220.21
+
end</lua>
a.y = -19.93
+
Давайте разбирать.
a.z = -158.98
+
Игра считывает весь код из файла, поэтому не удивляйтесь, если игра вылетит при наличии лишнего текста, символов и прочего ненужного в скрипте. Однако, подобных проблем возникать не будет, если мы ''закомментируем'' лишнее. Чтобы игра не считывала текст, перед ним мы ставим две черточки, два минуса, два дефиса, в общем называйте как угодно:<lua>--</lua>
alife():create("wpn_ak47",a,33447,47,65535)
+
Часто таким образом оставляют словесную подсказку того, что делает данный участок кода, либо комментируют код, который на данный момент не нужен, но возможно пригодится в дальнейшем. В общем, зачастую комментарий - это пояснения к исходному тексту программы. В данном случае, система не будет считывать следующие строки:<lua>--*********************************************
end</pre>
+
 
+
 
+
<big>ИМЯ ФУНКЦИИ</big>
+
function - всегда обязательное поле, это что то вроде id, в языке LUA. После поля function отступаем и пишем текст произвольный.
+
Дальше идёт функциия о позиции, она обязательна для спавна скриптом.
+
Ниже кординаты. Для снятия кординат используем в консоли rs_stats on.
+
После кординат идёт сама функция спавна. <big>alife():create("СИСТЕМНОЕ ИМЯ ОБЬЕКТА",a,33447,47,65535)</big>
+
Цифры пусть остануться такие же. Для обьекта спавна возмём wpn_ak47. Кординаты какие то левые, лучше снимите кординаты сами. И ещё кое что важное. В папке scripts, создаём файл bugaga.script и пишем туда готовый текст, только со своими кординатами.
+
<pre>--*********************************************
+
 
--**TESTING**
 
--**TESTING**
 
--*********************************************
 
--*********************************************
 
--
 
--
-- Создает в заданном месте ящик с динамитом
+
-- Создает в рюкзаке ГГ "калаш"</lua>
function bandit_create()
+
local a = vector() -- db.actor:position()
+
a.x = -220.21
+
a.y = -19.93
+
a.z = -158.98
+
alife():create("wpn_ak47",a,33447,47,65535)
+
end</pre>
+
Написали? Отлично!. Теперь осталось только подключить это к игре.  Идём в файл dialogs_escape.xml и выбираем какое нить диалог. Там после поля text в диалоге приписываем <action>main.bandit_create</action>
+
ТОЛЬКО ДИАЛОГ ВЫБИРАЕМ ИСПОЛЬЗУЮЩИЙСЯ. С волком например. Всё сохраняем  и тестим. В итоге, когда вы в игре нажмёте на фразу после которой находится action, заспауниться калаш на указанных кординатах.
+
  
 +
Многострочный комментарий выглядит так
 +
<lua>--[[ком
 +
мен
 +
та
 +
рий]]</lua>
  
 +
Идем дальше. 
 +
''function'' - всегда обязательное начало, это что-то в роде id в языке '''LUA'''. После ''function'' отступаем и пишем текст. Данный текст может состоять из букв латинского алфавита и цифр, при этом важно, чтобы этот текст начинался с буквы и в нём не содержалось пробелов. Этот текст будет названием функции. Не забываем после названия функции дописать две круглые скобки:
 +
<lua>()</lua>
 +
Это обязательный элемент. В нем указываются аргументы функции, с которыми идет работа. В нашем случае таковых нету, но элемент обязателен. 
 +
Дальше идёт сам спавн объекта:
 +
<lua>alife():create("wpn_ak74", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())</lua>
 +
В конце функции обязательно наличие ''end''. Он означает конец функции. Логично, правда? :)
 +
 +
Напоминаю, при таком раскладе АК-74 заспавнится в рюкзак ГГ.
 +
Если же мы пожелаем заспавнить калаш где-нибудь на локации, вызов спавна приобретет следующий вид:
 +
<lua>alife():create("wpn_ak74", vector():set(-81.800, -4.980, -72.739), 186578, 76)</lua>
 +
АК заспавнится в вагончике, недалеко от Деревни новичков.
 +
 +
Но без детального разбора мы дальше, пожалуй,не пойдем. В целом, скелет функции спавна таким методом выглядит так:
 +
<lua>function название_функции()
 +
    alife():create("имя_секции_предмета", vector():set(x,y,z), level_vertex_id, game_vertex_id)
 +
end</lua>
 +
Про конкретные значения.
 +
''alife():create'' - стандартный вызов спавна
 +
''vector():set'' - инициализация координат
 +
''x,y,z'' - координаты места по долготе, высоте, ширине
 +
''level_vertex_id'' и ''game_vertex_id'' - дополнительные координаты относительно локации
 +
Все это нужно снимать в игре. Есть множество способов.
 +
Что касается спавна в рюкзак ГГ, тут с координатами действует немного другая схема. Объект актора можно получить посредством вот такой записи: ''db.actor'', а получить его данные можно вот так:
 +
 +
''db.actor:position()'' - координаты x,y,z актера
 +
 +
''db.actor:level_vertex_id(),db.actor:game_vertex_id()'' - думаю, понятно
 +
 +
''db.actor:id()'' - дополнительный параметр, сам id актера, нужен, чтоб предмет заспавнился именно в рюкзак.
 +
 +
На самом деле, для спавна в инвентарь атору, значение координат, левел и гейм вертексов не важны, а ключевым является последний параметр - '''''id''''' актора, в игре оно всегда равно нулю. Т.е. заспавнить тот же "Калаш" в рюкзак можно и так:<lua>alife():create("wpn_ak74", vector(), 0, 0, 0)</lua>
 +
<br>Написали? Отлично!
 +
<br>Теперь осталось только подключить это к игре, то есть вызвать функцию спавна. 
 +
<br>Идём в файл '''dialogs_escape.xml''' и выбираем какой-нибудь диалог.
 +
<br>Там, после поля ''text'', одной из фраз диалога приписываем:
 +
<xml><action>my_test.ak_create</action></xml>
 +
Как это понимать:
 +
<xml><action>название_скрипта.название_функции</action></xml>
 +
<br>Всё, сохраняем и тестируем. В итоге, когда вы в игре нажмёте на фразу после которой находится ''action'', заспауниться калаш на указанных координатах.
 +
 +
== Углублённое изучение ==
 
{{Message_box|
 
{{Message_box|
 
id =pseudoscience1|
 
id =pseudoscience1|
Строка 54: Строка 81:
 
backgroundcolor = #f9f9f9|
 
backgroundcolor = #f9f9f9|
 
image =Lamp.gif|
 
image =Lamp.gif|
heading = Углублённое изучение - Rez@niy|
+
heading = Условия в Луа - Rez@niy and FX|
message = Далее идём в более углублённое изучение. Изучаем построение
+
message = Далее идём в более углублённое изучение. Изучаем построение}}
  
Прописываем функцию. Задаём условие:
 
if =
 
Для закрытия тэга end
 
  
ПОКА ВСЁ, МОЖЕТ НАПИШУ ЕЩЁ ЧЁ НИТЬ ПОЛЕЗНОЕ
 
  
Ну и я напишу.'''Меченый(Стрелок)'''
 
  
Мой монолог построен так: В - Вопрос,О - Ответ
 
  
Начнём:
 
'''В''' - Что такое ЦИКЛ? И как он выглядит?
 
''О'' - Цикл это повторение одного и того же действие n-ое кол-во раз
 
выглядит так
 
<pre>for i=1,n do
 
  
end</pre>
+
Прописываем функцию.
За место i может быть любая переменная ,за место n - число которое больше первоначального значения(i)
+
Задаём условие:
'''В''' - А для чего можно использовать цикл?
+
<lua>if логическое_условие then</lua>
''О'' - много для чего можно.см. ниже
+
В противном случае, выполняется код, следующий за ключевым словом <big>else</big> 
Пример 1.Перебор по id/Узнаем монстор ли объект,если да ,то функция возвращает истину(true)
+
<lua>else</lua>
<pre>for id=1,65535 do
+
Но, когда нужно проверить несколько значений (допустим) переменной, можно воспользоваться ключевым словом <big>elseif</big>
local obj = level.object_by_id(id)
+
<lua>elseif логическое_условие then</lua>
if obj~= nil then
+
Для закрытия тэга:
if IsMonster(obj) then
+
<lua>end</lua>
return true
+
Для отрицания условия можно воспользоваться ключевым словом <big>not</big>
 +
Т.е.
 +
<lua>if not логическое_условие then</lua>
 +
Будет равен else в данном условии
 +
<lua>if логическое_условие then
 +
...
 
else
 
else
return false
+
...
 +
end</lua>
 +
{{Message_box|
 +
id =pseudoscience11|
 +
align = left|
 +
backgroundcolor = #f9f9f9|
 +
image =Lamp.gif|
 +
heading = Циклы в Луа - Меченый|
 +
message = Далее идём в более углублённое изучение.}}
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
И так, что же такое цикл. Цикл это повторение одного и того же действия n-ое кол-во раз, которое выглядит так:
 +
<pre>for i=1,n,step do
 +
...
 
end
 
end
 +
</pre>
 +
За место i может быть любая переменная, за место n - число которое больше первоначального значения(i)
 +
<br clear="both" />Здесь i - это счетчик цикла. Эта переменная локальна для цикла, т.е. она доступна только внутри тела цикла.
 +
<br clear="both" />1 - начальное значение счетчика, n - конечное.
 +
<br clear="both" />step - шаг цикла ( указывать необязательно, по умолчанию равно 1 )
 +
<br clear="both" />Переменные, объявленные локальными в теле цикла, доступны только внутри цикла.
 +
<lua>local con = get_console()
 +
For i = 10,5,-2 do
 +
con:execute("i="..tostring(i)) -- выведет в консоль последовательно 10, 8, 6
 
end
 
end
end</pre>
+
con:execute("i="..tostring(i)) -- выведет строку "i=nil",т.к. счетчик уже недоступен.
 +
</lua>
 +
'''В''' - А для чего можно использовать цикл?
 +
''О'' - Чтобы выполнить некоторый набор инструкций несколько раз.
 +
<br>Пример 1.Перебор по id. Узнаем монстр ли объект,если да, то функция пишет в консоль строку вида "monster_"<имя объекта>, иначе "no_monster_"<имя объекта>
 +
<lua>local con = console()
 +
for id=1,65534 do
 +
local obj = level.object_by_id(id)
 +
if obj~= nil then
 +
if IsMonster(obj) then
 +
con:execute("monster_"..obj:name())
 +
else
 +
con:execute("no_monster_"..obj:name())
 +
end
 +
end
 +
end</lua>
 
Пример 2.Спавн/
 
Пример 2.Спавн/
<pre>for i=1,5 do --функция повторится 5 раз,следовательно будет заспавнено 5 АК  
+
<lua>local pos = vector():set(-220.21,-19.93,-158.98)
local a = vector()
+
for i=1,5 do --функция повторится 5 раз,следовательно будет заспавнено 5 АК  
a.x = -220.21
+
alife():create("wpn_ak47",pos,33447,47,65535)
a.y = -19.93
+
end</lua>
a.z = -158.98
+
alife():create("wpn_ak47",a,33447,47,65535)
+
end</pre>
+
 
и т.п.
 
и т.п.
 
существует ещё цикл  с предусловием (while a,n do),но об этом позже
 
существует ещё цикл  с предусловием (while a,n do),но об этом позже
 
'''В''' - Какие параметры ГГ можно корректировать  скриптами?
 
'''В''' - Какие параметры ГГ можно корректировать  скриптами?
''О'' - Таких не много, запись будет такой :<pre>db.actor.параметр</pre>
+
''О'' - Таких не много, запись будет такой :
 +
<pre>db.actor.параметр</pre>
 
Параметры:
 
Параметры:
 
<pre>radiation
 
<pre>radiation
Строка 105: Строка 165:
 
psy_health
 
psy_health
 
power</pre>
 
power</pre>
'''В''' - а можно ли спавнить в рандомной точке предмет,если да,то как?
+
 
''О'' - можно
+
{{Message_box|
Для этого нам понадобится таблица максимальных значений level_vertex_id и game_vertex_id
+
id =pseudoscience12|
 +
align = left|
 +
backgroundcolor = #f9f9f9|
 +
image =Lamp.gif|
 +
heading = Таблицы в Луа - Меченый|
 +
message = Далее идём в более углублённое изучение.}}
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
И так, покажу наглядно на системе рандомного спавна. Для этого нам понадобится таблица максимальных значений ''level_vertex_id'' и ''game_vertex_id''
 
выглядит она так:
 
выглядит она так:
  
<pre>local level_vertexes={
+
<lua>local level_vertexes={
 
l01_escape = {lvid=595580, gvid=44},
 
l01_escape = {lvid=595580, gvid=44},
 
l02_garbage = {lvid=384039, gvid=265},
 
l02_garbage = {lvid=384039, gvid=265},
Строка 119: Строка 191:
 
l10_radar = {lvid=796328, gvid=1868},
 
l10_radar = {lvid=796328, gvid=1868},
 
l11_pripyat = {lvid=295965, gvid=2269}
 
l11_pripyat = {lvid=295965, gvid=2269}
}</pre>
+
}</lua>
  
ЗЫ:Извините ,что не для всех уровней,исправлюсь
+
ЗЫ: Извините, что не для всех уровней.
Так,таблица у нас есть ,теперь нам нужно написать функцию спавна.Давайте покажу на Монстрах
+
Так, таблица у нас есть, теперь нам нужно написать функцию спавна. Давайте покажу на Монстрах.
создадим таблицу с секциями спавна монстров:
+
Создадим таблицу с секциями спавна монстров:
(Я буду использовать свои наработки ,поэтому таких секции у вас не будет ,эта таблица -пример)
+
(Я буду использовать свои наработки, поэтому таких секции у вас не будет, эта таблица - пример)
  
<pre>local mutants = {
+
<lua>local mutants = {
 
"zombie_ghost_hell",
 
"zombie_ghost_hell",
 
"zombie_normal_hell",
 
"zombie_normal_hell",
Строка 137: Строка 209:
 
"chimera_weak_hell",
 
"chimera_weak_hell",
 
"gigant_strong_hell"
 
"gigant_strong_hell"
}</pre>
+
}</lua>
  
Таблицу записали ,наконец приступим к оформлению главной функции
+
Таблицу записали, наконец приступим к оформлению главной функции
<pre>function random_spawn()
+
<lua>function random_spawn()
 
local count = math.random(5,20) --выбираем кол-во заспавненых мобов
 
local count = math.random(5,20) --выбираем кол-во заспавненых мобов
 
local section = mutants[math.random(table.getn(mutants))] -- выбираем секцию моба
 
local section = mutants[math.random(table.getn(mutants))] -- выбираем секцию моба
Строка 146: Строка 218:
 
local gv = level_vertexes[level.name()]["gvid"] --выбираем гэйм вертекс
 
local gv = level_vertexes[level.name()]["gvid"] --выбираем гэйм вертекс
 
for ind = 1, count do
 
for ind = 1, count do
alife():create(section, level.vertex_position(lv), lv, gv)--\\level.vertex_position(lv) - позиция левел вертекса
+
alife():create(section, level.vertex_position(lv), lv, gv)--\\level.vertex_position(lv) - позиция левел вертекса
 
end
 
end
end</pre>
+
end</lua>
  
Далее помещаем вызов функции в bind_stalker.script в net_spawn() и при каждой загрузке будут спавнится мобы в рандомной точке
+
Далее помещаем вызов функции в '''bind_stalker.script''' в ''net_spawn()'' и при каждой загрузке будут спавнится мобы в рандомной точке
[[Категория:Скрипты]]
+
 
 +
== Помощь новичкам ==
 +
Различные полезные функции и методы перенесены в эту статью [http://stalkerin.gameru.net/wiki/index.php?title=Полезные_методы_и_функции]
 +
 
 +
== Авторы ==
 +
'''Оригинальный вид статьи:'''
 +
*Rez@nyi
 +
*Меченый
 +
'''Переоформление, перестройка, дополнение статьи:'''
 +
*FantomICW
 +
*FX

Текущая версия на 08:54, 6 июля 2016

ПРЕДИСЛОВИЕ

Lamp.gif Для чего нужны скрипты и сведения и их использовании - Rez@niy aka Oxygenium
В скриптах содержаться инструкции для выполнения по условиям.


Итак, начнём. Создадим в папке gamedata/scripts файл с любым названием и расширением .script. Пускай, my_test.script. В нем будем прописывать функции.

Рассмотрим простой скрипт спавна предмета в рюкзак ГГ. Пропишем:
--*********************************************
--**TESTING**
--*********************************************
--
-- Создает в рюкзаке ГГ "калаш"
function ak_create()
    alife():create("wpn_ak74", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
end

Давайте разбирать.

Игра считывает весь код из файла, поэтому не удивляйтесь, если игра вылетит при наличии лишнего текста, символов и прочего ненужного в скрипте. Однако, подобных проблем возникать не будет, если мы закомментируем лишнее. Чтобы игра не считывала текст, перед ним мы ставим две черточки, два минуса, два дефиса, в общем называйте как угодно:
--
Часто таким образом оставляют словесную подсказку того, что делает данный участок кода, либо комментируют код, который на данный момент не нужен, но возможно пригодится в дальнейшем. В общем, зачастую комментарий - это пояснения к исходному тексту программы. В данном случае, система не будет считывать следующие строки:
--*********************************************
--**TESTING**
--*********************************************
--
-- Создает в рюкзаке ГГ "калаш"

Многострочный комментарий выглядит так

--[[ком
мен
та
рий]]

Идем дальше. function - всегда обязательное начало, это что-то в роде id в языке LUA. После function отступаем и пишем текст. Данный текст может состоять из букв латинского алфавита и цифр, при этом важно, чтобы этот текст начинался с буквы и в нём не содержалось пробелов. Этот текст будет названием функции. Не забываем после названия функции дописать две круглые скобки:

()

Это обязательный элемент. В нем указываются аргументы функции, с которыми идет работа. В нашем случае таковых нету, но элемент обязателен. Дальше идёт сам спавн объекта:

alife():create("wpn_ak74", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())

В конце функции обязательно наличие end. Он означает конец функции. Логично, правда? :)

Напоминаю, при таком раскладе АК-74 заспавнится в рюкзак ГГ. Если же мы пожелаем заспавнить калаш где-нибудь на локации, вызов спавна приобретет следующий вид:

alife():create("wpn_ak74", vector():set(-81.800, -4.980, -72.739), 186578, 76)

АК заспавнится в вагончике, недалеко от Деревни новичков.

Но без детального разбора мы дальше, пожалуй,не пойдем. В целом, скелет функции спавна таким методом выглядит так:

function название_функции()
    alife():create("имя_секции_предмета", vector():set(x,y,z), level_vertex_id, game_vertex_id)
end

Про конкретные значения. alife():create - стандартный вызов спавна vector():set - инициализация координат x,y,z - координаты места по долготе, высоте, ширине level_vertex_id и game_vertex_id - дополнительные координаты относительно локации Все это нужно снимать в игре. Есть множество способов. Что касается спавна в рюкзак ГГ, тут с координатами действует немного другая схема. Объект актора можно получить посредством вот такой записи: db.actor, а получить его данные можно вот так:

db.actor:position() - координаты x,y,z актера

db.actor:level_vertex_id(),db.actor:game_vertex_id() - думаю, понятно

db.actor:id() - дополнительный параметр, сам id актера, нужен, чтоб предмет заспавнился именно в рюкзак.

На самом деле, для спавна в инвентарь атору, значение координат, левел и гейм вертексов не важны, а ключевым является последний параметр - id актора, в игре оно всегда равно нулю. Т.е. заспавнить тот же "Калаш" в рюкзак можно и так:
alife():create("wpn_ak74", vector(), 0, 0, 0)


Написали? Отлично!
Теперь осталось только подключить это к игре, то есть вызвать функцию спавна.
Идём в файл dialogs_escape.xml и выбираем какой-нибудь диалог.
Там, после поля text, одной из фраз диалога приписываем:

<action>my_test.ak_create</action>

Как это понимать:

<action>название_скрипта.название_функции</action>


Всё, сохраняем и тестируем. В итоге, когда вы в игре нажмёте на фразу после которой находится action, заспауниться калаш на указанных координатах.

Углублённое изучение

Lamp.gif Условия в Луа - Rez@niy and FX
Далее идём в более углублённое изучение. Изучаем построение




Прописываем функцию. Задаём условие:

if логическое_условие then

В противном случае, выполняется код, следующий за ключевым словом else

else

Но, когда нужно проверить несколько значений (допустим) переменной, можно воспользоваться ключевым словом elseif

elseif логическое_условие then

Для закрытия тэга:

end

Для отрицания условия можно воспользоваться ключевым словом not Т.е.

if not логическое_условие then

Будет равен else в данном условии

if логическое_условие then
...
else
...
end
Lamp.gif Циклы в Луа - Меченый
Далее идём в более углублённое изучение.




И так, что же такое цикл. Цикл это повторение одного и того же действия n-ое кол-во раз, которое выглядит так:

for i=1,n,step do
 ...
end

За место i может быть любая переменная, за место n - число которое больше первоначального значения(i)
Здесь i - это счетчик цикла. Эта переменная локальна для цикла, т.е. она доступна только внутри тела цикла.
1 - начальное значение счетчика, n - конечное.
step - шаг цикла ( указывать необязательно, по умолчанию равно 1 )
Переменные, объявленные локальными в теле цикла, доступны только внутри цикла.

local con = get_console()
For i = 10,5,-2 do
	con:execute("i="..tostring(i)) -- выведет в консоль последовательно 10, 8, 6
end
con:execute("i="..tostring(i)) -- выведет строку "i=nil",т.к. счетчик уже недоступен.
 

В - А для чего можно использовать цикл? О - Чтобы выполнить некоторый набор инструкций несколько раз.
Пример 1.Перебор по id. Узнаем монстр ли объект,если да, то функция пишет в консоль строку вида "monster_"<имя объекта>, иначе "no_monster_"<имя объекта>

local con = console()
for id=1,65534 do
	local obj = level.object_by_id(id)
	if obj~= nil then
		if IsMonster(obj) then
			con:execute("monster_"..obj:name())
		else
			con:execute("no_monster_"..obj:name())
		end
	end
end

Пример 2.Спавн/

local pos = vector():set(-220.21,-19.93,-158.98)
for i=1,5 do --функция повторится 5 раз,следовательно будет заспавнено 5 АК 
	alife():create("wpn_ak47",pos,33447,47,65535)
end

и т.п. существует ещё цикл с предусловием (while a,n do),но об этом позже В - Какие параметры ГГ можно корректировать скриптами? О - Таких не много, запись будет такой :

db.actor.параметр

Параметры:

radiation
health
psy_health
power
Lamp.gif Таблицы в Луа - Меченый
Далее идём в более углублённое изучение.




И так, покажу наглядно на системе рандомного спавна. Для этого нам понадобится таблица максимальных значений level_vertex_id и game_vertex_id выглядит она так:

local level_vertexes={
l01_escape = {lvid=595580, gvid=44},
l02_garbage = {lvid=384039, gvid=265},
l03_agroprom = {lvid=438379, gvid=693},
l04_darkvalley = {lvid=392517, gvid=813},
l06_rostok = {lvid=69283, gvid=1311},
l07_military = {lvid=915663, gvid=1546},
l10_radar = {lvid=796328, gvid=1868},
l11_pripyat = {lvid=295965, gvid=2269}
}

ЗЫ: Извините, что не для всех уровней. Так, таблица у нас есть, теперь нам нужно написать функцию спавна. Давайте покажу на Монстрах. Создадим таблицу с секциями спавна монстров: (Я буду использовать свои наработки, поэтому таких секции у вас не будет, эта таблица - пример)

local mutants = {
"zombie_ghost_hell",
"zombie_normal_hell",
"zombie_immortal_hell",
"bloodsucker_weak_hell",
"tushkano_normal_hell",
"snork_weak_hell",
"burer_weak_hell",
"cat_weak_hell",
"chimera_weak_hell",
"gigant_strong_hell"
}

Таблицу записали, наконец приступим к оформлению главной функции

function random_spawn()
local count = math.random(5,20) --выбираем кол-во заспавненых мобов
local section = mutants[math.random(table.getn(mutants))] -- выбираем секцию моба
local lv = math.random(level_vertexes[level.name()]["lvid"]) --выбираем левел вертекс
local gv = level_vertexes[level.name()]["gvid"] --выбираем гэйм вертекс
for ind = 1, count do
	alife():create(section, level.vertex_position(lv), lv, gv)--\\level.vertex_position(lv) - позиция левел вертекса
end
end

Далее помещаем вызов функции в bind_stalker.script в net_spawn() и при каждой загрузке будут спавнится мобы в рандомной точке

Помощь новичкам

Различные полезные функции и методы перенесены в эту статью [1]

Авторы

Оригинальный вид статьи:

  • Rez@nyi
  • Меченый

Переоформление, перестройка, дополнение статьи:

  • FantomICW
  • FX
Другие места
LANGUAGE