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

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

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

Перейти к: навигация, поиск
(оформление, орфография)
Строка 12: Строка 12:
 
<br clear="both" />
 
<br clear="both" />
  
<pre>Итак начнём. Рассмотрим простой скрипт спавна предмета:
+
Итак начнём. Рассмотрим простой скрипт спавна предмета:
--*********************************************
+
<lua>--*********************************************
 
--**TESTING**
 
--**TESTING**
 
--*********************************************
 
--*********************************************
Строка 24: Строка 24:
 
a.z = -158.98
 
a.z = -158.98
 
alife():create("wpn_ak47",a,33447,47,65535)
 
alife():create("wpn_ak47",a,33447,47,65535)
end</pre>
+
end</lua>
  
  
 
<big>ИМЯ ФУНКЦИИ</big>
 
<big>ИМЯ ФУНКЦИИ</big>
function - всегда обязательное поле, это что то вроде id, в языке LUA. После поля function отступаем и пишем текст произвольный.  
+
''function'' - всегда обязательное поле, это что то вроде id, в языке LUA. После поля function отступаем и пишем текст произвольный.  
 
Дальше идёт функциия о позиции, она обязательна для спавна скриптом.
 
Дальше идёт функциия о позиции, она обязательна для спавна скриптом.
 
Ниже кординаты. Для снятия кординат используем в консоли rs_stats on.
 
Ниже кординаты. Для снятия кординат используем в консоли rs_stats on.
 
После кординат идёт сама функция спавна. <big>alife():create("СИСТЕМНОЕ ИМЯ ОБЬЕКТА",a,33447,47,65535)</big>
 
После кординат идёт сама функция спавна. <big>alife():create("СИСТЕМНОЕ ИМЯ ОБЬЕКТА",a,33447,47,65535)</big>
 
Цифры пусть остануться такие же. Для обьекта спавна возмём wpn_ak47. Кординаты какие то левые, лучше снимите кординаты сами. И ещё кое что важное. В папке scripts, создаём файл main.script и пишем туда готовый текст, только со своими кординатами.
 
Цифры пусть остануться такие же. Для обьекта спавна возмём wpn_ak47. Кординаты какие то левые, лучше снимите кординаты сами. И ещё кое что важное. В папке scripts, создаём файл main.script и пишем туда готовый текст, только со своими кординатами.
<pre>--*********************************************
+
<lua>--*********************************************
 
--**TESTING**
 
--**TESTING**
 
--*********************************************
 
--*********************************************
Строка 44: Строка 44:
 
a.z = -158.98
 
a.z = -158.98
 
alife():create("wpn_ak47",a,33447,47,65535)
 
alife():create("wpn_ak47",a,33447,47,65535)
end</pre>
+
end</lua>
Написали? Отлично!. Теперь осталось только подключить это к игре.  Идём в файл dialogs_escape.xml и выбираем какое нить диалог. Там после поля text в диалоге приписываем <action>main.ak_create</action>
+
Написали? Отлично!. Теперь осталось только подключить это к игре.  Идём в файл '''dialogs_escape.xml''' и выбираем какое нить диалог. Там после поля ''text'' в диалоге приписываем:
ТОЛЬКО ДИАЛОГ ВЫБИРАЕМ ИСПОЛЬЗУЮЩИЙСЯ. С волком например. Всё сохраняем  и тестим. В итоге, когда вы в игре нажмёте на фразу после которой находится action, заспауниться калаш на указанных кординатах.
+
<code><action>main.ak_create</action></code>
 +
ТОЛЬКО ДИАЛОГ ВЫБИРАЕМ ИСПОЛЬЗУЮЩИЙСЯ. С волком например. Всё сохраняем  и тестим. В итоге, когда вы в игре нажмёте на фразу после которой находится ''action'', заспауниться калаш на указанных кординатах.
  
  
Строка 58: Строка 59:
  
 
Прописываем функцию. Задаём условие:
 
Прописываем функцию. Задаём условие:
if =
+
<code>if =</code>
Для закрытия тэга end
+
Для закрытия тэга:
 +
