..::STALKER.BY::.. http://stalker.by/forum/ |
|
Начальные сведения о скриптах http://stalker.by/forum/viewtopic.php?f=534&t=3446 |
Страница 1 из 1 |
Автор: | СКАУТ [ 16 июн 2011, 16:22 ] |
Заголовок сообщения: | Начальные сведения о скриптах |
Взято с - http://stalkerin.gameru.net/ Начальные сведения о скриптах ПРЕДИСЛОВИЕ Для чего нужны срипты и сведения и их использовании - 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() Далее помещаем вызов функции в bind_stalker.script в net_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 Вступление ГГ в группировку! 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> Категория: Скрипты Просьба не оставлять коментарии типа: "спасибо за инфу", "прикольно" ну и т.п. |
Автор: | BLINKoman182oldDAEM [ 16 июн 2011, 16:28 ] |
Заголовок сообщения: | Re: Начальные сведения о скриптах |
Не, я лучше пойду PHP учить ))) Но статейка классная!) |
Автор: | barmidrol [ 21 июн 2011, 18:43 ] |
Заголовок сообщения: | Re: Начальные сведения о скриптах |
BLINKoman182oldDAEM писал(а): Не, я лучше пойду PHP учить ))) Правильное решение |
Автор: | Xuligan [ 23 авг 2011, 20:43 ] |
Заголовок сообщения: | Re: Начальные сведения о скриптах |
Согласен с вами |
Страница 1 из 1 | Часовой пояс: UTC + 2 часа [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |