Модостроение. Общие вопросы и ответы
|
|
denis2000 | Дата: Сб, 15.06.2013, 11:51 | Сообщение # 1 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Помощь тем кто хочет знать больше о игре и модах Если у вас появились вопросы по модостроению в игре S.T.A.L.K.E.R. Задавайте их в этой теме - умные головы, модосторители и просто разбирающиеся в программировании люди вам ответят.
Много интересного материала здесь (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)", ее и надо расскомментировать, должно получиться вот так: Код function abort(fmt, ...) local reason = string.format(fmt, ...) error_log(reason) end Вот для примера два одинаковых вылета, первый с функцией по умолчанию, второй - с поправленной функцией
Первый: Код 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) Второй: Код 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 по ссылке из шапки и соседнюю тему "Курс молодого бойца", возможно Ваш вопрос уже рассматривался.
Если произошел вылет - выкладываем лог! Вопрос ставим четко, не забываем указывать версию игры, установленные моды их версии, установленные фиксы модов и подробно ваши правки. Помните чем подробнее вопрос, тем точнее ответ.
Посты, для которых есть свои категории, из этой темы будут удаляться или перемещаться в соответсвующую тему. Персональных извещений в ЛС о переносе\удалении поста не будет, ищите сами. Учитывайте, что в системах Ucoz тема не обновляется в статистике при переносе поста. Посты, написанные здесь-же после переноса, будут расцениваться как кросспостинг, со всеми вытекающими
[cut noguest=Первый юбилей нашей темы] Здравствуйте господа модостроители, и все так или иначе причастные к этому. Нашей теме исполнился 1 год. От души поздравляю Всех Вас дорогие друзья, творческих успехов. Хочу так же выразить отдельную благодарность denis2000 и ХОВАН. tracker 23.06.11
[/cut]
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
a4927860 | Дата: Ср, 23.07.2014, 09:40 | Сообщение # 556 |
Новичок
Пользователи
Сообщений: 81
| denis2000, я вас понял Тогда сделать ему 1000 хп и при хп меньше 900 давать ему неуязвимость - после чего сменять хп на 20 и посылать в состояние wounded Или он опять падать не будет?Добавлено (23.07.2014, 09:40) --------------------------------------------- в дополнение - отключать ему бой и движение - будет стоять как стату даже если не будет падать. в скрипте аптечек сответственно проверять кому мы её даем - если бодигварду - делать хп 1000
|
|
|
Эти 0 пользователя(ей) поблагодарили a4927860 за это полезное сообщение: |
|
|
denis2000 | Дата: Ср, 23.07.2014, 10:23 | Сообщение # 557 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| a4927860, Сделал вот так: [cut] В файле spawn_sections_extended_stalkers.ltx в самом начале добавил: Код [stalker_bodyguard_immunities] burn_immunity = 0.0 strike_immunity = 0.0 shock_immunity = 0.0 wound_immunity = 0.0 radiation_immunity = 0.0 telepatic_immunity = 0.0 chemical_burn_immunity = 0.0 explosion_immunity = 0.0 fire_wound_immunity = 0.0 wound_2_immunity = 0.0
[stalker_bodyguard_damage]:stalker_boss_damage default = 0.0,-1,1.0 bip01_neck = 0.0,0,1.0 bip01_head = 0.0,0,1.0,3 eyelid_1 = 0.0,0,1.0,3 eye_left = 0,0,1.0,3 eye_right = 0,0,1.0,3 jaw_1 = 0,0,1.0 в секцию [zat_stalker_bodyguard] добавил: Код immunities_sect = stalker_bodyguard_immunities damage = stalker_bodyguard_damage В файле zat_stalker_bodyguard.ltx в секции [logic] добавил: добавил секцию Код [hit] on_info = %=set_health_0_5% В секции [bodyguard@***] добавил Код wounded = wounded@bodyguard invulnerable = {=is_wounded} true, false Добавил секцию Код [wounded@bodyguard] hp_state = 60|wounded_heavy@help_heavy hp_state_see = 60|wounded_heavy@help_heavy hp_victim = 60|nil hp_cover = 60|false hp_fight = 60|false autoheal = false not_for_help = true enable_talk = true В файл xr_effects.script добавил функцию: Код function set_health_0_5(actor, npc, p) local RND = 20 if RND < math.random(100) then npc.health = (0.5 - npc.health)/4 end end [/cut] В этом случае НПС бессмертен по причине нулевых имунитетов и дамаджей, но хиты корректно посылают колбеки, которые прехватываються в логике и с вероятностью RND = 20% приводят к урону, здоровье при этом не падает ниже 0,5, а порог перехода в состояние вондед равен 0,6.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
a4927860 | Дата: Чт, 24.07.2014, 02:09 | Сообщение # 558 |
Новичок
Пользователи
Сообщений: 81
| denis2000, уууххх Круто! Работает. Проверил на двух с разной дамагой от разных источников.
теперь правда стоят столбами - но это мой косяк с излечением.
Спасибо! я думаю это можно в минигайды засовывать - потому как штука полезная
Следующий вопрос - разбор оружия на детали, вернее инструмент для превращения активного оружия в детали. Для чего - чтобы игрок не тоскал до Кардана тонну пистолетов и винтовок а принес 5кг гаек. В первых хомяки/задроты типа меня будут довольны - все пойдет в хозяйство. Во вторых игрок сам быдет выбирать что ему важнее - деньги за оружие или скидка за детали. Предмет "деталь" я уже добавил. Инструмент для разбора оружия тоже.
Вопросы: 1) как понять что именно на этот предмет я хочу применить разборку? (если можно выбирать а не делать на активный) 2) при разборе логично применять function calculate_bonus(victim) как его можно учитывать? 3) на сколько я понял свой предмет "деталь" для учета её в разборе нужно просто добавить в mechanic_box_processing после артов?Добавлено (23.07.2014, 18:14) --------------------------------------------- Сразу чтобы сущностей не плодить: Скидка у механника за детали - где она прописна? Если конкретно - хочу убрать чит с 123 деталями (если принести механнику 123 детали стоимость ремонта будет = 0) Добавлено (24.07.2014, 02:09) --------------------------------------------- [cut=Пока сделал так] добавил юзабельный предмет addon_box_disassemble и не юзабельный de_details в function actor_binder:use_inventory_item(obj) (в bind_stalker) Код if find_in_string(item_name,"addon_box_disassemble") then local item = db.actor:active_item() if item ~=nil then local cost = sgm_functions.ReadCost(item:section()) local cond = item:condition() local count = 1+cost/200*cond local n = 0 for n=1, count do alife():create("de_details", db.actor:position(), count, db.actor:game_vertex_id(), db.actor:id()) end alife():release(alife():object(db.actor:active_item():id()),true) end give_object_to_actor("addon_box_disassemble") end
в код механникам: Код elseif find_in_string(item:section(),"de_") then item_value=(1/math.random(10,30))
[/cut]
Остается вопрос про скидку
|
|
|
Эти 0 пользователя(ей) поблагодарили a4927860 за это полезное сообщение: |
|
|
denis2000 | Дата: Чт, 24.07.2014, 08:40 | Сообщение # 559 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата a4927860 ( ) Скидка у механника за детали Файл inventory_upgrades.script функция mech_discount(perc) параметр bonus_with_stripping
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
Ay49Mihas | Дата: Вс, 27.07.2014, 11:27 | Сообщение # 560 |
Полевой исследователь
Ученые сталкеры
Сообщений: 218
| Здравствуйте! Делаю дополнение к SGM'у, не хочу, чтобы новая игра начиналась. Потому хочу сделать space_restrictor "на лету". Нашёл функцию create_restrictor(ltx_name, radius, x, y, z, lv, gv) С другой стороны, не нашёл в SGM'е, чтобы она использовалась. Отсюда вопрос: функция рабочая? Можно ли её использовать? Спасибо!
|
|
|
Эти 0 пользователя(ей) поблагодарили Ay49Mihas за это полезное сообщение: |
|
|
sergej5500 | Дата: Вс, 27.07.2014, 11:45 | Сообщение # 561 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Ay49Mihas, Функция создания рестриктора рабочая. По крайней мере, в версии 2.1. Я делал рестриктор таким способом для теста. Изучал метод. Вызывал ф-ию по горячей клавише. Рестриктор спавнился и работал.
Но работал он нестабильно. В одном случае все было нормально. В другом случае игра вылетала по непонятным причинам. С чем были связаны вылеты, не знаю. Возможно, поэтому в СГМ функция не используется.
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
denis2000 | Дата: Вс, 27.07.2014, 21:45 | Сообщение # 562 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Ay49Mihas, Пока есть скрипты, зачем спавнить рестриктор?
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
Ay49Mihas | Дата: Пн, 28.07.2014, 04:27 | Сообщение # 563 |
Полевой исследователь
Ученые сталкеры
Сообщений: 218
| Цитата denis2000 ( ) Пока есть скрипты, зачем спавнить рестриктор? Не совсем понял вопрос. Подозреваю, что при добавлении рестриктора в all.spawn, потребуется новая игра. Хочу обойтись без этого. Или есть другой путь создания рестрикоров, о котором я не знаю?
|
|
|
Эти 0 пользователя(ей) поблагодарили Ay49Mihas за это полезное сообщение: |
|
|
denis2000 | Дата: Пн, 28.07.2014, 08:24 | Сообщение # 564 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата Ay49Mihas ( ) Подозреваю, что при добавлении рестриктора в all.spawn, потребуется новая игра. Ваши подозрения оправданы. Все что добавляется в all.spawn требует новой игры. Цитата Ay49Mihas ( ) Хочу обойтись без этого. В стаком случае обойдитесь без рестриктора, логика которого в итоге обрабатывается скриптами. В 95% случаев можно отказаться от посредника в лице движкового класса cse_alife_space_restrictor. Цитата Ay49Mihas ( ) Или есть другой путь создания рестрикоров, о котором я не знаю? Смотри выше.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
Ay49Mihas | Дата: Пн, 28.07.2014, 10:26 | Сообщение # 565 |
Полевой исследователь
Ученые сталкеры
Сообщений: 218
| Цитата denis2000 ( ) Ваши подозрения оправданы. Все что добавляется в all.spawn требует новой игры. Вейпоинты, добавленные в all.spawn, не требуют новой игры. Но, боюсь, рестрикторы потребуют.
Цитата denis2000 ( ) В стаком случае обойдитесь без рестриктора, логика которого в итоге обрабатывается скриптами. В 95% случаев можно отказаться от посредника в лице движкового класса cse_alife_space_restrictor. А вот тут не знаю, как по-другому (ну, кроме вечной проверки нахождения пользователя в координатах). У меня тема: актор заходит в рестриктор, и начинается трэш, угар и содомия: его бьют, он теряет сознание, спавнятся всякие чуваки вокруг и так далее. Думал это сделать на логике рестриктора. Или будет проще и эффективнее сделать некий скрипт? Можно намёк на тему как он будет выполняться?
Спасибо!
Сообщение отредактировал Ay49Mihas - Пн, 28.07.2014, 10:39 |
|
|
Эти 0 пользователя(ей) поблагодарили Ay49Mihas за это полезное сообщение: |
|
|
a4927860 | Дата: Пн, 28.07.2014, 11:27 | Сообщение # 566 |
Новичок
Пользователи
Сообщений: 81
| Решил добавить еще две способности, подготовил все кроме собственно действия
Собственно нужны две команды для скрипта: 1) изменение течения времени 2) неуязвимость для гг - нашел команду god но она не работает (как собственно и бессмертие в самом SGM2.2 которое включается чит консолью)
|
|
|
Эти 0 пользователя(ей) поблагодарили a4927860 за это полезное сообщение: |
|
|
denis2000 | Дата: Пн, 28.07.2014, 11:53 | Сообщение # 567 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата Ay49Mihas ( ) Вейпоинты, добавленные в all.spawn, не требуют новой игры. Далеко, далеко не все! Цитата Ay49Mihas ( ) Но, боюсь, рестрикторы потребуют. Вот тут 100% потребуют. Цитата Ay49Mihas ( ) А вот тут не знаю, как по-другому (ну, кроме вечной проверки нахождения пользователя в координатах). Да, точно то что делает on_actor_inside только ручками [cut] В файле bind_stalker.script в функции actor_binder:update(delta) Код TUS_control.TUS_update() В файле например TUS_control.script Код function TUS_update() local level_TUS = "zaton" --Уровень треша угара и т.п. local point_TUS = vector():set (100,100,100) --Точка треша угара и т.п. local radius_TUS = 10 --Радиус действия треша угара и т.п.
if has_alife_info("TUS_enable") then --Инфопорция активируюшая точку треша угара и т.п. if level.name() == level_TUS then if point_TUS:distance_to_sqr(db.actor:position()) <= radius_TUS * radius_TUS then --(Включить треш угар и т.п.) else --(Отключить треш угар и т.п.) end end end end [/cut] Вообще для реализации такого есть три варианта: 1. Рестриктор с логикой в all.spawn 2. Рестриктор с логикой спавн через скрипт 3. Ручной перехват ситуации скриптом Выбор за вами.
---------------------------------------------
Цитата a4927860 ( ) изменение течения времени Команда такая: Код level.set_time_factor(50) , где 50 - во сколько раз игровое время течет быстрее реального. Цитата a4927860 ( ) неуязвимость для гг Собственно как и в чит консоли, бессмертие активируеться строкой db.actor.health = 1 в файле bind_stalker.script в функции actor_binder:update(delta)
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
a4927860 | Дата: Пн, 28.07.2014, 11:57 | Сообщение # 568 |
Новичок
Пользователи
Сообщений: 81
| denis2000, спасибо правильно ли я понял что level.set_time_factor(0,5) - замедление течения времени в 2 раза?
Да, но учитывайте что относительно реального времени! denis2000
Цитата denis2000 ( ) Собственно как и в чит консоли Цитата a4927860 ( ) не работает (как собственно и бессмертие в самом SGM2.2 которое включается чит консолью) собственно с чем и связан вопрос
Не работает чит консоль и не работает комманда разные вещи. denis2000
|
|
|
Эти 0 пользователя(ей) поблагодарили a4927860 за это полезное сообщение: |
|
|
Ay49Mihas | Дата: Пн, 28.07.2014, 12:01 | Сообщение # 569 |
Полевой исследователь
Ученые сталкеры
Сообщений: 218
| Цитата denis2000 ( ) Вообще для реализации такого есть три варианта: 1. Рестриктор с логикой в all.spawn 2. Рестриктор с логикой спавн через скрипт 3. Ручной перехват ситуации скриптом Выбор за вами. О, круто, спасибо!
По примеру выше, я правильно понял, что вызов этой функции надо вставить, например, в update_main() в sgm_update.script?
Да, если у вас SGM, то функцию можно вызывать и оттуда. denis2000
|
|
|
Эти 0 пользователя(ей) поблагодарили Ay49Mihas за это полезное сообщение: |
|
|
a4927860 | Дата: Вт, 29.07.2014, 09:56 | Сообщение # 570 |
Новичок
Пользователи
Сообщений: 81
| denis2000, Понял - спасибо. Тогда еще один вопрос: на сколько я понял нельзя влиять скриптами на такие параметры героя как скорость, высота прыжка и т.д. Но можно ли подбросить его в направлении точки прицела? (знаю что нпс подбрасывать нельзя но м.б. с гг другая ситуация?)
Ситуация та же, скриптово неполучается передать импульс НПС или ГГ, можно попытаться спавнить гравианомалию и после убирать ее или напрямую менять координаты ГГ. denis2000
Добавлено (29.07.2014, 00:40) --------------------------------------------- Хэх, кажется я опять не правильно задал вопрос =)
мне не нужно течение времени в отрыве от действий нпс - я хочу чтобы замедлялся не таймер а нпс =)
Добавлено (29.07.2014, 00:41) --------------------------------------------- Вернее даже не только нпс а все включая героя.
Bullet Time в Сталкере не возможен без редактирования движка или сторонних средств (как например setSpeed.exe в Shoker Weapon Mod). denis2000Добавлено (29.07.2014, 09:56) --------------------------------------------- Это очень очень плохо... Но спасибо за то что объяснили.
Тогда - возможно ли создать оцепенение? если точнее - ввести нпс в состояние когда он не двигается и не атакует (но жив), скриптом естественно.
|
|
|
Эти 0 пользователя(ей) поблагодарили a4927860 за это полезное сообщение: |
|
|
|