<code>end</code>
  
 
ПОКА ВСЁ, МОЖЕТ НАПИШУ ЕЩЁ ЧЁ НИТЬ ПОЛЕЗНОЕ
 
ПОКА ВСЁ, МОЖЕТ НАПИШУ ЕЩЁ ЧЁ НИТЬ ПОЛЕЗНОЕ
Строка 78: Строка 80:
 
''О'' - много для чего можно.см. ниже
 
''О'' - много для чего можно.см. ниже
 
Пример 1.Перебор по id/Узнаем монстор ли объект,если да ,то функция возвращает истину(true)
 
Пример 1.Перебор по id/Узнаем монстор ли объект,если да ,то функция возвращает истину(true)
<pre>for id=1,65535 do
+
<lua>for id=1,65535 do
 
local obj = level.object_by_id(id)
 
local obj = level.object_by_id(id)
 
if obj~= nil then
 
if obj~= nil then
Строка 87: Строка 89:
 
end
 
end
 
end
 
end
end</pre>
+
end</lua>
 
Пример 2.Спавн/
 
Пример 2.Спавн/
<pre>for i=1,5 do --функция повторится 5 раз,следовательно будет заспавнено 5 АК  
+
<lua>for i=1,5 do --функция повторится 5 раз,следовательно будет заспавнено 5 АК  
 
local a = vector()  
 
local a = vector()  
 
a.x = -220.21
 
a.x = -220.21
Строка 95: Строка 97:
 
a.z = -158.98
 
a.z = -158.98
 
alife():create("wpn_ak47",a,33447,47,65535)
 
alife():create("wpn_ak47",a,33447,47,65535)
end</pre>
+
end</lua>
 
и т.п.
 
и т.п.
 
существует ещё цикл  с предусловием (while a,n do),но об этом позже
 
существует ещё цикл  с предусловием (while a,n do),но об этом позже
 
'''В''' - Какие параметры ГГ можно корректировать  скриптами?
 
'''В''' - Какие параметры ГГ можно корректировать  скриптами?
''О'' - Таких не много, запись будет такой :<pre>db.actor.параметр</pre>
+
''О'' - Таких не много, запись будет такой :
 +
<pre>db.actor.параметр</pre>
 
Параметры:
 
Параметры:
 
<pre>radiation
 
<pre>radiation
Строка 107: Строка 110:
 
'''В''' - а можно ли спавнить в рандомной точке предмет,если да,то как?
 
'''В''' - а можно ли спавнить в рандомной точке предмет,если да,то как?
 
''О'' - можно
 
''О'' - можно
Для этого нам понадобится таблица максимальных значений level_vertex_id и game_vertex_id
+
Для этого нам понадобится таблица максимальных значений ''level_vertex_id'' и ''game_vertex_id''
 
выглядит она так:
 
выглядит она так:
  
<pre>local level_vertexes={
+
<ini>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: Строка 122:
 
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>
+
}</ini>
  
 
ЗЫ:Извините ,что не для всех уровней,исправлюсь  
 
ЗЫ:Извините ,что не для всех уровней,исправлюсь  
Строка 126: Строка 129:
 
(Я буду использовать свои наработки ,поэтому таких секции у вас не будет ,эта таблица -пример)
 
(Я буду использовать свои наработки ,поэтому таких секции у вас не будет ,эта таблица -пример)
  
<pre>local mutants = {
+
<lua>local mutants = {
 
"zombie_ghost_hell",
 
"zombie_ghost_hell",
 
"zombie_normal_hell",
 
"zombie_normal_hell",
Строка 137: Строка 140:
 
"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))] -- выбираем секцию моба
Строка 148: Строка 151:
 
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()'' и при каждой загрузке будут спавнится мобы в рандомной точке
 
[[Категория:Скрипты]]
 
[[Категория:Скрипты]]
  
 
<big>Вступление ГГ в группировку!</big>
 
<big>Вступление ГГ в группировку!</big>
1.Создаем файл ваше_название_скприпта.script в папке gamedata/scripts
+
1.Создаем файл '''ваше_название_скприпта.script''' в папке '''gamedata/scripts'''
 
2. Открываем его и пишем:
 
2. Открываем его и пишем:
 
--меняем группировку ГГ
 
--меняем группировку ГГ
<pre>function new_group(actor, npc)
+
<lua>function new_group(actor, npc)
 
if npc:character_community() ~= "(dolg)" then  
 
if npc:character_community() ~= "(dolg)" then  
 
npc:set_character_community("dolg", 0, 0)  
 
npc:set_character_community("dolg", 0, 0)  
 
end
 
end
end</pre>
+
end</lua>
 
Выдаём функцию при разговоре с НПС
 
Выдаём функцию при разговоре с НПС
  
Строка 171: Строка 174:
 
<big>Нельзя взять оружие без брони</big>
 
<big>Нельзя взять оружие без брони</big>
 
Пишем функцию в любом скрипе:
 
Пишем функцию в любом скрипе:
function ваше_название_функции()
+
<lua>function ваше_название_функции()
 
local armor = db.actor:item_in_slot(6) --слот брони (НЕ ТРОГАТЬ!)
 
local armor = db.actor:item_in_slot(6) --слот брони (НЕ ТРОГАТЬ!)
 
local weapon = db.actor:item_in_slot(2) --слот оружия (для пистолетов в оригинале слот 1)
 
local weapon = db.actor:item_in_slot(2) --слот оружия (для пистолетов в оригинале слот 1)
Строка 181: Строка 184:
 
else
 
else
 
tmp = "none"
 
tmp = "none"
end
+
end</lua>
  
<pre>if (not string.find(tmp, "пишем_название_брони" )) and (weapon:section()=="пишем_название_оружия1" or weapon:section()=="пишем_название_оружия2" or weapon:section()=="пишем_название_оружия3") then --если необходима проверка одного оружия то надо писать так: if (not string.find(tmp, "exo" )) and weapon:section()=="wpn_pkm" then
+
<lua>if (not string.find(tmp, "пишем_название_брони" )) and (weapon:section()=="пишем_название_оружия1" or weapon:section()=="пишем_название_оружия2" or weapon:section()=="пишем_название_оружия3") then --если необходима проверка одного оружия то надо писать так: if (not string.find(tmp, "exo" )) and weapon:section()=="wpn_pkm" then
 
db.actor:drop_item(weapon)
 
db.actor:drop_item(weapon)
 
local tmpw = amk.spawn_item_in_inv(weapon:section())
 
local tmpw = amk.spawn_item_in_inv(weapon:section())
Строка 190: Строка 193:
 
news_manager.send_tip(db.actor,"Невозможно взять пулемёт в руки без экзы",nil,nil,10000)
 
news_manager.send_tip(db.actor,"Невозможно взять пулемёт в руки без экзы",nil,nil,10000)
 
end
 
end
end</pre>
+
end</lua>
  
Далее идем по этому пути <pre>gamedata/script/bind_stalker.script</pre>
+
Далее идем по пути '''gamedata/script/bind_stalker.script'''
Функция <pre>function actor_binder:update(delta)</pre>
+
Функция:
 +
<pre>function actor_binder:update(delta)</pre>
 
Сразу ниже неё пиши вызов в формате :
 
Сразу ниже неё пиши вызов в формате :
название_файла.название_функции.
+
<code>название_файла.название_функции</code>
Можешь написать эту функцию в любом файле из папки scripts, а можешь создать свой файл и назвать скажем my_script и написать там.
+
Можешь написать эту функцию в любом файле из папки '''scripts''', а можешь создать свой файл и назвать, скажем, '''my_script''', и написать там.
 
Должно быть так :
 
Должно быть так :
 
Код
 
Код
<pre>function actor_binder:update(delta)
+
<lua>function actor_binder:update(delta)
my_script.check_armor()</pre>
+
my_script.check_armor()</lua>
  
  
 
<big>Удаление предмета из инвентаря</big>
 
<big>Удаление предмета из инвентаря</big>
  
<pre>function name_function()
+
<lua>function name_function()
 
local se_obj = alife():object("сюда_пишем_что_удалять_будем")
 
local se_obj = alife():object("сюда_пишем_что_удалять_будем")
 
if se_obj then
 
if se_obj then
 
alife():release(se_obj, true)
 
alife():release(se_obj, true)
 
end
 
end
end</pre>
+
end</lua>
  
 
ПРИМЕР
 
ПРИМЕР
 
--' убираем финального Клыка
 
--' убираем финального Клыка
<pre>function dell_kluk_final()
+
<lua>function dell_kluk_final()
 
local se_obj = alife():object("final_kluk")
 
local se_obj = alife():object("final_kluk")
 
if se_obj then
 
if se_obj then
 
alife():release(se_obj, true)
 
alife():release(se_obj, true)
 
end
 
end
end</pre>
+
end</lua>
  
  
Строка 225: Строка 229:
  
 
         ВЫДАЁМ ПРЕДМЕТ АКТОРУ
 
         ВЫДАЁМ ПРЕДМЕТ АКТОРУ
function название функции (first_speaker, second_speaker)
+
<lua>function название функции (first_speaker, second_speaker)
 
dialogs.relocate_item_section(second_speaker, "название предмета", "in")  
 
dialogs.relocate_item_section(second_speaker, "название предмета", "in")  
end
+
end</lua>
  
 
Размещается в файлах скрипт.
 
Размещается в файлах скрипт.
  
 
Выдача поршня вставляется под строку действия.
 
Выдача поршня вставляется под строку действия.
<action>название скрипта.название функции</action>
+
<code><action>название скрипта.название функции</action></code>
  
 
Примечание, что бы выдать два одинаковых предмета пишем
 
Примечание, что бы выдать два одинаковых предмета пишем
  
function название функции (first_speaker, second_speaker)
+
<lua>function название функции (first_speaker, second_speaker)
 
dialogs.relocate_item_section(second_speaker, "название предмета", "in",2)  
 
dialogs.relocate_item_section(second_speaker, "название предмета", "in",2)  
end
+
end</lua>
  
 
Если надо больше меняем цифру 2 на нужную нам.
 
Если надо больше меняем цифру 2 на нужную нам.
  
 
       ОТБИРАЕМ ПРЕДМЕТ У АКТОРА.
 
       ОТБИРАЕМ ПРЕДМЕТ У АКТОРА.
function название функции(first_speaker, second_speaker)
+
<lua>function название функции(first_speaker, second_speaker)
 
     dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "название предмета")
 
     dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "название предмета")
