Модостроение. Редактирование и создание скриптов
|
|
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 за это полезное сообщение: |
|
|
gamer | Дата: Вс, 14.09.2014, 16:58 | Сообщение # 541 |
Новичок
Пользователи
Сообщений: 82
| подскажите в каком скрипте в ЗП находится функции потребности еды,сна?
В ЗП этого нет! Так, что говорим правду и только правду об установленном моде. denis2000
Сна нет,но голод есть .....
Подскажите где искать
Голод в движке, и особенно не влияет на геймплей. Разве что при минимальной сытости ограничены сила ГГ, но это не смертельно. Поэтому если хочешь полноценный голод и сонливость сделай скриптами сам или возьми готовые из другого мода. denis2000
Сообщение отредактировал gamer - Пн, 15.09.2014, 13:40 |
|
|
Эти 0 пользователя(ей) поблагодарили gamer за это полезное сообщение: |
|
|
sergej5500 | Дата: Пт, 19.09.2014, 09:59 | Сообщение # 542 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Всем добрый день.
На базе Рассвета в СГМ добавил торговца. По сюжету база должна погибнуть. Убиваю торговца командой kill_squad из рестриктора квестовой линии.
После смерти торговца вижу это.
То есть у торговца сохранился ассортимент после гибели. Какой функцией можно воспользоваться для очисти инвентаря непися?
Готовой функции нет ее надо писать. Если труп не сильно нужен, просто удали объект вместо убийства. denis2000
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
makdm | Дата: Пт, 19.09.2014, 10:58 | Сообщение # 543 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| sergej5500, в SGM моде предусмотрено удаление лута торговцев в случае их гибели. Файл death_manager.script
Строки if find_in_string(self.npc:section(),"_trader") then self.npc:iterate_inventory(release_all_immediately,self.npc) end
Здесь вызывается функция release_all_immediately, которая также есть в этом файле. Как видно проверка идёт по секции торговца и в этом случае, чтобы скрипт сработал, необходимо, чтобы в секции торговца была запись _trader дописанная, как правило в конце.
Например: zat_b15_stalker_trader
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
sergej5500 | Дата: Пт, 19.09.2014, 11:39 | Сообщение # 544 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| makdm,
[cut=Секции торговца] [mil_rasvet_base_trader]:quest_stalker_heavy $spawn = "respawn\mil_rasvet_base_trader" character_profile = mil_rasvet_base_trader spec_rank = master community = rasvet story_id = mil_rasvet_base_trader
[mil_rasvet_base_trader_squad]:online_offline_group faction = rasvet npc = mil_rasvet_base_trader target_smart = mil_smart_terrain_7 spawn_point = mil_rasvet_base_trader_spawn story_id = mil_rasvet_base_trader_squad[/cut]
Кончаются словом _trader.
[cut=Логика][logic@mil_rasvet_base_trader] active = walker@mil_rasvet_base_trader suitable = {=check_npc_name(mil_rasvet_base_trader)} true prior = 300 level_spot = trader trade = misc\trade\order_traders\agr_rasvet_base_trader.ltx
[walker@mil_rasvet_base_trader] path_walk = mil_rasvet_base_trader_walk path_look = mil_rasvet_base_trader_look gather_items_enabled = false help_wounded_enabled = false corpse_detection_enabled = false combat_ignore_cond = true combat_ignore_keep_when_attacked = true meet = meet invulnerable = {+mil_defence_b7_start} false, {-mil_alt_storyline_commenced} true, false
[meet] use = {!actor_enemy !actor_has_weapon !has_enemy} true, false allow_break = false trade_enable = true[/cut]
Функция очистки инвентаря должна работать. Может, она работает только если непись погиб от внешних причин и не срабатывает при команде kill_squad?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
makdm | Дата: Пт, 19.09.2014, 13:50 | Сообщение # 545 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| sergej5500, от команды это не зависит. А вот зависит от того - находится объкет online или offline Если вы убиваете сквад, который OFFline, то классу drop_manager из death_manager.script не передаётся управление. Поэтому убивать сквад нужно, когда он online. В логике работы сквада пишите:
on_info = {условие_убийства_ сквада =dist_to_actor_le(150)} %=kill_squad(story_id_сквада)%
где 150 - это switch_distance В этом случае сразу после перехода сквада ONline произойдёт его убийство и чистка лута выполнится.
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
GhosT1803 | Дата: Пн, 29.09.2014, 07:59 | Сообщение # 546 |
Удаленные
| FATAL ERROR [error]Expression : !m_error_code [error]Function : raii_guard::~raii_guard [error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp [error]Line : 748 [error]Description : ... - Зов Припяти\gamedata\scripts\xr_conditions.script:131: attempt to index local 'npc_job' (a nil value)
Подскажите ламеру ребят, что делать?
|
|
|
Эти 0 пользователя(ей) поблагодарили GhosT1803 за это полезное сообщение: |
|
|
makdm | Дата: Пн, 29.09.2014, 08:59 | Сообщение # 547 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата GhosT1803 ( ) Подскажите ламеру ребят, что делать? Прочитать шапку темы. Особенно то, что выделено жёлтым цветом. И попробовать снова задать вопрос.
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
sergej5500 | Дата: Вс, 12.10.2014, 14:52 | Сообщение # 548 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Всем добрый день. В ходе создания дополнения для СГМ 2.1 два раза встретился с такими логами.
[cut=Лог]FATAL ERROR
[error]Expression : error handler is invoked! [error]Function : invalid_parameter_handler [error]File : D:\prog_repository\sources\trunk\xrCore\xrDebugNew.cpp [error]Line : 815 [error]Description :
stack trace:[/cut]
Оба раза вылеты были как-то связаны с применением дистанционной взрывчатки.
Первый случай на Армейских Складах. Там надо было подорвать нору мутантов. Тогда я не заметил связи вылета со взрывчаткой.
Сегодня тестировал квест на Кордоне. По сюжету игрок вместе со сталкерами должен будет зачистить отряд бандитов на ферме севернее моста. До первого выстрела по бандитам они нейтральны к игроку. До начала квеста заложил на ферме заряд и ушел к квестодателю в деревню, где бункер Сидоровича. Между фермой и деревней 300-400 метров. То есть заложенный заряд оказался в оффлайне. После начала квеста вернулся к мосту. Заряд вернулся в онлайн. Подорвал заряд штатно. Он взорвался и прибил немало бандитов. После срабатывания заряда через несколько десятков секунд игра вылетает. Объект, изображающий установленный заряд, лежит на земле. Хотя он должен исчезнуть после взрыва. Если заряд не использовать, то никаких вылетов нет.
Возможна ли связь заряда с вылетом?
Скрипты, связанные с зарядом
[cut=sgm_callbacks] elseif item_name=="remote_explosive_charge" then if get_remote_charge_full_installed()==false then run_dynamic_element(ui_mod_elements.remote_charge(),false) else game_hide_menu() game.start_tutorial("about_remote_limit") give_object_to_actor("remote_explosive_charge") end elseif item_name=="remote_charge_control" then if get_remote_charge_installed() then detonate_remote_charge(sgm_functions.read_variable("remote_charge_1_id"),1) detonate_remote_charge(sgm_functions.read_variable("remote_charge_2_id"),2) detonate_remote_charge(sgm_functions.read_variable("remote_charge_3_id"),3) end[/cut]
[cut=_g] -- 'Создание бомбы возле обьекта. function activate_detonate_charge(target,timer,visible,x,y,z,lv,gv) local obj if timer==nil then time=2000 end if visible=="visible_big" then if x==nil then obj=create("detonation_charge_visible_big",target:position().x,target:position().y,target:position().z,target:level_vertex_id(),target:game_ vertex_id()) else obj=create("detonation_charge_visible_big",x,y,z,lv,gv) end elseif visible=="invisible_big" then obj=create("detonation_charge_invisible_big",target:position().x,target:position().y,target:position().z,target:level_vertex_id(),target:gam e_vertex_id()) elseif visible=="visible_small" then if x==nil then obj=create("detonation_charge_visible_small",target:position().x,target:position().y,target:position().z,target:level_vertex_id(),target:gam e_vertex_id()) else obj=create("detonation_charge_visible_small",x,y,z,lv,gv) end elseif visible=="invisible_small" then obj=create("detonation_charge_invisible_small",target:position().x,target:position().y,target:position().z,target:level_vertex_id(),target:g ame_vertex_id()) end sgm_flags.value_detonation_charge=obj.id start_flague_timer("timer_detonation_charge",timer) end -- 'Проверка на установленную взрывчатку. function get_remote_charge_installed() return 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 end function get_remote_charge_full_installed() return 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 end -- 'Детонация взрывоопасного объекта по ID. function detonate_explosive_charge(charge_id,flags_charge) if charge_id~=nil and level.object_by_id(charge_id)~=nil then level.object_by_id(charge_id):explode(0) if flags_charge==true then sgm_flags.value_detonation_charge=0 end end end function detonate_remote_charge(charge_id,charge_seq) if sgm_functions.read_variable("remote_charge_"..charge_seq.."_timer")~=0 then start_flague_timer("timer_remote_charge_"..charge_seq,sgm_functions.read_variable("remote_charge_"..charge_seq.."_timer")) else if charge_id~=0 then detonate_explosive_charge(charge_id,false) end remove_spot_on_map(sgm_functions.read_variable("remote_charge_"..charge_seq.."_id"),sgm_flags.spot_remote_charge) sgm_functions.write_variable("remote_charge_"..charge_seq.."_id",0) end end -- 'Проверка взрывчатки РС-15. function check_remote_charge(charge_num) if check_flague_timer("timer_remote_charge_"..charge_num) then abort_flague_timer("timer_remote_charge_"..charge_num) sgm_functions.write_variable("remote_charge_"..charge_num.."_timer",0) detonate_remote_charge(sgm_functions.read_variable("remote_charge_"..charge_num.."_id"),charge_num) end if sgm_functions.read_variable("remote_charge_"..charge_num.."_id")~=nil and sgm_functions.read_variable("remote_charge_"..charge_num.."_id")~=0 then if not alife():object(sgm_functions.read_variable("remote_charge_"..charge_num.."_id")) then remove_spot_on_map(sgm_functions.read_variable("remote_charge_"..charge_num.."_id"),sgm_flags.spot_remote_charge) sgm_functions.write_variable("remote_charge_"..charge_num.."_id",0) sgm_functions.write_variable("remote_charge_"..charge_num.."_timer",0) abort_flague_timer("timer_remote_charge_"..charge_num) end end end[/cut]
Возможно, скрипты, связанные с зарядами, есть и в других файлах.
Можно ли обеспечить нормальную работу заряда, если игрок после минирования уходил далеко от точки закладки зарядов?
Сообщение отредактировал sergej5500 - Вс, 12.10.2014, 16:50 |
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
denis2000 | Дата: Пн, 13.10.2014, 12:05 | Сообщение # 549 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| sergej5500, Попробуй в функции activate_detonate_charge перед: Код sgm_flags.value_detonation_charge=obj.id start_flague_timer("timer_detonation_charge",timer) добавить: Код obj:can_switch_offline(false)
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
sergej5500 | Дата: Сб, 01.11.2014, 20:11 | Сообщение # 550 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый вечер.
smart_terrain
Можно ли поправить файл, чтобы движок не ставил непися на работу, даже если эта работа ему подходит, если эта работа уже занята другим НПС? Иногда неписи становятся на одну работу по двое. Если файл можно поправить, то как это правильно сделать?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
denis2000 | Дата: Сб, 01.11.2014, 21:11 | Сообщение # 551 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата sergej5500 ( ) Если файл можно поправить, то как это правильно сделать? Я например считаю, что правильнее сделать больше работ и назначать им различные приоритеты, тогда скрипт отрабатывает правильно. Дело в том что скрипт проверяет свободна ли работа: Код -- Если работа пустая или ее занимаем мы сами - выбираем ее. if v.npc_id == nil then И мне думается, что проблема не в том что работа занята, а в том что НПС могут отбирать работу у других НПС, а тут сложилась ситуация когда размен работами не возможен.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
BIZonnik | Дата: Вт, 11.11.2014, 19:28 | Сообщение # 552 |
Гражданский
Пользователи
Сообщений: 14
| Подскажите скрипт для выпадения нескольких предметов при использовании одного(как например мед. сумка в sgm)
КМБ Урок 56 для кого? denis2000
|
|
|
Эти 0 пользователя(ей) поблагодарили BIZonnik за это полезное сообщение: |
|
|
Сахар | Дата: Пн, 01.12.2014, 10:23 | Сообщение # 553 |
Гражданский
Пользователи
Сообщений: 2
| Всем доброго здравия. Попробовал сегодня создать «СМС» с новой иконкой. Код function test_sms() news_manager.(actor, d3_czech_start_dialog, ui_inGame2_neutral_2_mask) end Так как я в скриптах полный 0, так что последовал вполне логичный вылет. Код Expression : !m_error_code Function : raii_guard::~raii_guard File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp Line : 748 Description : ....e.r. - Çîâ Ïðèïÿòè\gamedata\scripts\xr_logic.script:648: attempt to index global 'xr_effects' (a nil value) Может, кто объяснить, в чём ошибка?
|
|
|
Эти 0 пользователя(ей) поблагодарили Сахар за это полезное сообщение: |
|
|
sergej5500 | Дата: Пн, 22.12.2014, 23:38 | Сообщение # 554 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Сахар,
Думаю, что проблема в кавычках. Их нет.
Я делаю СМС-ки так.
function esc_b2_bandit_enemy_task_sms(actor,npc) news_manager.send_tip(db.actor,"esc_b2_bandit_enemy_task_sms_text",0,"portrait_Wolf",8000,nil,"esc_b2_stalker_wolf_title") end
esc_b2_bandit_enemy_task_sms_text - ссылка на текст СМС. Файл в configs\text\rus. esc_b2_stalker_wolf_title - ссылка на автора СМС. Файл в configs\text\rus.
portrait_Wolf - ссылка на news_manager.script. Там должна быть строка типа portrait_Wolf = "ui_inGame2_wolf", ссылка на секцию в ui_actor_portretsДобавлено (22.12.2014, 23:38) --------------------------------------------- Добрый вечер.
Возникло два вопроса.
Несколько месяцев назад Дмитрий (makdm) для моей сборки предложил функцию принудительной уборки оружия в рюкзак из активного слота и блокировки пользования GPS-навигаторами.
[cut=Функция]function stop_weapon_and_guidebook(actor,npc) if actor:item_in_slot(2) ~= nil then local active_item = actor:item_in_slot(2) local actor_weapon = alife():object(active_item:id()) local section_name = actor_weapon:section_name() local rukzak_weapon = alife():create( section_name, actor:position(), actor:level_vertex_id(), actor:game_vertex_id(), actor:id() ) rukzak_weapon:clone_addons(actor_weapon) local sobj = active_item and active_item:id() and alife():object(active_item:id()) alife():release( sobj, true ) end if actor:item_in_slot(3) ~= nil then local active_item = actor:item_in_slot(3) local actor_weapon = alife():object(active_item:id()) local section_name = actor_weapon:section_name() local rukzak_weapon = alife():create( section_name, actor:position(), actor:level_vertex_id(), actor:game_vertex_id(), actor:id() ) rukzak_weapon:clone_addons(actor_weapon) local sobj = active_item and active_item:id() and alife():object(active_item:id()) alife():release( sobj, true ) end local hud = get_hud() hud:HideActorMenu() end[/cut]
Сегодня тестеры обнаружили, что при перемещении ствола в рюкзак теряются обвесы (прицелы и т.п.). Для проверки заспавнил себе Абакан, навесил прицел. После срабатывания функции Абакан в рюкзаке. Прицел пропал с концами. Можно ли это исправить?
И еще вопрос. Нормально эта функция вызывается рестриктором. Для теста попробовал вызвать её горячей клавишей.
elseif dik==DIK_keys.DIK_S then xr_effects.stop_weapon_and_guidebook()
Немедленно поймал лог.
[cut=Лог]FATAL ERROR [error]Expression : !m_error_code [error]Function : raii_guard::~raii_guard [error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp [error]Line : 748 [error]Description : ...shing\Зов Припяти\gamedata\scripts\xr_effects.script:5244: attempt to index local 'actor' (a nil value)
stack trace:[/cut]
Строка 5244 if actor:item_in_slot(2) ~= nil then.
Вопрос. Почему функция нормально работает, если вызывается рестриктором и дает жука по горячей клавише?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
makdm | Дата: Вт, 23.12.2014, 20:16 | Сообщение # 555 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата sergej5500 ( ) функцию принудительной уборки оружия в рюкзак из активного слота и блокировки пользования GPS-навигаторами. sergej5500, попробуй другую функцию. В xr_effects.script пишешь:
[cut noguest=функции]function disable_weapon_and_guidebook(actor,npc) actor:hide_weapon() get_hud():HideActorMenu() end
function enable_weapon(actor,npc) actor:restore_weapon() end[/cut]
Соответственно в логике рестриктора
[sr_idle@_1] on_info = %=disable_weapon_and_guidebook% on_info2 = {Условие} sr_idle@_2 %=enable_weapon%
[sr_idle@_2]
Цитата sergej5500 ( ) Почему функция нормально работает, если вызывается рестриктором и дает жука по горячей клавише? Потому что в функцию не передан аргумент actor Вызов должен быть такой
xr_effects.stop_weapon_and_guidebook(db.actor)
Терпение...... И все получится!
Сообщение отредактировал makdm - Вт, 23.12.2014, 20:19 |
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
|