Модостроение. Редактирование и создание скриптов
|
|
denis2000 | Дата: Пн, 10.10.2011, 21:17 | Сообщение # 1 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Редактирование и создание скриптов Редактирование и создание скриптов на языке LUA Если у вас появились вопросы по применению скриптов в игре. Задавайте их в этой теме - умные головы, модосторители и просто разбирающиеся в программировании люди вам ответят.
Много интересного материала здесь (wiki), Lua_help.script, Help из SDK 0.7
Сборник модостроения ЗП v10.10.11 (автор: XOBAH): *.CHM, *.HTML [cut noguest=Если у вас не открывается файл CHM]Если у вас не открывается файл: 1. Запустите [Пуск]=>[Выполнить] (либо хот-кей [WIN]+[R]) 2. Введите команду (без кавычек) "regsvr32 %windir%\system32\hhctrl.ocx" 3. Если вылезло окно об успешном завершении вы все сделали правильно и можете перезагружать компьютер (а может и не надо) Также: файлы МОГУТ не открываться если в пути к файлу есть: символы кириллицы, "_", "#" Также: есть не стандартные программы-просмоторщики CHM файлов. Например: FBReader[/cut]
[cut=Где найти лог игры после вылета]Что такое LOG ошибки, и как мне его найти? Это система отладки происходивших вылетов, которая подается игрой в форме текста, хотя не всегда. Для того чтоб найти LOG необходимо зайти вот сюда:
В Win хр лог находится:
C:\Documents and Settings\All Users\Документы\S.T.A.L.K.E.R. - Зов Припяти\logs
Затем открываете первый файл в формате TXT, и в нем отбираете с низу 25 строчек. После кидаете эти 25 строчек в сообщение на форум.
В Win7 лог находится C:\Users\Public\Documents\S.T.A.L.K.E.R. - Зов Припяти\logs
Путь к папке с логом можно найти открыв файл fsgame.ltx который находится в корневой директории ЗП, за это отвечает строка: ... $app_data_root$ = true | false| $fs_root$| users\(тут мы указываем что папка пользователя, будет хранится рядом с Fsgame.ltx) ... $logs$ = true| false| $app_data_root$| logs\(а тут мы указываем что в папке пользователя, в подпапке Logs будут храниться наши логи) ... [/cut][cut=Получение более подробной информации о вылете (ХОВАН)] Открываем файл _g.script и ищем такую функцию: function abort(fmt, ...) Там есть заккомментированная строчка "--error_log(reason)", ее и надо расскомментировать, должно получиться вот так: Code function abort(fmt, ...) local reason = string.format(fmt, ...) error_log(reason) end Вот для примера два одинаковых вылета, первый с функцией по умолчанию, второй - с поправленной функцией
Первый: Code Expression : !m_error_code Function : raii_guard::~raii_guard File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp Line : 748 Description : ....a.l.k.e.r. - Зов Припяти\gamedata\scripts\_g.script:478: bad argument #2 to 'format' (string expected, got nil) Второй: Code Expression : 0 Function : ErrorLog File : D:\prog_repository\sources\trunk\xrServerEntities\script_engine_script.cpp Line : 49 Description : 'Attempt to read a non-existant string field 'path_walk' in section 'walker@mechanic' [/cut]
Перед тем, как задать вопрос в этой теме, прочтите все предыдущие страницы, статьи в wiki по ссылке из шапки и соседнюю тему "Курс молодого бойца", возможно Ваш вопрос уже рассматривался.
Если произошел вылет - выкладываем лог! Вопрос ставим четко, не забываем указывать версию игры, установленные моды их версии, установленные фиксы модов и подробно ваши правки. Помните чем подробнее вопрос, тем точнее ответ.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
denis2000 | Дата: Вт, 29.11.2011, 18:49 | Сообщение # 31 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Expl0id, В скрипте xr_conditions.script есть функция is_day. Возвращает истину если время от 6 до 21 часа. Аналогично в скрипте utils.script тоже есть функция is_day Она возвращает истину если время то 5 до 22.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
Xecator | Дата: Вт, 29.11.2011, 19:15 | Сообщение # 32 |
Отмычка
Пользователи
Сообщений: 31
| Quote (Expl0id) Вообщето разные секции погоды для разного времени суток Я так сначала и подумал, поискал там ночные... В итоге я вывел в сообщении название секции: час ночи, секция af3_slight_foggy. slight - это дневная секция. В общем там надо прописать так, чтобы перед тем как искать название секции он проверил ночной интервал, если ночь, то выводит соответствующее сообщения, если нет то пошел дальше. Как это сделать именно в news.script?
|
|
|
Эти 0 пользователя(ей) поблагодарили Xecator за это полезное сообщение: |
|
|
denis2000 | Дата: Вт, 29.11.2011, 20:55 | Сообщение # 33 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Expl0id, Проверять можно так:Code if utils.is_day then <Дневные сообщения> else <Ночные сообщения>
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
stalex | Дата: Вт, 29.11.2011, 20:55 | Сообщение # 34 |
Гражданский
Пользователи
Сообщений: 15
| Подскажите как сделать что-бы при использовании аптечек, антирад. и т. д. убирался худ рук?
Сделать колбек на использование этих предметов (посмотри как реализовано в SGM) и в обработчике убрать руки коммандой db.actor:hide_weapon() и запустить таймер до возврата, в обработчике таймера вернуть коммандой db.actor:restore_weapon(). denis2000
denis2000 не подскажешь в каких файлах это всё находится?
В тех в которых ты эти скрипты сам разместишь, пример на SGM посмотри или в Сборник модостроения ЗП v10.10.11 (автор: XOBAH) Раздел скрипты пункт 43. denis2000
А как таймер ставится?
Сообщение отредактировал stalex - Вт, 17.01.2012, 19:35 |
|
|
Эти 0 пользователя(ей) поблагодарили stalex за это полезное сообщение: |
|
|
12Legion21 | Дата: Вт, 29.11.2011, 20:55 | Сообщение # 35 |
Гражданский
Пользователи
Сообщений: 2
| У меня вопрос: как можно изменить количество устанавливаемого динамита на один детонатор, в каких конфигах что нужно менять, подскажите пожалуйста SGM 2.0
Сообщение отредактировал 12Legion21 - Пн, 16.01.2012, 17:51 |
|
|
Эти 0 пользователя(ей) поблагодарили 12Legion21 за это полезное сообщение: |
|
|
denis2000 | Дата: Пн, 16.01.2012, 21:06 | Сообщение # 36 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| 12Legion21, Сам не пробовал, дерзай: [cut]В файле sgm_callbacks.script после Code detonate_remote_charge(sgm_functions.read_variable("remote_charge_3_id"),3) добавь дотонации до нужного количества Code detonate_remote_charge(sgm_functions.read_variable("remote_charge_4_id"),4) detonate_remote_charge(sgm_functions.read_variable("remote_charge_5_id"),5) В файле _g.script измени условия в функциях get_remote_charge_installed() и get_remote_charge_full_installed() Например вот так: Code sgm_functions.read_variable("remote_charge_1_id")~=0 or sgm_functions.read_variable("remote_charge_2_id")~=0 or sgm_functions.read_variable("remote_charge_3_id")~=0 or sgm_functions.read_variable("remote_charge_4_id")~=0 or sgm_functions.read_variable("remote_charge_5_id")~=0 Code sgm_functions.read_variable("remote_charge_1_id")~=0 and sgm_functions.read_variable("remote_charge_2_id")~=0 and sgm_functions.read_variable("remote_charge_3_id")~=0 and sgm_functions.read_variable("remote_charge_4_id")~=0 and sgm_functions.read_variable("remote_charge_5_id")~=0 В файле sgm_variables.script добавь после Code sgm_functions.set_safe_variable("remote_charge_3_id") sgm_functions.set_safe_variable("remote_charge_3_timer") строки Code sgm_functions.set_safe_variable("remote_charge_4_id") sgm_functions.set_safe_variable("remote_charge_4_timer") sgm_functions.set_safe_variable("remote_charge_5_id") sgm_functions.set_safe_variable("remote_charge_5_timer") В файле sgm_modules.script после Code elseif sgm_functions.read_variable("remote_charge_3_id")==0 then sgm_functions.write_variable("remote_charge_3_id",id) if ui_mod_elements.cfg_remote_charge_delay~=0 then sgm_functions.write_variable("remote_charge_3_timer",ui_mod_elements.cfg_remote_charge_delay) end добавь строки Code elseif sgm_functions.read_variable("remote_charge_4_id")==0 then sgm_functions.write_variable("remote_charge_4_id",id) if ui_mod_elements.cfg_remote_charge_delay~=0 then sgm_functions.write_variable("remote_charge_4_timer",ui_mod_elements.cfg_remote_charge_delay) end elseif sgm_functions.read_variable("remote_charge_5_id")==0 then sgm_functions.write_variable("remote_charge_5_id",id) if ui_mod_elements.cfg_remote_charge_delay~=0 then sgm_functions.write_variable("remote_charge_5_timer",ui_mod_elements.cfg_remote_charge_delay) end Что-то вроде этого. Еще раз говорю инструкцию не опробовал - дерзай сам. [/cut]
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
dandy-91 | Дата: Вт, 17.01.2012, 09:37 | Сообщение # 37 |
Гражданский
Пользователи
Сообщений: 9
| Подскажите сайт в котором можно изучить язык lua!
Добавлено (17.01.2012, 09:37) --------------------------------------------- Я обнаружил у себя хорошие способности в turbo paskal(турбо паскаль)! Вопрос: похожи ли турбо паскаль и lua?
Сайт. Не, не похожи, разве что только самые что ни на есть базовые понятия алгоритмов и т.д.... XOBAH
Знания языков высокого уровня (Pascal, Cи) приветствуется, особенно объектно ориентированные. denis2000
Моддинг это Жизнь! Нужен человек разбирающийся в скриптах и в создании моделей в команду мода lost soul для ЗП! Пишите в личку!
|
|
|
Эти 0 пользователя(ей) поблагодарили dandy-91 за это полезное сообщение: |
|
|
AnarxisT | Дата: Вт, 17.01.2012, 14:30 | Сообщение # 38 |
Тень «Свободы»
Свобода
Сообщений: 7317
| Приветствую! Хочу вот добавить оружия, а до конца не так и не разобрался из Урока какие именно скрипты нужно затрагивать при этом. Не подскажите? Заранее благодарен.
Никакие. Перенос оружия не связан со скриптами. denis2000
|
|
|
Эти 0 пользователя(ей) поблагодарили AnarxisT за это полезное сообщение: |
|
|
denis2000 | Дата: Вт, 17.01.2012, 21:40 | Сообщение # 39 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| stalex, Например простенкий таймер: [cut] В файле bind_stalker.script в функции actor_binder:use_inventory_item прописать вызов колбека: Code ---Вызов колбеков использования предметов инвентаря if obj~=nil then mod_use_callback.use_inventory_item(obj,self) end в функции actor_binder:update прописать вызов функции обработки таймера: Code --Отработка таймеров использования предметов mod_use_callback.timer_use_item(self) В созданном скрипте mod_use_callback.script сделать функции: Code function use_inventory_item(section,self) local item_name=section:section() if item_name == "bread" and db.actor:has_info("actor_use_item") == false then start_time_use_item = game.get_game_time() db.actor:hide_weapon() db.actor:give_info_portion("actor_use_item") end end
function timer_use_item(self) local time_to_use = 60 --Игровые секунды, время использования предмета if db.actor:has_info("actor_use_item") then if (start_time_use_item == nil or game.get_game_time():diffSec(start_time_use_item) >= time_to_use) then db.actor:restore_weapon() db.actor:disable_info_portion("actor_use_item") end end end [/cut]
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
stalex | Дата: Ср, 18.01.2012, 13:59 | Сообщение # 40 |
Гражданский
Пользователи
Сообщений: 15
| denis2000 а как эти функции сделать для нескольких предметов?
С первой я разобрался Code function use_inventory_item(section,self) local item_name=section:section() if item_name == "medkit" and db.actor:has_info("actor_use_item") == false then start_time_use_item = game.get_game_time() db.actor:hide_weapon() db.actor:give_info_portion("actor_use_item") elseif item_name == "bandage" and db.actor:has_info("actor_use_item") == false then start_time_use_item = game.get_game_time() db.actor:hide_weapon() db.actor:give_info_portion("actor_use_item") end end [/cut] А с таймером не могу разобраться. Время на все предметы одинаковое.
Сообщение отредактировал stalex - Ср, 18.01.2012, 14:00 |
|
|
Эти 0 пользователя(ей) поблагодарили stalex за это полезное сообщение: |
|
|
denis2000 | Дата: Ср, 18.01.2012, 14:31 | Сообщение # 41 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| stalex, Code function use_inventory_item(section,self) local item_name=section:section() if item_name == "bread" and db.actor:has_info("actor_use_item") == false then start_time_use_item = game.get_game_time() db.actor:hide_weapon() db.actor:give_info_portion("actor_use_item") db.actor:give_info_portion("actor_use_bread") elseif item_name == "bandage" and db.actor:has_info("actor_use_item") == false then start_time_use_item = game.get_game_time() db.actor:hide_weapon() db.actor:give_info_portion("actor_use_item") db.actor:give_info_portion("actor_use_bandage") end end
function timer_use_item(self) local time_to_use_bread = 60 --Игровые секунды, время использования предмета хлеб local time_to_use_bandage = 60 --Игровые секунды, время использования предмета бинт if db.actor:has_info("actor_use_item") then if db.actor:has_info("actor_use_bread") and (start_time_use_item == nil or game.get_game_time():diffSec(start_time_use_item) >= time_to_use_bread) then db.actor:restore_weapon() db.actor:disable_info_portion("actor_use_item") db.actor:disable_info_portion("actor_use_bread") end if db.actor:has_info("actor_use_bandage") and (start_time_use_item == nil or game.get_game_time():diffSec(start_time_use_item) >= time_to_use_bandage) then db.actor:restore_weapon() db.actor:disable_info_portion("actor_use_item") db.actor:disable_info_portion("actor_use_bandage") end end end
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
stalex | Дата: Ср, 25.01.2012, 10:16 | Сообщение # 42 |
Гражданский
Пользователи
Сообщений: 15
| Скажите, возможно ли сделать ограничение рюкзака не только по весу, но и по количеству? Например, ограничение на аптечки, не по 40 штук таскать, а например по 10.
Обрабатывать событие "получение предмета ГГ" (колбек actor_binder:on_item_take). Проверять, что количество предметов, одинакового типа с только что полученным, не вышло за границы, а если вышло лишние предметы удалять из инвентаря и спавнить аналоги под ноги ГГ. denis2000
Функцию спавна возле ГГ не подскажите? Никак не могу сообразить
Сообщение отредактировал stalex - Пт, 27.01.2012, 04:57 |
|
|
Эти 0 пользователя(ей) поблагодарили stalex за это полезное сообщение: |
|
|
denis2000 | Дата: Пт, 27.01.2012, 16:40 | Сообщение # 43 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| stalex, Code local p=vector(),lv,gv p.x=db.actor:position().x+0,1 p.y=db.actor:position().y p.z=db.actor:position().z lv=db.actor:level_vertex_id() gv=db.actor:game_vertex_id() alife():create(<переменная-имя секции предмета>,p,lv,gv)
или еще лучше: Code db.actor:drop_item(<Объкт-предмет>)
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
stalex | Дата: Вт, 31.01.2012, 15:01 | Сообщение # 44 |
Гражданский
Пользователи
Сообщений: 15
| Как поставить метку на карте на предмет? Скриптовым путём. Вот функция ставить метку, не могу в ней разобраться. Помогите! И вообще та ли эта функция?
Code function set_spot_choose(obj_id,location_name,type,descr) if type=="hide" and obj_id~=nil then remove_spot_on_map(obj_id,location_name) elseif type=="show" and obj_id~=nil then add_spot_on_map(obj_id,location_name,descr) end end
|
|
|
Эти 0 пользователя(ей) поблагодарили stalex за это полезное сообщение: |
|
|
denis2000 | Дата: Вт, 31.01.2012, 15:46 | Сообщение # 45 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| stalex, Можешь использовать: 1) set_spot_choose(obj_id,location_name,type,descr) 2) add_spot_on_map(obj_id,location_name,descr) 3) xr_effects.add_map_spot(actor, npc, p), где p[1]=obj_id p[2]=location_name p[3]=descr 4) level.map_add_object_spot_ser(obj_id,location_name,descr) Разница в том, что четвертая - движковая функция, а первые три скриптовые которые так или иначе в итоге вызывают последнюю. Параметры функций: obj_id - (целое положительное число) уникальный идентификатор объекта на уровне location_name - (строка) имя графического образа метки (тег из файла map_spots.xml или map_spots_16.xml) descr - (строка) описание type - (строка) тип действия, принимает значения "show" - показать метку, "hide" - убрать метку
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
|