end
+
end</lua>
  
 
размещается в файлах скрипт
 
размещается в файлах скрипт
  
выдача поршня вставляется под строку действия
+
выдача поршня вставляется под строку действия:
<action>название скрипта.название функции</action>
+
<code><action>название скрипта.название функции</action></code>
  
 
Примечание, что бы отобрать два одинаковых предмета пишем
 
Примечание, что бы отобрать два одинаковых предмета пишем
  
function название функции(first_speaker, second_speaker)
+
<lua>function название функции(first_speaker, second_speaker)
 
     dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "название предмета",2)
 
     dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "название предмета",2)
end
+
end</lua>
 
+
 
Если надо больше меняем цифру 2 на нужную нам.
 
Если надо больше меняем цифру 2 на нужную нам.
  
 
       СПАВНИМ ВЕЩЬ В РЮКЗАК гг
 
       СПАВНИМ ВЕЩЬ В РЮКЗАК гг
function название функции()
+
<lua>function название функции()
 
local obj = alife():create("ВЕЩЬ", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
 
local obj = alife():create("ВЕЩЬ", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
end
+
end</lua>
  
В диалог
+
В диалог:
<action>название скрипта.название функции</action>
+
<code><action>название скрипта.название функции</action></code>
  
  
 
ПРОВЕРКА НАЛИЧИЯ У АКТОРА ПРЕДМЕТА
 
ПРОВЕРКА НАЛИЧИЯ У АКТОРА ПРЕДМЕТА
 
Вариант первый
 
Вариант первый
function Название функции()
+
<lua>function Название функции()
 
     if db.actor:object("название предмета") then
 
     if db.actor:object("название предмета") then
 
         return true
 
         return true
 
     end
 
     end
 
     return false
 
     return false
end
+
end</lua>
  
в диалог
+
в диалог:
  
<precondition>имя скрипта.название функции</precondition>
+
<code><precondition>имя скрипта.название функции</precondition></code>
  
 
<---------Вариант второй)------------------>
 
<---------Вариант второй)------------------>
  
