Overf1rst 1 503 Опубликовано 1 июля, 2020 Тема посвящена моддингу на платформе Зов Припяти. Правила темы: Здесь задают вопросы и получают на них ответы. Прежде чем задать вопрос, воспользуйтесь поиском, ответ на него, вероятно, уже есть. Если у вас произошёл вылет, проверьте лог и поищите информацию об ошибке в справочнике. Также будет полезно посмотреть справочник ошибок. Если у Вас вылетает какой-то мод, то следует написать в тему этого мода. Грамотно оформляйте свой пост, чётко доносите суть своего вопроса (ответа). Благодарность выражаем в личке или же ставим реакцию. Посты с благодарностями в теме будут удаляться. 19 9 1 1 2 6 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Apka 77 Опубликовано 6 июня, 2022 Только что, Mindallius сказал: Видимо да, я удалил все из орига. Но ведь вроде во всех модах так? Типо в гейм дате только новое, а старое в запакованных файлах Где-то у тебя запрашивается конкретно эта строка, потому и ругается игра. Первоочередно используются файлы геймдаты, если он перезаписывает файл в запакованных ресурсах - будет вылет. Адаптация модификаций Смерти вопреки и GUNSLINGER mod Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Mindallius 6 Опубликовано 6 июня, 2022 1 минуту назад, Apka сказал: Где-то у тебя запрашивается конкретно эта строка, потому и ругается игра. Первоочередно используются файлы геймдаты, если он перезаписывает файл в запакованных ресурсах - будет вылет. спасибо. учту Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Apka 77 Опубликовано 6 июня, 2022 Повторюсь, но мб кто нибуть подскажет ответ на сий вопрос? Адаптация модификаций Смерти вопреки и GUNSLINGER mod Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Mindallius 6 Опубликовано 6 июня, 2022 (изменено) Хотел бы спросить, как выдать предмет(пм допустим ) гг через диалог? Желательно на примере, чтоб я меньше засорял данную тему Изменено 6 июня, 2022 пользователем Mindallius Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
rev9 0 Опубликовано 6 июня, 2022 Здравствуйте, хочу обратиться с вопросом: каким образом можно осуществить в скрипте привязку нажатия кнопок к действию(в данном случае - проигрыванию anm файла)? Изучение мною скриптов ЗП показало, что в основном привязка клавиш используется для UI-интерфейсов, а попытки адаптировать(возможно, что из-за моей криворукости) успеха не добились. Я уже 2-й день мучаюсь над этим вопросом, пытаясь адаптировать один модец из Аномали. Может, есть примеры того, как в ЗП осуществляется привязка кнопки? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
denis2000 978 Опубликовано 6 июня, 2022 9 минут назад, rev9 сказал: Может, есть примеры того, как в ЗП осуществляется привязка кнопки? Для этого правят движок. Путь во мгле. Связь времен."Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
rev9 0 Опубликовано 6 июня, 2022 denis2000 значит, в стоке dik_to_bind в скриптах используется исключительно для UI? Спасибо за прояснение. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
bsanek628 2 Опубликовано 6 июня, 2022 На 4-ех тряпках стоит одинаковый description. Если я поменяю 3 нижних на другие (на v1, v2, v3, к примеру) и потом обновлю в самом конфиг-файле outfit.ltx, никаких глюков с и проблем с отображением описания не будет? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Doctor_Oz 29 Опубликовано 6 июня, 2022 1 час назад, bsanek628 сказал: На 4-ех тряпках стоит одинаковый description. Если я поменяю 3 нижних на другие (на v1, v2, v3, к примеру) и потом обновлю в самом конфиг-файле outfit.ltx, никаких глюков с и проблем с отображением описания не будет? Ну если первый отображается нормально, то и следующие будут в норме. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
denis2000 978 Опубликовано 6 июня, 2022 (изменено) 2 часа назад, rev9 сказал: значит, в стоке dik_to_bind в скриптах используется исключительно для UI? Вообще не так. Эта движковая функция переводит код нажатой клавиши в код запрограммированного действия (например идти вперед). Вызвать ее можно в любом месте и передать в нее можно любое целое число в определенных пределах, но смысла будет ноль. А теперь посмотрите где и как ее используют: class "load_dialog" (CUIScriptWnd) ... function load_dialog:OnKeyboard(dik, keyboard_action) local bind = dik_to_bind(dik) ... end То есть имеем некий объект load_dialog указанного класса CUIScriptWnd (скриптовое диалоговое окно) у которого есть событие OnKeyboard, а значит если этот объект отрисован на экране и активен, а в это время нажата какая то клавиша, то в указанную функцию будет передан код нажатой клавиши первым параметром, а далее переводим клавишу в код действия. Так вот патченный/правленный движок имеет возможность колбека с передачей нажатой клавиши в любой момент в любую назначенную для этого функцию. Apka Конфиг бинокля ссылается на текстуру по имени в scopes.xml/scopes_16.xml, они в свою очередь по имени например! в textures_descr\ui_ingame.xml, а уж там указан конкретный файл текстуры с размерами выкройки из нее. Изменено 6 июня, 2022 пользователем denis2000 1 Путь во мгле. Связь времен."Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
rev9 0 Опубликовано 6 июня, 2022 51 минуту назад, denis2000 сказал: Так вот патченный/правленный движок имеет возможность колбека с передачей нажатой клавиши в любой момент в любую назначенную для этого функцию. Теперь понял. Можете подсказать, какие секции / разделы движка CoC (там эта правка есть) следует изучать, чтобы увидеть эту правку? Еще раз благодарю. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Сталкер из прошлого 115 Опубликовано 7 июня, 2022 Совершенно нубский вопрос, но всё же: как сделать вызов скрипта при поднятии определённого предмета? Условно говоря, мы поднимаем уникальный предмет (к примеру wpn_pm_unique), и при его наличии в инвентаре у ГГ, запускается скрипт из другого файла, спавнящий кровососа. Функцию спавна кровососа я знаю, а вот как написать функцию его вызова при наличии у ГГ нужного предмета, так и не понял. От "большого ума" пробовал написать и повесить на апдейт в bind_stalker такую функцию: Спойлер function podnyal_pm() if db.actor:object("wpn_pm_unique") then new_spawn.krovosos_create end return end - ожидаемо получил вылет с "bind_stalker.script: attempt to index a nil value". ASUS z87-k, I5-4670 @3.40GHz, MSI GTX 1050ti, 16gb ОЗУ, SSD 100gb, 2xHDD 500gb, Windows 10 Pro. Аномали на ультрах летает. Вместе с компом по комнате. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Mervin62 783 Опубликовано 7 июня, 2022 Сталкер из прошлого Хоть вы меня и минусили, но я не злопамятный, расскажу как делал я. Знаю два варианта. Первый через логику спайсрестриктора, а второй через логику смарт терейна спавн монстра или кого угодно при условии наличия определенного предмета у гг. 1 Адаптации ганслингера на моды зов припятиВсегда на связи в телеге @Mervin62 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Arkada 428 Опубликовано 7 июня, 2022 Сталкер из прошлого Нужно две скобки добавить, ведь это и есть вызов функции в Lua Например: test.print - Это ССЫЛКА на ФУНКЦИЮ test.print() - Это ВЫЗОВ функции 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Mervin62 783 Опубликовано 7 июня, 2022 (изменено) Сталкер из прошлого Через спайсрестриктор нужно указывать точку спавна, а в смарттерейне просто указываете условие спавна, все просто. Оба варианта рабочие проверенно не раз. Изменено 7 июня, 2022 пользователем Mervin62 1 Адаптации ганслингера на моды зов припятиВсегда на связи в телеге @Mervin62 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Сталкер из прошлого 115 Опубликовано 7 июня, 2022 6 минут назад, liner сказал: Нужно две скобки добавить Ага, это забыл, только всё равно вылет тот же идёт, scripts\bind_stalker.script:241: attempt to index a nil value. Mervin62 Спасибо, были мысли про рестриктор. Но если например требуется не спавн выполнить при наличии предмета, а действие какое-то (допустим изменить отношения с группировкой)? ASUS z87-k, I5-4670 @3.40GHz, MSI GTX 1050ti, 16gb ОЗУ, SSD 100gb, 2xHDD 500gb, Windows 10 Pro. Аномали на ультрах летает. Вместе с компом по комнате. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Mervin62 783 Опубликовано 7 июня, 2022 8 минут назад, Сталкер из прошлого сказал: , а действие какое-то ( Это я делал так же через sr или логику нпс, но тогда надо писать следующую секцию логики этого нпс. 1 Адаптации ганслингера на моды зов припятиВсегда на связи в телеге @Mervin62 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Arkada 428 Опубликовано 7 июня, 2022 26 минут назад, Сталкер из прошлого сказал: scripts\bind_stalker.script:241: attempt to index a nil value. Нету функции значит. Либо опечатка либо её в файле нету. Всё же в логе сказано. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
BASE1707 58 Опубликовано 7 июня, 2022 (изменено) 15 часов назад, rev9 сказал: там эта правка есть Пример реализации дополнительных коллбеков (press/hold/release button) на X-Ray 1.6: Спойлер 1. Регистрируем дополнительные пользовательские события. Открываем xrGame/game_object_space.h, ищем перечисление ECallbackType и дописываем перед идентификатором с индексом -1 (на моём примере будет как-то так): // ... eWeaponNoAmmoAvailable, // New callbacks eKeyPress, eKeyRelease, eKeyHold, eDummy = u32(-1), 2. Экспортируем свежесозданные события в скриптовой биндер, открываем xrGame/script_game_object_script.cpp: // New Callbacks value("key_press", int(GameObject::eKeyPress)), value("key_release", int(GameObject::eKeyRelease)), value("key_hold", int(GameObject::eKeyHold)), value("map_location_added", int(GameObject::eMapLocationAdded)) 3. Вызыем события в нужный момент времени (в моём случае они вызываются из класса CLevel и привязываются к биндеру актора). Открываем xrGame/Level_input.cpp. Вероятнее всего, для успешной компиляции Вам потребуется подключить дополнительные хеадеры - вставляем после строчки #include "stdafx.h" #include "game_object_space.h" #include "script_callback_ex.h" #include "script_game_object.h" Теперь нам нужно пройти по соответствующим функциям, отвечающим за обработку нажатия, отпуска и держания клавиш: 1) Функция CLevel::IR_OnKeyboardPress - коллбек нажатия. После строки EGameActions _curr = get_binded_action(key); Пишем: // New callback if (CActor* pActor = smart_cast<CActor*>(CurrentEntity())) { pActor->callback(GameObject::eKeyPress)(key); } 2) Функция CLevel::IR_OnKeyboardRelease - коллбек релиза (отпускания) клавиши. После строки if (game && game->OnKeyboardRelease(get_binded_action(key)) ) return; Пишем: // New callback if (CActor* pActor = smart_cast<CActor*>(CurrentEntity())) { pActor->callback(GameObject::eKeyRelease)(key); } 3) Функция CLevel::IR_OnKeyboardHold - коллбек удержания клавиши. После строки if(g_bDisableAllInput) return; Пишем: // New callback if (CActor* pActor = smart_cast<CActor*>(CurrentEntity())) { pActor->callback(GameObject::eKeyHold)(key); } 4. Остаётся скриптовая обвязка. Мы посылаем событие из движка в скрипты, осталось их там принять и обработать. Открываем bind_stalker.script: 1) Функция actor_binder:net_destroy(). После строки self.object:set_callback(callback.hit, nil) Дописываем: self.object:set_callback(callback.key_press, nil) self.object:set_callback(callback.key_release, nil) self.object:set_callback(callback.key_hold, nil) 2) Функция actor_binder:reinit(). После строки self.object:set_callback(callback.hit, self.hit_callback, self) Дописываем: self.object:set_callback(callback.key_press, self.OnKeyPress, self) self.object:set_callback(callback.key_release, self.OnKeyRelease, self) self.object:set_callback(callback.key_hold, self.OnKeyHold, self) 3) Раскрываем добавленные коллбеки: где-нибудь в конце файла (либо же попросту вне тела уже существующих функций) пишем function actor_binder:OnKeyPress(Key) -- При нажатии на кнопку ENTER будет что-то происходить if (Key == DIK_keys.DIK_RETURN) then -- this.test_func() end end function actor_binder:OnKeyRelease(Key) end function actor_binder:OnKeyHold(Key) end Изменено 7 июня, 2022 пользователем BASE1707 1 1 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Mindallius 6 Опубликовано 7 июня, 2022 (изменено) Здраствуйте, пишу в данную тему очередной вопрос, ответ на который не очень сложно найти. В общем , суть вопроса такая- я изменил точку спавна гг с обычного, на место возле бункера ученых, там где сталкеры сидят(юпитер). Но из-за катсцены с лоцманом при новой игре гг появляется на янове. Как отключить катсцену и сделать так чтобы гг появлялся там, где это указанно в all.spawn? Дополнено 4 минуты спустя Изменено 7 июня, 2022 пользователем Mindallius Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Neptun 885 Опубликовано 7 июня, 2022 14 минут назад, Mindallius сказал: Здраствуйте, пишу в данную тему очередной вопрос, ответ на который не очень сложно найти. В общем , суть вопроса такая- я изменил точку спавна гг с обычного, на место возле бункера ученых, там где сталкеры сидят(юпитер). Но из-за катсцены с лоцманом при новой игре гг появляется на янове. Как отключить катсцену и сделать так чтобы гг появлялся там, где это указанно в all.spawn? Дополнено 4 минуты спустя ГГ необходимо выдать следующие инфопоршни: db.actor:give_info_portion("jup_first_meet_made") db.actor:give_info_portion("jup_b217_welcome_faded") db.actor:give_info_portion("jup_b217_welcome_guide_talked") db.actor:give_info_portion("jup_b217_pp_end_in_scene") db.actor:give_info_portion("jup_b217_welcome_tech_talked") db.actor:give_info_portion("jup_b217_guide_welcome_end") db.actor:give_info_portion("jup_b217_tech_welcome_end") db.actor:give_info_portion("jup_b217_tech_instruments_start") db.actor:give_info_portion("jup_b217_stalker_tech_met") Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Mindallius 6 Опубликовано 7 июня, 2022 (изменено) 1 минуту назад, Neptun сказал: ГГ необходимо выдать следующие инфопоршни: db.actor:give_info_portion("jup_first_meet_made") db.actor:give_info_portion("jup_b217_welcome_faded") db.actor:give_info_portion("jup_b217_welcome_guide_talked") db.actor:give_info_portion("jup_b217_pp_end_in_scene") db.actor:give_info_portion("jup_b217_welcome_tech_talked") db.actor:give_info_portion("jup_b217_guide_welcome_end") db.actor:give_info_portion("jup_b217_tech_welcome_end") db.actor:give_info_portion("jup_b217_tech_instruments_start") db.actor:give_info_portion("jup_b217_stalker_tech_met") А где их надо давать? В all/spawn? Изменено 7 июня, 2022 пользователем Mindallius Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
denis2000 978 Опубликовано 7 июня, 2022 Mindallius Пробуйте пустую логику рестриктора zat_b215_logic_jupiter.ltx: [logic] active = sr_idle@nil [sr_idle@nil] 1 Путь во мгле. Связь времен."Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник) Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Mervin62 783 Опубликовано 7 июня, 2022 Все добра, вопрос такого плана, в логике нпс прописываю use = false , а он все равно открыт для диалога, где я мог накосячить или что-то упустить. Адаптации ганслингера на моды зов припятиВсегда на связи в телеге @Mervin62 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
stalker032 5 Опубликовано 7 июня, 2022 (изменено) Товарищи, вопрос. У меня есть нпс, три анимации. Как мне сделать так, чтобы нпс ходил циклично по этим поинтам, , на каждом из этих трёх поинтов он останавливался на какое-то время и проигрывалась определённая анимация на определённом поинте? Идея была, но я тупой, и изначально делал не так, а как надо - не знаю. вот схемка: Спойлер поинт1_walk ---> поинт1_look ("wp00|p=100|t=10000") ---> поинт2_walk ---> поинт2_look ("wp00|p=100|t=10000") ---> поинт3_walk ---> поинт3_look ("wp00|p=100|t=10000") ---> заново. А в логике это нпс было так: Спойлер [logic@polkovnik_skpp_1] active = walker@polkovnik_skpp_1 suitable = {=check_npc_name(polkovnik_skpp)} true prior = 200 [walker@polkovnik_skpp_1] path_walk = polkovnik_walk path_look = polkovnik_look def_state_standing = stoop_no_weap on_info = nil walker@polkovnik_skpp_2 on_info1 = {!is_day} animpoint@polkovnik_skpp_1 [walker@polkovnik_skpp_2] path_walk = polkovnik_2_walk path_look = polkovnik_2_look def_state_standing = stoop_no_weap on_info = nil walker@polkovnik_skpp_3 on_info1 = {!is_day} animpoint@polkovnik_skpp_1 [walker@polkovnik_skpp_3] path_walk = polkovnik_3_walk path_look = polkovnik_3_look def_state_standing = guard_chasovoy on_info = nil walker@polkovnik_skpp_1 on_info1 = {!is_day} animpoint@polkovnik_skpp_1 [animpoint@polkovnik_skpp_1] cover_name = esc_skpp_baze_polkovnik_animpoint on_info = {=is_day} walker@polkovnik_skpp_1 Я знаю, что с nil будет вылет, это я вставил, потому что не знаю какую инфу поставить, чтобы она пропускала к следующей секции. Дополнено 50 минуты спустя 1 час назад, stalker032 сказал: Товарищи, вопрос. У меня есть нпс, три анимации. Как мне сделать так, чтобы нпс ходил циклично по этим поинтам, , на каждом из этих трёх поинтов он останавливался на какое-то время и проигрывалась определённая анимация на определённом поинте? Идея была, но я тупой, и изначально делал не так, а как надо - не знаю. вот схемка: схема (Показать контент) поинт1_walk ---> поинт1_look ("wp00|p=100|t=10000") ---> поинт2_walk ---> поинт2_look ("wp00|p=100|t=10000") ---> поинт3_walk ---> поинт3_look ("wp00|p=100|t=10000") ---> заново. А в логике это нпс было так: логика (Показать контент) [logic@polkovnik_skpp_1] active = walker@polkovnik_skpp_1 suitable = {=check_npc_name(polkovnik_skpp)} true prior = 200 [walker@polkovnik_skpp_1] path_walk = polkovnik_walk path_look = polkovnik_look def_state_standing = stoop_no_weap on_info = nil walker@polkovnik_skpp_2 on_info1 = {!is_day} animpoint@polkovnik_skpp_1 [walker@polkovnik_skpp_2] path_walk = polkovnik_2_walk path_look = polkovnik_2_look def_state_standing = stoop_no_weap on_info = nil walker@polkovnik_skpp_3 on_info1 = {!is_day} animpoint@polkovnik_skpp_1 [walker@polkovnik_skpp_3] path_walk = polkovnik_3_walk path_look = polkovnik_3_look def_state_standing = guard_chasovoy on_info = nil walker@polkovnik_skpp_1 on_info1 = {!is_day} animpoint@polkovnik_skpp_1 [animpoint@polkovnik_skpp_1] cover_name = esc_skpp_baze_polkovnik_animpoint on_info = {=is_day} walker@polkovnik_skpp_1 Я знаю, что с nil будет вылет, это я вставил, потому что не знаю какую инфу поставить, чтобы она пропускала к следующей секции. проблема решена. Изменено 7 июня, 2022 пользователем stalker032 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты