Начальные сведения о скриптах — различия между версиями
Материал из S.T.A.L.K.E.R. Inside Wiki
(оформление, орфография) |
|||
Строка 12: | Строка 12: | ||
<br clear="both" /> | <br clear="both" /> | ||
− | + | Итак начнём. Рассмотрим простой скрипт спавна предмета: | |
− | --********************************************* | + | <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</ | + | 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 и пишем туда готовый текст, только со своими кординатами. | ||
− | < | + | <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</ | + | 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) | ||
− | < | + | <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</ | + | end</lua> |
Пример 2.Спавн/ | Пример 2.Спавн/ | ||
− | < | + | <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</ | + | 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'' |
выглядит она так: | выглядит она так: | ||
− | < | + | <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} | ||
− | }</ | + | }</ini> |
ЗЫ:Извините ,что не для всех уровней,исправлюсь | ЗЫ:Извините ,что не для всех уровней,исправлюсь | ||
Строка 126: | Строка 129: | ||
(Я буду использовать свои наработки ,поэтому таких секции у вас не будет ,эта таблица -пример) | (Я буду использовать свои наработки ,поэтому таких секции у вас не будет ,эта таблица -пример) | ||
− | < | + | <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" | ||
− | }</ | + | }</lua> |
Таблицу записали ,наконец приступим к оформлению главной функции | Таблицу записали ,наконец приступим к оформлению главной функции | ||
− | < | + | <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</ | + | 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. Открываем его и пишем: | ||
--меняем группировку ГГ | --меняем группировку ГГ | ||
− | < | + | <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</ | + | 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> |
− | < | + | <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</ | + | end</lua> |
− | Далее идем по | + | Далее идем по пути '''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''', и написать там. |
Должно быть так : | Должно быть так : | ||
Код | Код | ||
− | < | + | <lua>function actor_binder:update(delta) |
− | my_script.check_armor()</ | + | my_script.check_armor()</lua> |
<big>Удаление предмета из инвентаря</big> | <big>Удаление предмета из инвентаря</big> | ||
− | < | + | <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</ | + | end</lua> |
ПРИМЕР | ПРИМЕР | ||
--' убираем финального Клыка | --' убираем финального Клыка | ||
− | < | + | <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</ | + | 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
ПРЕДИСЛОВИЕ
Для чего нужны срипты и сведения и их использовании - 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, заспауниться калаш на указанных кординатах.
Углублённое изучение - 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>