function название функции(first_speaker, second_speaker)
+
<lua>function название функции(first_speaker, second_speaker)
 
     return first_speaker:object("название предмета") ~= nil
 
     return first_speaker:object("название предмета") ~= nil
end
+
end</lua>
  
в диалог
+
в диалог:
  
<precondition>имя скрипта.название функции</precondition>
+
<code><precondition>имя скрипта.название функции</precondition></code>
  
 
ПРОВЕРКА ВЕЩЕЙ У ГГ
 
ПРОВЕРКА ВЕЩЕЙ У ГГ
function Название функции(first_speaker, second_speaker)
+
<lua>function Название функции(first_speaker, second_speaker)
 
     return first_speaker:object("название предмета") ~= nil or
 
     return first_speaker:object("название предмета") ~= nil or
 
             first_speaker:object("название предмета") ~= nil or
 
             first_speaker:object("название предмета") ~= nil or
 
             first_speaker:object("название предмета") ~= nil
 
             first_speaker:object("название предмета") ~= nil
end
+
end</lua>
  
в диалог
+
в диалог:
  
<precondition>имя скрипта.название функции</precondition>
+
<code><precondition>имя скрипта.название функции</precondition></code>
  
 
описание... если есть хотя бы одна вещь, то мы получим фразу, если нет всех нет разговора
 
описание... если есть хотя бы одна вещь, то мы получим фразу, если нет всех нет разговора
Строка 308: Строка 311:
 
Вариант первый(используют ПЫС)
 
Вариант первый(используют ПЫС)
  
function название функции(first_speaker, second_speaker)
+
<lua>function название функции(first_speaker, second_speaker)
 
     return first_speaker:money() >= 2000
 
     return first_speaker:money() >= 2000
end
+
end</lua>
  
в диалог  
+
в диалог:
  
 
<precondition>имя скрипта.название функции</precondition>
 
<precondition>имя скрипта.название функции</precondition>
Строка 319: Строка 322:
 
Использовал на ТЧ, но и в ЗП работает
 
Использовал на ТЧ, но и в ЗП работает
  
function название функции()
+
<lua>function название функции()
 
return db.actor:money()>=10000
 
return db.actor:money()>=10000
end
+
end</lua>
в диалог  
+
в диалог:
  
<precondition>имя скрипта.название функции</precondition>
+
<code><precondition>имя скрипта.название функции</precondition></code>
  
 
СПАВН ПРЕДМЕТА
 
СПАВН ПРЕДМЕТА

Версия 15:07, 31 июля 2013

ПРЕДИСЛОВИЕ

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


Итак начнём. Рассмотрим простой скрипт спавна предмета:

--*********************************************
--**TESTING**
--*********************************************
--
-- Создает в заданном месте калаш
function ak_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


ИМЯ ФУНКЦИИ function - всегда обязательное поле, это что то вроде id, в языке LUA. После поля function отступаем и пишем текст произвольный. Дальше идёт функциия о позиции, она обязательна для спавна скриптом. Ниже кординаты. Для снятия кординат используем в консоли rs_stats on. После кординат идёт сама функция спавна. alife():create("СИСТЕМНОЕ ИМЯ ОБЬЕКТА",a,33447,47,65535) Цифры пусть остануться такие же. Для обьекта спавна возмём wpn_ak47. Кординаты какие то левые, лучше снимите кординаты сами. И ещё кое что важное. В папке scripts, создаём файл main.script и пишем туда готовый текст, только со своими кординатами.

--*********************************************
--**TESTING**
--*********************************************
--
-- Создает в заданном месте калаш
function ak_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

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

<action>main.ak_create</action>

