Модостроение. Общие вопросы и ответы
|
|
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 за это полезное сообщение: |
|
|
makdm | Дата: Вт, 30.12.2014, 23:32 | Сообщение # 946 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата asd123 ( ) Как убрать удаление оружия после смерти НПС? На Кордоне лидеру блокпоста дал пулемёт, и после смерти он удаляется. Очень часто приводит к вылету. Открыть файл gamedata\configs\misc\death_items_control.ltx и удалить все строки после [death_items_control]
Или в файле death_manager.script удалить в функции function keep_item(npc, item) строки
if not check_death_item(section) then alife():release(alife():object(item:id()),true) return end
Терпение...... И все получится!
Сообщение отредактировал makdm - Вт, 30.12.2014, 23:37 |
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
asd123 | Дата: Ср, 31.12.2014, 05:39 | Сообщение # 947 |
Mr. «Магма»
Военные сталкеры
Сообщений: 1386
| makdm, Помогло, спасибо.
Добавлено (31.12.2014, 05:39) --------------------------------------------- Подскажите, как у вертолета убрать из врагов ГГ ? А то мною созданный вертолет меня задолбал.. только появляется, и давай меня гасить.. Хотя во врагах у него прописаны мутанты и враждебные бандиты, которых он вообще игнорирует..
У мутантов тоже есть группировки. © Движок X-Ray
Сообщение отредактировал asd123 - Вс, 11.01.2015, 11:52 |
|
|
Эти 0 пользователя(ей) поблагодарили asd123 за это полезное сообщение: |
|
|
makdm | Дата: Ср, 31.12.2014, 10:06 | Сообщение # 948 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата asd123 ( ) Хотя во врагах у него прописаны мутанты и враждебные бандиты, которых он вообще игнорирует.. Вертолёт в ЗП не был использован, поэтому скрипты, отвечающие за атаку, разрабами не правились и остались такими же, как в ЧН. Вертушке можно задать в виде цели три параметра: 1. actor - атакует ГГ 2. all - атакует всех сталкеров и ГГ 3. story_id объекта - атакует объект с заданным story_id ( нужно поправить скрипты, так как в ЧН story_id - это числовая метка SID, а не строковая, как в ЗП )
Поэтому вертолёт не знает, что такое бандиты и что такое монстры. Нужно переписывать скрипт heli_fire.script, я это делал во Времени Альянса. Там вертолёт атакует не только сталкеров и монстров , но и ведёт стрельбу по БТР и по другим вертолётам. Можете там посмотреть, как это сделать.
Если для вас это сделать сложно, то можно отключить стрельбу по ГГ, но оставить стрельбу по сталкерам. Для этого в логике пропишите
enemy = all
В скрипте heli_fire.script в методе function heli_fire:update_enemy_arr() удалить следующие строки
if heli:isVisible( db.actor ) and random_choice( false, true) or db.heli_enemy_count==0 then if distance_2d( self.obj:position(), db.actor:position() ) <= min_dist2D*2 then self.enemy = db.actor min_dist2D = distance_2d( self.obj:position(), db.actor:position() ) end end
ВСЕХ С НАСТУПАЮЩИМ НОВЫМ ГОДОМ!!!
Терпение...... И все получится!
Сообщение отредактировал makdm - Пт, 02.01.2015, 07:54 |
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
asd123 | Дата: Ср, 31.12.2014, 13:27 | Сообщение # 949 |
Mr. «Магма»
Военные сталкеры
Сообщений: 1386
| makdm, А реально ли вертолету назначить группировку? Был такой мод на ТЧ, в котором вертолеты летают парами, с логикой на атаку любой угрозы, и атакующие враждебные группировки.
А еще: Вариант ли сделать вертолет как транспорт для ГГ ? Пусть это будет сложно, но ведь вариант? Видел такую фишку в Simbion`е на ТЧ.
У мутантов тоже есть группировки. © Движок X-Ray
Сообщение отредактировал asd123 - Вс, 11.01.2015, 11:53 |
|
|
Эти 0 пользователя(ей) поблагодарили asd123 за это полезное сообщение: |
|
|
a4927860 | Дата: Ср, 31.12.2014, 13:40 | Сообщение # 950 |
Новичок
Пользователи
Сообщений: 81
| Нож метательный вместо ножа обычного.
Заменить нож скриптом не предстовляет трудности (глубокий поклон SGM), метательный нож хорошо выполняет свои основные функции кидается, висит в 1м слоте и т.д. однако есть несколько проблем: 1) после загрузки сохранения он пропадает 2) при попытке заменить его на другой нож он остается на месте при этом новый нож спаунится в инвентарь как и активатор старого
На сколько я понял проблема в том что класс II_BOLT создается после удаления заного. Посоветуйте пожалуйста как можно эту проблему обойти?
С Наступающим всех Новым Годом!
|
|
|
Эти 0 пользователя(ей) поблагодарили a4927860 за это полезное сообщение: |
|
|
denis2000 | Дата: Ср, 31.12.2014, 19:21 | Сообщение # 951 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Noxer, В уроках есть файлы с выполненным заданием, они точно работают. Цитата a4927860 ( ) А реально ли вертолету назначить группировку? Вертолет не НПС и назначить ему группировку по общей схеме не получиться, но в его скриптах принципиально возможно запретить ему атаковать объекты какой-то конкретной группировки. Цитата asd123 ( ) Был такой мод на ТЧ, в котором вертолеты летают парами, с логикой на атаку любой угрозы, и атакующие враждающие группировки. Был такой мод для ТЧ и назывался AI вертолётов, чисто теоретически он модифицируем для ЗП. Цитата asd123 ( ) Вариант ли сделать вертолет как транспорт для ГГ ? Без правок движка, красиво не получиться. Цитата a4927860 ( ) На сколько я понял проблема в том что класс II_BOLT создается после удаления заного. Посоветуйте пожалуйста как можно эту проблему обойти? Никак скриптами против движкового спавна вы не навоюете или править движек или придумать принципиально иную схему работы.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
asd123 | Дата: Ср, 31.12.2014, 19:35 | Сообщение # 952 |
Mr. «Магма»
Военные сталкеры
Сообщений: 1386
| denis2000, объясните: При попадании в вертолет, последний не подает звуков ранения, хотя mute = false стоит. Как описал makdm, разрабы не меняли ничего после ЧН, а значит звук должен быть.
У мутантов тоже есть группировки. © Движок X-Ray
Сообщение отредактировал asd123 - Ср, 31.12.2014, 19:43 |
|
|
Эти 0 пользователя(ей) поблагодарили asd123 за это полезное сообщение: |
|
|
roma_uf | Дата: Ср, 31.12.2014, 19:52 | Сообщение # 953 |
Гражданский
Пользователи
Сообщений: 17
| Цитата sergej5500 ( ) Открыть файл objekt в Актор Эдитор СДК 0.7. Настроить анимации Я так и не понял, как добавить текстуру в формате object в СДК? Вопрос конечно же глупый, но уделите минуту на ответ на мой вопрос.
|
|
|
Эти 0 пользователя(ей) поблагодарили roma_uf за это полезное сообщение: |
|
|
sergej5500 | Дата: Ср, 31.12.2014, 20:50 | Сообщение # 954 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| roma_uf,
С помощью СДК можно определить, как называются файлы текстур. Узнав, как называются текстуры, можно найти их в моде-исходнике.
На скрине, который я показал, видно, что к модели долговца приписаны две текстуры. act_face_mask_03 и act_stalker_dolg_7.
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
roma_uf | Дата: Чт, 01.01.2015, 00:37 | Сообщение # 955 |
Гражданский
Пользователи
Сообщений: 17
| Цитата denis2000 ( ) Урок 26a (Автор denis2000) Задача: Снятия денег с трупов в ЗП по алгоритму SGM. Файл с выполненным заданием Попытался сделать также, как в примере. В итоге при обыске трупа вылет с таким логом: [cut noguest]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 : ...call of pripyat\gamedata\scripts\xr_motivator.script:355: attempt to index global 'use_corps' (a nil value)
stack trace: [/cut] Перепроверил, вроде все сделал правильно, но почему-то крашится. Правил на Steam лицензии.
Ошибка синтаксиса в скрипте use_corps.script, ищите и исправляйте. denis2000
|
|
|
Эти 0 пользователя(ей) поблагодарили roma_uf за это полезное сообщение: |
|
|
asd123 | Дата: Чт, 01.01.2015, 01:49 | Сообщение # 956 |
Mr. «Магма»
Военные сталкеры
Сообщений: 1386
| Можно ли спавнить вертолёт несколько раз по его story_id ?
У мутантов тоже есть группировки. © Движок X-Ray
|
|
|
Эти 0 пользователя(ей) поблагодарили asd123 за это полезное сообщение: |
|
|
Сахар | Дата: Чт, 01.01.2015, 05:40 | Сообщение # 957 |
Гражданский
Пользователи
Сообщений: 2
| asd123, Нет, у всех объектов должен быть разный story id.
|
|
|
Эти 0 пользователя(ей) поблагодарили Сахар за это полезное сообщение: |
|
|
denis2000 | Дата: Чт, 01.01.2015, 12:37 | Сообщение # 958 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата asd123 ( ) При попадании в вертолет, последний не подает звуков ранения, хотя mute = false стоит. Как описал makdm, разрабы не меняли ничего после ЧН, а значит звук должен быть. Чтобы он "дожен быть" в скрипте bind_heli.script в функции heli_binder:on_hit попробуйте расскоментировать строку: Код --xr_sound.set_sound_play(self.object:id(), self.snd_hit)
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
Сахар | Дата: Чт, 01.01.2015, 15:20 | Сообщение # 959 |
Гражданский
Пользователи
Сообщений: 2
| Всем привет. Раз уж мы затронули тему вертолётов то у меня такой вопрос. Прописал вертушки врагом ГГ, а вертолёт всё равно летает по патрульным путям и стреляет в меня только если я нахожусь на пути его следования и то даже если я нахожусь в «мёртвой зоне». Это так задумано или я про какой-то параметр не знаю?
|
|
|
Эти 0 пользователя(ей) поблагодарили Сахар за это полезное сообщение: |
|
|
makdm | Дата: Чт, 01.01.2015, 15:41 | Сообщение # 960 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| Сахар,вот почитайте урок по логике вертолёта. Я его писал для другого сайта. Может вам в чём-то и поможет.
[cut noguest=Урок по логике вертолёта] Делаем квест с вертолётом. Задача: Сбить вертолёт выстрелом с гранатомёта.
Причём вертолёт после получения хита начинает гореть, затем пикировать, пилоты пытаются выравнить вертолёт, кричат в эфире, но вертушка не слушается, при
столкновении с землёй разваливается на части и происходит взрыв. На месте падения пожар и два тела пилотов.
Всё это делается в логике вертолёта.
Подготовим функцию, которая будет проверять насенение хита из РПГ и запишем её в файл xr_conditions.script.
function actor_active_rpg(actor, npc) local rpg_section = "wpn_rpg7" local actor_weapon = actor:active_item () return (actor_weapon ~= nil) and actor_weapon:section() == rpg_section end
Также в этом файле должна быть активна функция
function heli_see_actor(actor, obj) return actor ~= nil and obj:get_helicopter():isVisible( actor ) end
В файле xr_effects.script должны быть следующие функции.
Функция, поджигающая вертушку
function heli_start_flame(actor, npc) bind_heli.heli_start_flame( npc ) end
Функция, разрушающая вертушку
function heli_die(actor, npc) bind_heli.heli_die( npc ) end
Функция, отыгрывающая анимацию на месте падения ( взрыв и пожар )
function run_cam_effector(actor, npc, p) if p[1] then local loop, num = false, (1000 + math.random(100)) if p[2] and type(p[2]) == "number" and p[2] > 0 then num = p[2] end if p[3] and p[3] == "true" then loop = true end level.add_cam_effector("camera_effects\\" .. p[1] .. ".anm", num, loop, "") end end
Функция, спавна мёртвых пилотов
function spawn_corpse(actor, obj, p) --' p[1] - секция кого спаунить --' p[2] - имя патрульного пути где спаунить. local spawn_sect = p[1] local path_name = p[2] local ptr = patrol(path_name) local index = p[3] or 0 local se_obj = alife():create(spawn_sect, ptr:point(index),ptr:level_vertex_id(0),ptr:game_vertex_id(0)) se_obj:kill() end
Теперь возьмём файл анимации взрыва, например файл из ЧН kat_heli_down.anm, и поместим его по адресу gamedata\anims\camera_effects
Дальше сделаем две секции спавна пилотов например [pilot_1] и [pilot_2]. Соответственно присвоим им класс и пропишем в character_desc_... Т.е. делаем всё,
как для спавна НПС через скрипт.
Установим звук, который будет слышен при падении вертушки. Например aes_choper_crush из ТЧ. Соответственно звук должен быть прописан в конфигурационном файле script_sound.ltx, а в файле xr_effects.script должна быть функция для проигрывания звука.
Например для ЗП - это функция play_sound. Для ТЧ функция может быть другой.
Теперь all.spawn
Здесь нужно понимать, что вертушка не привязана к AI-сетке и как следствие "не видит" геометрию локации, пока не будет разрушена.
Прописываем начальную точку вертушки (можно прописать прямо под точкой атаки, опустив вертушку под локацию метров на 30).
Пусть это точка heli_wait_quest_move
Вписываем точку на которой будет висеть вертушка при её атаке. Лучше сделать повыше - метров 40, чтобы лучше пикировала. Назовём точку heli_attack_gg_move
Дальше выбираем точку падения вертушки ( лучше брать какой-нибудь косогор или здание, чтобы создать эффект столкновения ) и точку куда будет направлен нос
вертолёта при падении. Пусть это будут точки heli_crash_move и heli_crash_look. В точке heli_crash_move поставим сигнал p0:name = wp00|sig=crash
Рядом с точкой падения heli_crash_move ( метрах в трёх от неё ) сделаем две точки, на которых будут лежать тела пилотов. Например pilot_1_way и pilot_2_way.
Сигналом к началу квеста будет выдача инфопоршион start_quest.
С подготовкой закончили теперь сама логика вертушки.
[logic] active = heli_move@idle on_hit = hit
[hit] on_info = {=actor_active_rpg()} %+black_hawk_down% ;если получен хит из РПГ - начинать гореть и падать
; ;Сидим тихо, никого не трогаем под локацией. Мы, как бы, ещё не прилетели. ;
[heli_move@idle] path_move = heli_wait_quest_move ;отличается от heli_attack_gg_move по оси Y на 70 метров вниз path_look = actor max_velocity = 20 upd_vis = 3 engine_sound = false immortal = true invulnerable = true enemy = nil use_mgun = false use_rocket = false on_info = {+start_quest} heli_move@find_gg ;Квест начался, включаем звук моторов, взлетаем и занимаем исходную позицию.
; ;Режим ожидания. ;Если мы ГГ не видим - боезапас не расходуем. Ждём когда появится или вылезет из укрытия. ; ; [heli_move@find_gg] path_move = heli_attack_gg_move path_look = actor max_velocity = 20 upd_vis = 3 engine_sound = true immortal = true invulnerable = true enemy = actor use_mgun = false ;запрещаем использовать пулемёт use_rocket = false ;Запрещаем использовать ракеты ; on_info = {+black_hawk_down} heli_move@crash %=heli_start_flame% ;Получили хит из гранатомёта, начинаем падать и гореть. on_info2 = {=heli_see_actor} heli_move@attack ;Увидели ГГ начинаем атаковать
; ;Атакуем ГГ. Если потеряли ГГ из виду, то снова переходим в режим ожидания ;
[heli_move@attack] path_move = heli_attack_gg_move ;Путь на котором висит вертушка path_look = actor ;Направление носа вертушки max_velocity = 20 ;Скорость полёта upd_vis = 3 ;Время повторного поиска цели при потере её видимости ( если не нашли через 3 секунды - ищем новую цель). engine_sound = true ;Звук двигателя включён immortal = true ;Отключаем разрушение вертолёта, даже если потеря "здоровья" вертушки равна 100% invulnerable = true ;Включена неуязвимость вертолёта enemy = actor ;Атаковать только Главного Героя use_mgun = true ;Разрешаем использовать пулемёт use_rocket = false ;Запрещаем использовать ракеты ; on_info = {+black_hawk_down} heli_move@crash %=heli_start_flame% ;Получили хит из гранатомёта, начинаем падать и гореть. on_info2 = {!heli_see_actor} heli_move@find_gg ;Потеряли ГГ из виду - переходим в режим ожидания
; ;Нас сбили начинаем падать ;
[heli_move@crash] path_move = heli_crash_move ;точка падения path_look = heli_crash_look ;направление носа при падении max_velocity = 120 ;Увеличиваем скорость падения upd_vis = 3 engine_sound = true immortal = true enemy = nil ;все враги отменяются - нам уже ни до них use_mgun = false ;стрельба из пулемёта - отменяется use_rocket = false ;стрельба ракетами - отменяется on_game_timer = 40 | %=play_sound(aes_choper_crush)% ;Через пять секунд после начала падения проигрываем звук из кабины пилотов ; ;если вертушка в точке падения - разрушаем вертушку, производим взрыв и пожар, выбрасываем пилотов из кабины ; on_signal = crash | nil %=heli_die =run_cam_effector(kat_heli_down) =spawn_corpse(pilot_1:pilot_1_way) =spawn_corpse(pilot_2:pilot_2_way)%
Удачного модинга! makdm[/cut]
Терпение...... И все получится!
Сообщение отредактировал makdm - Чт, 01.01.2015, 15:46 |
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
|