Модостроение. Общие вопросы и ответы
|
|
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 за это полезное сообщение: |
|
|
denis2000 | Дата: Чт, 19.06.2014, 12:11 | Сообщение # 481 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| alex_xp_77, Это делается не столько в 3D редакторе сколько в SDK. 1. Создается целый объект (meshes\objects\dynamics\box\box_wood_01.ogf) 2. Создается несколько объектов на которые развалиться основной (meshes\objects\dynamics\box\prt\box_wood_01_prt1.ogf...box_wood_01_prt7.ogf) 3. В кастом дате основного объекта прописывается конфигурация разрушения (config\models\objects\box_wood_01.ltx), в частности список объектов на которые развалиться, звук и партиклы разрушения, имунитеты, время автоудаления фрагментов и физические параметры разрушения.
Цитата NIV ( ) однако скрипт не работает. Как определили, что не работает? А в солянке работает?
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
NIV | Дата: Чт, 19.06.2014, 12:34 | Сообщение # 482 |
Полевой исследователь
Ученые сталкеры
Сообщений: 167
| Цитата denis2000 ( ) Как определили, что не работает? А в солянке работает? Да, в Солянке работает. А у меня не происходит никаких действий, как будто оружие без скрипта. Раскомментировал функцию, которая лог пишет - в консоли все равно ничего. Так что или скрипт не привязался, или обработка кнопок мыши не срабатывает.
Биндер объекту назначали? denis2000
А это - не оно? script_binding = bind_ggun.init Или где-то еще надо?
Да это оно. У меня прекрасно работает. После лечения вылетов с функциями которые более не поддерживаются движком. denis2000
Да, поменял Init на SetWndPos
Значит скрипт 100% работает, у вас может нечетко работать определение нажатия кнопок, у меня этого не наблюдается. Пилите метод update это там: нажатие левой кнопки определяется по расходу боеприпасов, а правой по прицеливанию. denis2000
Действительно, пришлось кое-что исправить. Определение левой кнопки работает не так, как задумано, но оно там и не нужно. Довёл грави-пушку до ума и решил поделиться ей со всеми желающими: Смотреть здесь.
Изменяем реальность S.T.A.L.K.E.R. CoP: "Цена Новых Исследований" / "New Investigations' Value"
Сообщение отредактировал NIV - Пт, 20.06.2014, 10:51 |
|
|
Эти 0 пользователя(ей) поблагодарили NIV за это полезное сообщение: |
|
|
avalon | Дата: Чт, 19.06.2014, 22:44 | Сообщение # 483 |
Гражданский
Пользователи
Сообщений: 7
| Доброго времени суток всем! Играю сейчас в сборку от “danu” (SGM_2.2+Albor+Textures+AtmosFear_3), всё радует кроме пары нюансов: 1- в сборке Альбора при использование аптечки и бинта убирается оружие, впрочем как и в реальности, и мне это нравится (так как я ярый фанат реализма и хардкора, который всегда играет без прицела, без депозитов, мародерства и прочих упрощающих игру манипуляций), но увы в сборке от danu – использование аптечки и бинта возможно во время стрельбы без убирания оружия; 2- Приём медикаментов, энергетиков и водки больше не сопровождаются одурманиванием и шатанием, а также заражением или избавлением от токсинов, в отличии от оригинальной сборки Енота. Естественно я писал в ЛС к автору сборки но, увы после многочисленных компиляций файлов своей сборки, он не может точно ответить как вернуть данные эффекты. P.S. Поиском и гуглом я умею пользоваться, и вернуть худ Альбора в сборку от danu я сам смог, но могу только догадываться – какие файлы или конфиги нужно изменить, что бы исправить две свои выше написанные просьбы…
|
|
|
Эти 0 пользователя(ей) поблагодарили avalon за это полезное сообщение: |
|
|
suhar_ | Дата: Сб, 21.06.2014, 21:32 | Сообщение # 484 |
Бывалый
Пользователи
Сообщений: 106
| denis2000, к посту 479: Правильно ли я понимаю, что для функции поломки шлемов всё будет выглядеть аналогично local outfit_classes = {} перейдёт в local helmet_classes = {} и т.д. За исключением блока outfit_classes = { [clsid.equ_exo] = true, [clsid.equ_military] = true, [clsid.equ_scientific] = true, [clsid.equ_stalker_s] = true, [clsid.helmet] = true} Что должен содержать внутри новый блок helmet_classes = {...} ???
Шлемы уже и так входят в эту таблицу: [clsid.helmet] = true denis2000
|
|
|
Эти 0 пользователя(ей) поблагодарили suhar_ за это полезное сообщение: |
|
|
makdm | Дата: Сб, 21.06.2014, 22:51 | Сообщение # 485 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| suhar_, clsid шлемов уже включён в таблицу outfit_classes, поэтому для шлема достаточно вызвать функцию IsOutfit. Если вы хотите разделить шлемы и бронекостюмы, тогда из таблицы outfit_classes нужно удалить [clsid.helmet] = true А в таблицу helmet_classes добавить [clsid.helmet] = true Также следует написать функцию IsHelmet
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
suhar_ | Дата: Вс, 22.06.2014, 09:32 | Сообщение # 486 |
Бывалый
Пользователи
Сообщений: 106
| Цитата denis2000 ( ) Шлемы уже и так входят в эту таблицу То есть шлемы должны ломаться так же как и костюмы? С костюмами всё работает исправно, а вот шлемы не портятся. Цитата makdm ( ) Если вы хотите разделить шлемы и бронекостюмы Разделил, как вы сказали. Ситуация аналогичная: костюмы портятся, шлемы нет. [cut] Правки в файле _g.script: ... local helmet_classes = {} ... function isHelmet(object, class_id) local id = class_id or get_clsid(object) return helmet_classes[id] == true end ... helmet_classes = { [clsid.helmet] = true} ...
В файле death_manager.script: ... if isHelmet(item) then set_helmet_drop_condition(item) return end ... function set_helmet_drop_condition(item) local condition = (math.random(80)+10)/100 item:set_condition(condition) end ...
Все блоки находятся на своих местах, как указывал denis2000, в нужной последовательности. Конечно, если это имеет значение. [/cut]
|
|
|
Эти 0 пользователя(ей) поблагодарили suhar_ за это полезное сообщение: |
|
|
denis2000 | Дата: Вс, 22.06.2014, 10:33 | Сообщение # 487 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| suhar_, Пробуйте: Код helmet_classes = { [clsid.helmet] = true, [clsid.equ_helmet_s] = true} Если не получается придется смотреть конкретный clsid объекта и вносить в таблицу его, например если clsid = 41: Код helmet_classes = { [clsid.helmet] = true, [clsid.equ_helmet_s] = true, [41] = true}
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
suhar_ | Дата: Вс, 22.06.2014, 10:52 | Сообщение # 488 |
Бывалый
Пользователи
Сообщений: 106
| Цитата denis2000 ( ) [clsid.equ_helmet_s] = true Этот блок решил проблему. Спасибо, заработало:)
|
|
|
Эти 0 пользователя(ей) поблагодарили suhar_ за это полезное сообщение: |
|
|
sergej5500 | Дата: Вс, 22.06.2014, 20:59 | Сообщение # 489 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый вечер. Возник такой вопрос.
[cut=Логика проводника до Скадовска][logic] active = move@vagrant_walking_one on_death = death on_hit = hit post_combat_time = 5,10
[hit] on_info = %+zat_accompany_stalker_hit%
[death] on_info = {-zat_accompany_to_boat_start} %+zat_accompany_stalker_death%,{+zat_accompany_to_boat_start -zat_accompany_to_boat_daleko} %+zat_accompany_stalker_death +zat_accompany_to_boat_i_am_alone%
[move@vagrant_walking_one] move_avail_speak = 15|wait|true|true move_dest_number = 308681 move_state_when_center = guard move_state_when_move = patrol move_stop_on_talk = true on_signal = on_center|move@vagrant_walking_two on_info = {+zat_accompany_to_boat_start -zat_accompany_to_boat_complete} move@accompany_pursue on_info2 = {+zat_accompany_to_boat_sam =dist_to_actor_ge(150)} nil %=release_npc% meet = meet
[move@vagrant_walking_two] move_avail_speak = 15|wait|true|true move_dest_number = 320703 move_state_when_center = guard move_state_when_move = patrol move_stop_on_talk = true on_signal = on_center|move@vagrant_walking_one on_info = {+zat_accompany_to_boat_start -zat_accompany_to_boat_complete} move@accompany_pursue on_info2 = {+zat_accompany_to_boat_sam =dist_to_actor_ge(150)} nil %=release_npc% meet = meet
[move@accompany_pursue] scheme_type = patrol patrol_count_path = 15 patrol_path_1 = 393388 patrol_path_1_state = rush patrol_path_2 = 517628 patrol_path_2_state = rush patrol_path_3 = 597306 patrol_path_3_state = rush patrol_path_4 = 690040 patrol_path_4_state = rush patrol_path_5 = 786661 patrol_path_5_state = rush patrol_path_6 = 859798 patrol_path_6_state = rush patrol_path_7 = 918418 patrol_path_7_state = rush patrol_path_8 = 980374 patrol_path_8_state = rush patrol_path_9 = 1020355 patrol_path_9_state = rush patrol_path_10 = 1107292 patrol_path_10_state = rush patrol_path_11 = 1117039 patrol_path_11_state = rush patrol_path_12 = 1133012 patrol_path_12_state = rush patrol_path_13 = 1161336 patrol_path_13_state = rush patrol_path_14 = 1169728 patrol_path_14_state = run approach_state = hide_na|18|> on_patrol_path = 14|move@vagrant_walking_two %=send_tip(zat_accompany_final_text:portrait_neutral_1:zat_accompany_stalker_title:5000)% on_info = {+zat_accompany_to_boat_start -zat_accompany_to_boat_complete -zat_accompany_to_boat_daleko =dist_to_actor_ge(90)} nil %+zat_accompany_to_boat_daleko =release_npc% on_info2 = {+zat_accompany_to_boat_complete} move@vagrant_walking_two on_info3 = {=zat_accompany_stalker_ambush_cond -zat_accompany_to_boat_ambush} %+zat_accompany_to_boat_ambush =zat_accompany_stalker_ambush_action%
[on_corpse_use] run_action = zat_accompany_to_boat
[meet] abuse = true use = {=dist_to_actor_le(3) -zat_accompany_to_boat_start -zat_accompany_to_boat_sam !actor_enemy !has_enemy} self, false allow_break = false meet_on_talking = false trade_enable = false[/cut] Переделал логику под эксклюзива на смарте. [cut=Логика][on_corpse_use] run_action = zat_accompany_to_boat
[walker@global_zat_accompany_stalker] gather_items_enabled = false help_wounded_enabled = false corpse_detection_enabled = false
[logic@zat_accompany_stalker] active = walker@zat_accompany_stalker suitable = {=check_npc_name(zat_accompany_stalker)} true prior = 300 post_combat_time = 0,0
[walker@zat_accompany_stalker]:walker@global_zat_accompany_stalker path_walk = zat_accompany_stalker_walk avail_speak = 15|wait|true meet = meet on_info = {+zat_accompany_to_boat_start -zat_accompany_to_boat_complete} walker@zat_accompany_stalker_pursue
[walker@zat_accompany_stalker_pursue] path_walk = zat_accompany_stalker_pursue_walk def_state_standing = walk def_state_moving = assault on_signal = zat_accompany_to_boat_complete | walker@zat_accompany_stalker_final %=send_tip(zat_accompany_final_text:portrait_neutral_1:zat_accompany_stalker_title:5000) +zat_accompany_to_boat_complete% on_info = {=zat_accompany_stalker_ambush_cond -zat_accompany_to_boat_ambush} %+zat_accompany_to_boat_ambush =zat_accompany_stalker_ambush_action% on_info2 = {+zat_accompany_to_boat_complete} walker@zat_accompany_stalker_final meet = no_meet
[walker@zat_accompany_stalker_final]:walker@global_zat_accompany_stalker path_walk = zat_accompany_stalker_walk avail_speak = 15|wait|true meet = no_meet
[meet] abuse = true allow_break = true use = {=dist_to_actor_le(3) -zat_accompany_to_boat_start -zat_accompany_to_boat_sam !actor_enemy !has_enemy} self, false trade_enable = false meet_on_talking = false [/cut] В обоих файлах есть секция on_corpse_use. При юзании трупа непися она вызывает ф-ию, записанную в xr_effects.
Применяемые функции: [cut=xr_additional]function on_corpse_use(npc,char_ini,on_corpse_use) local on_corpse_use = on_corpse_use or "on_corpse_use" if char_ini~=nil and char_ini:section_exist(on_corpse_use) and not npc:alive() then if char_ini:line_exist(on_corpse_use,"start_tutorial") then game_hide_menu() game.start_tutorial(char_ini:r_string(on_corpse_use,"start_tutorial")) elseif char_ini:line_exist(on_corpse_use,"run_action") then game_hide_menu() xr_effects[char_ini:r_string(on_corpse_use,"run_action")](actor,npc) game_hide_menu() elseif char_ini:line_exist(on_corpse_use,"give_info") then game_hide_menu() give_info(char_ini:r_string(on_corpse_use,"give_info")) end end end [/cut] [cut=xr_motivator]function motivator_binder:use_callback(obj, who) if self.object~=nil then if self.object:alive() then inventory_upgrades.need_victim(obj) xr_meet.notify_on_use(obj, who) dialog_manager.disabled_phrases[obj:id()] = nil if self.st.active_section then xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "use_callback", obj, who) end else if self.once_use_processed == false then local st = db.storage[self.object:id()] self.once_use_processed = true local on_corpse_use = utils.cfg_get_string(self.object:spawn_ini(),st.section_logic,"on_corpse_use",self.object, false, "", nil) sgm_callbacks.on_use_corpse(self.object) xr_additional.on_corpse_use(self.object,self.object:spawn_ini(),known_info) end end end end [/cut] [cut=sgm_callbacks]function on_use_corpse(npc) if has_alife_info("disk_breaking_installed") then sgm_functions.extract_money_from_corpse(npc) end if npc:profile_name()=="val_b3_base_commander_3" and dont_has_alife_info("val_shade_of_time_renegade_help") then give_info("val_shade_of_time_renegade_help") end end [/cut]
Функция работает для НПС с кастом-датой и никак не хочет работать у эксклюзива на смарте. Что и в каких файлах надо поправить, чтобы секция логики читалась?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
denis2000 | Дата: Пн, 23.06.2014, 08:59 | Сообщение # 490 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| sergej5500, Не работает потому, что для НПС под эсклюзивом self.object:spawn_ini() не содержит логики НПС, поскольку она приписана к смарту, а не к спавнсекции НПС. Быстрый совет: попробуйте в секции НПС прописать custom_data = scripts\....on_corpse_use_section.ltx А в этом файле соответствено только секцию: Код [on_corpse_use] run_action = zat_accompany_to_boat
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
sergej5500 | Дата: Пн, 30.06.2014, 09:46 | Сообщение # 491 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый день. Возникла такая проблема.
1. Перевел под сквады СГМ-неписей (торговец, банкир, Меч и т.д.). 2. Вместе с оригинальными сквадами ЗП на Скадовске одновременно может находиться до 20 сквадов квестовых персонажей. 3. На Скадовск приходят "ночевать" сквады из симуляции. Ночью счетчик НПС на судне показал 53 штуки. Игра при этом превращается в слайд-шоу.
Вопрос. Можно ли как-то ограничить число симуляционных сквадов, приходящих "ночевать" на судно? Если число симуляционных сквадов ограничить 5, то неписей на судне будет примерно 30-35. Это еще терпимо.
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
denis2000 | Дата: Пн, 30.06.2014, 11:13 | Сообщение # 492 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| sergej5500, Ограничьте лучше общее количество возможных сквадов на Скадовске или исключите его смарт из симуляции.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
X-ray115 | Дата: Вт, 01.07.2014, 11:21 | Сообщение # 493 |
Гражданский
Пользователи
Сообщений: 7
| переносил ак12 из arsenal overhaul 2 в сгм 2.2 сборка енота, при взятии его в руки происходит вылет с таким логом: [cut noguest=Лог]FATAL ERROR [error]Expression : pm->m_animations.size() [error]Function : player_hud_motion_container::load [error]File : D:\prog_repository\sources\trunk\xrGame\player_hud.cpp [error]Line : 92 [error]Description : motion not found [ak_no_reload]
stack trace:[/cut] В чем причина?
|
|
|
Эти 0 пользователя(ей) поблагодарили X-ray115 за это полезное сообщение: |
|
|
FantomICW | Дата: Вт, 01.07.2014, 12:05 | Сообщение # 494 |
Лидер «Свободы»
Свобода
Сообщений: 4438
| X-ray115, не найдена анимация ak_no_reload.
|
|
|
Эти 0 пользователя(ей) поблагодарили FantomICW за это полезное сообщение: |
|
|
X-ray115 | Дата: Вт, 01.07.2014, 12:17 | Сообщение # 495 |
Гражданский
Пользователи
Сообщений: 7
| Цитата FantomICW ( ) X-ray115, не найдена анимация ak_no_reload. в папке anims (arsenal overhaul 2) этой анимации нет, где она может быть?
Она содержиться в omf или ogf файле. И таких анимаций долждно быть две! Одна для рук, другая для оружия. denis2000
|
|
|
Эти 0 пользователя(ей) поблагодарили X-ray115 за это полезное сообщение: |
|
|
|