ТОЛЬКО ДИАЛОГ ВЫБИРАЕМ ИСПОЛЬЗУЮЩИЙСЯ. С волком например. Всё сохраняем и тестим. В итоге, когда вы в игре нажмёте на фразу после которой находится action, заспауниться калаш на указанных кординатах.


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

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

if =

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

end

ПОКА ВСЁ, МОЖЕТ НАПИШУ ЕЩЁ ЧЁ НИТЬ ПОЛЕЗНОЕ

Ну и я напишу.Меченый(Стрелок)

Мой монолог построен так: В - Вопрос,О - Ответ

Начнём: В - Что такое ЦИКЛ? И как он выглядит? О - Цикл это повторение одного и того же действие n-ое кол-во раз выглядит так

for i=1,n do

end

За место i может быть любая переменная ,за место n - число которое больше первоначального значения(i) В - А для чего можно использовать цикл? О - много для чего можно.см. ниже Пример 1.Перебор по id/Узнаем монстор ли объект,если да ,то функция возвращает истину(true)

for id=1,65535 do
local obj = level.object_by_id(id)
if obj~= nil then
if IsMonster(obj) then
return true
else
return false
end
end
end

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

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

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

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

Параметры:

radiation
health
psy_health
power

В - а можно ли спавнить в рандомной точке предмет,если да,то как? О - можно Для этого нам понадобится таблица максимальных значений 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.Создаем файл ваше_название_скприпта.script в папке gamedata/scripts 2. Открываем его и пишем: --меняем группировку ГГ

function new_group(actor, npc)
if npc:character_community() ~= "(dolg)" then 
npc:set_character_community("dolg", 0, 0) 
end
end

Выдаём функцию при разговоре с НПС

НПС вступает в группировку

function ваше_название_функции(npc, actor)

Вызываем также, из любого диалога


Нельзя взять оружие без брони Пишем функцию в любом скрипе:

function ваше_название_функции()
local armor = db.actor:item_in_slot(6) --слот брони (НЕ ТРОГАТЬ!)
local weapon = db.actor:item_in_slot(2) --слот оружия (для пистолетов в оригинале слот 1)
 
if db.actor:active_slot()==2 and weapon then -- за место 2 пишем слот оружия еще раз
local tmp
if armor then
tmp = armor:section()
else
tmp = "none"
end
if (not string.find(tmp, "пишем_название_брони" )) and (weapon:section()=="пишем_название_оружия1" or weapon:section()=="пишем_название_оружия2" or weapon:section()=="пишем_название_оружия3") then --если необходима проверка одного оружия то надо писать так: if (not string.find(tmp, "exo" )) and weapon:section()=="wpn_pkm" then
db.actor:drop_item(weapon)
local tmpw = amk.spawn_item_in_inv(weapon:section())
db.actor:transfer_item(weapon,db.actor)
alife():release(tmpw)
news_manager.send_tip(db.actor,"Невозможно взять пулемёт в руки без экзы",nil,nil,10000)
end
end

Далее идем по пути gamedata/script/bind_stalker.script Функция:

function actor_binder:update(delta)

Сразу ниже неё пиши вызов в формате :

название_файла.название_функции

Можешь написать эту функцию в любом файле из папки scripts, а можешь создать свой файл и назвать, скажем, my_script, и написать там. Должно быть так : Код

function actor_binder:update(delta)
my_script.check_armor()


Удаление предмета из инвентаря

function name_function()
local se_obj = alife():object("сюда_пишем_что_удалять_будем")
if se_obj then
alife():release(se_obj, true)
end
end

ПРИМЕР --' убираем финального Клыка

function dell_kluk_final()
local se_obj = alife():object("final_kluk")
if se_obj then
alife():release(se_obj, true)
end
end


Я добвлю может кому и пригодится.Болотный Доктор

        ВЫДАЁМ ПРЕДМЕТ АКТОРУ
function название функции (first_speaker, second_speaker)
dialogs.relocate_item_section(second_speaker, "название предмета", "in") 
end

Размещается в файлах скрипт.

Выдача поршня вставляется под строку действия.

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

Примечание, что бы выдать два одинаковых предмета пишем

