Модостроение. Общие вопросы и ответы
|
|
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 за это полезное сообщение: |
|
|
asd123 | Дата: Сб, 19.09.2015, 11:34 | Сообщение # 1471 |
Mr. «Магма»
Военные сталкеры
Сообщений: 1386
| Здравствуйте. Создал НПС, добавил ему в точку, куда он смотрит, анимацию animpoint_sit_normal. Анимация работает, но вот проблема: После того, как анимация заканчивается, персонаж встаёт в idle, а после этого снова переходит в animpoint. Вопрос: как сделать animpoint зацикленной анимацией?
У мутантов тоже есть группировки. © Движок X-Ray
Сообщение отредактировал asd123 - Сб, 19.09.2015, 11:35 |
|
|
Эти 0 пользователя(ей) поблагодарили asd123 за это полезное сообщение: |
|
|
makdm | Дата: Сб, 19.09.2015, 22:22 | Сообщение # 1472 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата asd123 ( ) Вопрос: как сделать animpoint зацикленной анимацией? Вместо схемы remark прописать схему animpoint Правда придётся править all.spawn, чтобы установить smart_cover
Терпение...... И все получится!
Сообщение отредактировал makdm - Сб, 19.09.2015, 22:23 |
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
sergej5500 | Дата: Вс, 20.09.2015, 12:16 | Сообщение # 1473 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый день.
Сделал на Кордоне эксклюзивный сквад. Медик, механик, торговец, командир блокпоста. Для проверки правильности работы логики этих НПС поставил на эти работы сквад из дефолтных сталкеров. Решил, что индивидуальные профили торговцу, технику и т.д. добавлю потом.
Обратил внимание на следующую вещь. Профили обоих сталкеров одинаковы.
[cut=Рядовой сталкер] [/cut]
[cut=Командир сквада] [/cut]
Видно, что у командира есть фраза: "Чем сейчас занимаешься?". Эта фраза запускает травел диалог на перемещение сталкера и сквада на другой смарт.
То есть движок проверяет, является ли непись командиром сквада.
В связи с этим возник вопрос. Можно ли добавить в этот диалог ещё одну проверку? Если в секции сквада прописан какой то target_smart, то травел фраза появляться не должна. Или непись должен отказываться вести игрока. Нужно, чтобы сквады, охраняющие базы, не уходили вместе с игроком.
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
makdm | Дата: Вс, 20.09.2015, 17:00 | Сообщение # 1474 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| sergej5500, открой файл gamedata\scripts\travel_manager.script В функции function uni_traveler_precond(actor, npc) после строчки local squad = get_object_squad(npc) добавь вот это local new_target = xr_logic.pick_section_from_condlist( db.actor, squad, squad.action_condlist ) if new_target ~= nil and new_target ~= "nil" then return false end Посмотри, что получится.
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
Бармен | Дата: Вс, 20.09.2015, 22:58 | Сообщение # 1475 |
Ветеран
Свобода
Сообщений: 370
| Всем привет народ, как сделать чтобы при переходе на локацию срабатывало задание. Платформа ЗП.
|
|
|
Эти 0 пользователя(ей) поблагодарили Бармен за это полезное сообщение: |
|
|
suhar_ | Дата: Сб, 26.09.2015, 01:10 | Сообщение # 1476 |
Бывалый
Пользователи
Сообщений: 106
| Доброго времени суток, господа. Вопрос скриптерам: можно ли осуществить проверку на наличие какого-либо апгрейда у предмета (оружие/бронежилет/шлем)? Что-то вроде: local outfit_in_slot=db.actor:item_in_slot(7) if outfit_in_slot~=nil then if _g.check_for_upgrade(outfit_in_slot,up_gr_firstab_cs_heavy_outfit)==true then --здесь будет что-то происходить end end Очень интересует, как должна выглядеть function check_for_upgrade(item_name,upgrade_name) Общий вид функции может быть и другим. Важен сам смысл.
Платформа ЗП.
Сообщение отредактировал suhar_ - Сб, 26.09.2015, 01:33 |
|
|
Эти 0 пользователя(ей) поблагодарили suhar_ за это полезное сообщение: |
|
|
makdm | Дата: Сб, 26.09.2015, 10:27 | Сообщение # 1477 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| suhar_, чтобы понять какие апгрейды установлены, нужно читать нет-пакет объекта, а конкретно его state часть. В моде Припять. Точка отсчёта есть скрипт, который читает пакет оружия и определяет, какие апгрейды установлены. Как это работает, можно посмотреть в файле upgrade_weapons.script
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
suhar_ | Дата: Вт, 29.09.2015, 11:14 | Сообщение # 1478 |
Бывалый
Пользователи
Сообщений: 106
| makdm, попытался сделать по примеру предложенного вами скрипта (как я понимаю, авторство ваше). Ранее, с нет-пакетами был не знаком. Пришлось разбираться, что это такое прямо на ходу. Как я понял, нет-пакет имеет довольно сложную структуру, и хранится в нём много всего. В вашем скрипте идёт работа с пакетами оружия, в моём же случае это были костюмы. Как я понимаю, структура пакета броника и ствола отличаются. Пробовал применить ваш скрипт для своих объектов. Нет-пакет прочитался (вернее, его часть), но там не оказалось того, что мне было нужно (строки установленных апгрейдов). Пробовал вывести содержимое в историю сообщений: большинство строк были пустами или же отображались последовательностью нечитабельных символов. Были однако среди них и вполне разумные. В них были ссылки на разные текстуры в xml-файлах с соответствующим синтаксисом. Но в целом, ничего хоть сколько-нибудь полезного выудить из нет-пакета костюма не удалось. Вероятно, мой скрипт читает не ту его часть. Из этого вытекают вопросы: какую структуру имеет нет-пакет костюма? и как найти и прочитать именно нужный участок нет-пакета? [cut]function read_net_packet(obj) local string_count = 0 local packet_string = {} local packet = nil packet = net_packet() packet:w_begin(0) sobj = alife():object(obj:id()) sobj:STATE_Write(packet) packet:r_seek(2) string_count = packet:r_u32() for i = 1, string_count do packet_string[i] = packet:r_stringZ() news_manager.send_tip(db.actor, packet_string[i], nil, nil, nil, nil) end end[/cut]
Сообщение отредактировал suhar_ - Вт, 29.09.2015, 11:26 |
|
|
Эти 0 пользователя(ей) поблагодарили suhar_ за это полезное сообщение: |
|
|
makdm | Дата: Вт, 29.09.2015, 19:43 | Сообщение # 1479 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| suhar_, неправильно написана функция. Попробуй так:
Код function read_net_packet(obj) local upgrades = {} local s_obj = alife():object( obj:id() ) local pac = net_packet() pac:w_begin( 0 ) s_obj:STATE_Write( pac ) pac:r_seek( 2 ) local game_vertex_id = pac:r_u16() local distance = pac:r_float() local direct_control = pac:r_s32() local level_vertex_id = pac:r_s32() local object_flags = pac:r_s32() local custom_data = pac:r_stringZ() local story_id = pac:r_s32() local spawn_story_id = pac:r_s32() local visual_name = pac:r_stringZ() local visual_flags = pac:r_u8() local condition = pac:r_float() local upgrade_count = pac:r_u32() for i = 1, upgrade_count do upgrades[ i ] = pac:r_stringZ() news_manager.send_tip(db.actor, upgrades[ i ], nil, nil, nil, nil) end end
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
Бармен | Дата: Пт, 02.10.2015, 18:22 | Сообщение # 1480 |
Ветеран
Свобода
Сообщений: 370
| Всем привет народ, я за помощью к вам: как сделать чтобы при подходе к НПС, он начал диалог первым. И еще можете дать логику чтобы после разговора, НПС ответ тебя в то место которое укажешь. Платформа ЗП.
|
|
|
Эти 0 пользователя(ей) поблагодарили Бармен за это полезное сообщение: |
|
|
sergej5500 | Дата: Пт, 02.10.2015, 19:09 | Сообщение # 1481 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Бармен,
Чтобы непись заговорил первым, нужно в секции meet в строке use прописать код типа:
use = {+zat_bandit_base_end_talk !actor_enemy !has_enemy} true, {-zat_bandit_base_payment =dist_to_actor_le(5) !actor_enemy !has_enemy} self, {=actor_enemy} false
Это строка часового на базе Чапая. Если нет инфопорции zat_bandit_base_payment, игрок не враг, без оружия и ближе 5 метров, то непись заговорит первым.
{-zat_bandit_base_payment =dist_to_actor_le(5) !actor_enemy !has_enemy} self
Для перемещения игрока и непися можно воспользоваться функциями teleport_actor и teleport_squad.
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
Бармен | Дата: Пт, 02.10.2015, 21:41 | Сообщение # 1482 |
Ветеран
Свобода
Сообщений: 370
| Цитата sergej5500 ( ) Для перемещения игрока и непися можно воспользоваться функциями teleport_actor и teleport_squad. Спасибо конечно, ну я имел виду что после разговора например "я отведу тебя в то место" тут НПС пойдет. А мы должны пойти за ним.
|
|
|
Эти 0 пользователя(ей) поблагодарили Бармен за это полезное сообщение: |
|
|
sergej5500 | Дата: Пт, 02.10.2015, 22:20 | Сообщение # 1483 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Бармен,
Тогда неписю нужно прописать точки walk и look места, в которое НПС должен перейти. И переключить его на соответствующую секцию логики. В этом случае путь непися задаст движок.
Если нужно, чтобы непись пошел по конкретному маршруту, то нужно задать путь walk из набора точек, которые непись должен пройти. При достижении последней точки можно выдать on_signal и перевести непися на точки walk и look конечного положения.
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
Бармен | Дата: Пт, 02.10.2015, 23:08 | Сообщение # 1484 |
Ветеран
Свобода
Сообщений: 370
| sergej5500, Все это хорошо, а можешь с логикой помочь. Просто я особо не силен в ней
|
|
|
Эти 0 пользователя(ей) поблагодарили Бармен за это полезное сообщение: |
|
|
sergej5500 | Дата: Пт, 02.10.2015, 23:27 | Сообщение # 1485 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Бармен,
Можно применить такую логику.
[cut=Логика НПС][logic@story_id_npc] active = walker@story_id_npc suitable = {=check_npc_name(story_id_npc)} true prior = 200
[walker@story_id_npc] path_walk = start_walk path_look = start_look meet = meet on_info = {+perechod_start} walker@perechod
[walker@perechod] path_walk = perechod_walk def_state_moving = assault on_info = {=distance_npc_to_point_le(3:smart_name_perechod_walk:30)} walker@final
[walker@final] path_walk = final_walk path_look = final_look meet = meet
[meet] abuse = false allow_break = false meet_on_talking = false trade_enable = false use = {!actor_has_weapon !actor_enemy !has_enemy} true, false snd_on_use = {=actor_has_weapon !actor_enemy} meet_hide_weapon, nil[/cut]
В all.spawn добавляем 5 путей.
start_walk и start_look - стартовая позиция непися. perechod_walk - маршрут перехода. final_walk и final_look - финальная позиция непися.
+perechod_start - инфопорция начала перехода.
=distance_npc_to_point_le(3:smart_name_perechod_walk:30) - функция завершения перехода. Первое число - дистанция до последней точки пути перехода непися в метрах. Когда непись ближе 3-х метров, то путь считается завершенным. smart_name_perechod_walk - полное название пути перехода непися. Последнее число - номер последней точки пути перехода непися.
В xr_conditions.scripts добавляем функцию
[cut=Функция]function distance_npc_to_point_le(actor, npc, p) local patrol_way = patrol(p[2]) local point_id = 0 if p[3] then point_id = tonumber(p[3]) end if npc then return npc:position():distance_to_sqr(patrol_way:point(point_id)) < p[1]*p[1] end return false end [/cut]
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
|