Начальные сведения о скриптах — различия между версиями
Материал из S.T.A.L.K.E.R. Inside Wiki
Oxygenium (обсуждение | вклад) |
|||
| Строка 5: | Строка 5: | ||
backgroundcolor = #f9f9f9| | backgroundcolor = #f9f9f9| | ||
image =Lamp.gif| | image =Lamp.gif| | ||
| − | heading = Для чего нужны срипты и сведения и их использовании - Rez@niy| | + | heading = Для чего нужны срипты и сведения и их использовании - Rez@niy aka Oxygenium| |
message = В скриптах содержаться данные для выполнения по условиям. | message = В скриптах содержаться данные для выполнения по условиям. | ||
| Строка 152: | Строка 152: | ||
Далее помещаем вызов функции в bind_stalker.script в net_spawn() и при каждой загрузке будут спавнится мобы в рандомной точке | Далее помещаем вызов функции в bind_stalker.script в net_spawn() и при каждой загрузке будут спавнится мобы в рандомной точке | ||
[[Категория:Скрипты]] | [[Категория:Скрипты]] | ||
| + | |||
| + | <big>Вступление ГГ в группировку!</big> | ||
| + | 1.Создаем файл ваше_название_скприпта.script в папке gamedata/scripts | ||
| + | 2. Открываем его и пишем: | ||
| + | --меняем группировку ГГ | ||
| + | <pre>function new_group(actor, npc) | ||
| + | if npc:character_community() ~= "(dolg)" then | ||
| + | npc:set_character_community("dolg", 0, 0) | ||
| + | end | ||
| + | end</pre> | ||
| + | Выдаём функцию при разговоре с НПС | ||
| + | |||
| + | НПС вступает в группировку | ||
| + | <pre>function ваше_название_функции(npc, actor)</pre> | ||
| + | Вызываем также, из любого диалога | ||
| + | |||
| + | |||
| + | <big>Нельзя взять оружие без брони</big> | ||
| + | Пишем функцию в любом скрипе: | ||
| + | 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 | ||
| + | |||
| + | <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 | ||
| + | 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</pre> | ||
| + | |||
| + | Далее идем по этому пути <pre>gamedata/script/bind_stalker.script</pre> | ||
| + | Функция <pre>function actor_binder:update(delta)</pre> | ||
| + | Сразу ниже неё пиши вызов в формате : | ||
| + | название_файла.название_функции. | ||
| + | Можешь написать эту функцию в любом файле из папки scripts, а можешь создать свой файл и назвать скажем my_script и написать там. | ||
| + | Должно быть так : | ||
| + | Код | ||
| + | <pre>function actor_binder:update(delta) | ||
| + | my_script.check_armor()</pre> | ||
| + | |||
| + | |||
| + | <big>Удаление предмета из инвентаря</big> | ||
| + | |||
| + | <pre>function name_function() | ||
| + | local se_obj = alife():object("сюда_пишем_что_удалять_будем") | ||
| + | if se_obj then | ||
| + | alife():release(se_obj, true) | ||
| + | end | ||
| + | end</pre> | ||
| + | |||
| + | ПРИМЕР | ||
| + | --' убираем финального Клыка | ||
| + | <pre>function dell_kluk_final() | ||
| + | local se_obj = alife():object("final_kluk") | ||
| + | if se_obj then | ||
| + | alife():release(se_obj, true) | ||
| + | end | ||
| + | end</pre> | ||
Версия 14:38, 19 мая 2010
ПРЕДИСЛОВИЕ
| |
Для чего нужны срипты и сведения и их использовании - 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