function название функции (first_speaker, second_speaker)
dialogs.relocate_item_section(second_speaker, "название предмета", "in",2) 
end

Если надо больше меняем цифру 2 на нужную нам.

     ОТБИРАЕМ ПРЕДМЕТ У АКТОРА.
function название функции(first_speaker, second_speaker)
    dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "название предмета")
end

размещается в файлах скрипт

выдача поршня вставляется под строку действия:

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

Примечание, что бы отобрать два одинаковых предмета пишем

function название функции(first_speaker, second_speaker)
    dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "название предмета",2)
end

Если надо больше меняем цифру 2 на нужную нам.

     СПАВНИМ ВЕЩЬ В РЮКЗАК гг
function название функции()
local obj = alife():create("ВЕЩЬ", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
end

В диалог:

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


ПРОВЕРКА НАЛИЧИЯ У АКТОРА ПРЕДМЕТА Вариант первый

function Название функции()
    if db.actor:object("название предмета") then
        return true
    end
    return false
end

в диалог:

<precondition>имя скрипта.название функции</precondition>

<---------Вариант второй)------------------>

function название функции(first_speaker, second_speaker)
    return first_speaker:object("название предмета") ~= nil
end

в диалог:

<precondition>имя скрипта.название функции</precondition>

ПРОВЕРКА ВЕЩЕЙ У ГГ

function Название функции(first_speaker, second_speaker)
    return first_speaker:object("название предмета") ~= nil or
             first_speaker:object("название предмета") ~= nil or
             first_speaker:object("название предмета") ~= nil
end

в диалог:

<precondition>имя скрипта.название функции</precondition>

описание... если есть хотя бы одна вещь, то мы получим фразу, если нет всех нет разговора

ПРОВЕРКА ДЕНЕГ У ГГ Вариант первый(используют ПЫС)

function название функции(first_speaker, second_speaker)
    return first_speaker:money() >= 2000
end

в диалог:

<precondition>имя скрипта.название функции</precondition>

<-----------Вариант два--------------> Использовал на ТЧ, но и в ЗП работает

function название функции()
return db.actor:money()>=10000
end

в диалог:

<precondition>имя скрипта.название функции</precondition>

СПАВН ПРЕДМЕТА function spawn_vintar() alife():create("Название предмета",vector():set(24.725412368774,-3.6072344779968,173.83030700684),993926,210) end

В диалог

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


МГНОВЕННАЯ СМЕРТЬ ГГ function название функции(npc, actor)

   npc:kill(actor)

end

В диалог

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

ПРОВЕРКА КОЛ_ВА ОДИНАКОВЫХ ПРЕДМЕТОВ function название функции(first_speaker, second_speaker)

       local item_sections = {"Предмет"} 
       local needed = количество одинаковых предметов, ставится цифра без знаков 
       local count = 0
       local item_section
   local function calc(temp, item)
       if item:section() == item_section then
       count = count + 1

end end

   for k,v in pairs(item_sections) do
   item_section = v
   get_story_object("actor"):iterate_inventory(calc, actor)

end

   return count >= needed

end


в диалог <precondition>имя скрипта.название функции</precondition>

ЛЕЧЕНИЕ ГГ Вставим этот актион в диалог

<action>dialogs.medic_magic_potion</action>

ВЫДАЧА ДЕНЕГ от НПС ГГ

function название функции(first_speaker, second_speaker)

   dialogs.relocate_money_to_actor(first_speaker, second_speaker, 2000)

end

В диалог

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


ВЫДАЧА ДЕНЕГ от ГГ НПС

function название функции(actor, npc)

  dialogs.relocate_money(npc,кол-во,"out")   

end

В диалог

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


НПС становится врагом после определенной ветки диалона или другом -5000 враг 5000 друг


function название скрипта(actor, npc)

   npc:force_set_goodwill(-5000, actor)

end


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


ПРОВЕРКА СМЕРТТИ NPS

function название функции проверки(actor,npc)

  return has_alife_info("инфо смерти")

end


в диалог

<precondition>имя скрипта.название функции</precondition>

Другие места
LANGUAGE