I am Dead 912 Опубликовано 26 Апреля 2021 Поделиться Опубликовано 26 Апреля 2021 Есть такая функция из xr_codition.script -- true если у актора одет шлем указанной секции function actor_wear_helmet(actor, npc, p) return p[1] ~= nil and actor:object( p[1] ) ~= nil and actor:item_in_slot(10) ~= nil and actor:item_in_slot(10):section() == p[1] end Как сделать тоже самое только для проверки предмета который находится на поясе? P.S почему то не получается с телефона поместить под спойлер. Ссылка на комментарий
Biblia 4 Опубликовано 26 Апреля 2021 Поделиться Опубликовано 26 Апреля 2021 @I am Dead напомните, какой функцией это задается? Ссылка на комментарий
I am Dead 912 Опубликовано 26 Апреля 2021 Поделиться Опубликовано 26 Апреля 2021 @Biblia Блин, я сейчас не у компьютера поэтому не могу наизусть пример написать. Тем более в интернета полно уроков на эту тему. Ссылка на комментарий
Biblia 4 Опубликовано 26 Апреля 2021 Поделиться Опубликовано 26 Апреля 2021 @I am Dead я гугли, но везде, увы, только проверки на наличие предмета и тому подобное, что мне сейчас не надо ( В ютубе пока не смотрел, ибо нет возможности. Ссылка на комментарий
I am Dead 912 Опубликовано 26 Апреля 2021 Поделиться Опубликовано 26 Апреля 2021 @Biblia Пример можешь поглядеть в новом арсенале 6, там есть скрипт на озвучивание подбираемого предмета по его классу( самое первое что пришло где можно подглядеть пример использования). 1 2 Ссылка на комментарий
Norman Eisenherz 309 Опубликовано 27 Апреля 2021 Поделиться Опубликовано 27 Апреля 2021 @Баба ЯГА [bind_physic_object.script] generic_physics_binder:use_callback(obj, who) Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
ARTLantist 14 Опубликовано 27 Апреля 2021 Поделиться Опубликовано 27 Апреля 2021 25.04.2021 в 23:16, Biblia сказал(а): Естественно, прописывать такое для каждого из предметов - глупо С чего ты это взял?) Даже в таком сложном в функциональном плане моде, как Dead Air, сделано для каждого предмета отдельно. Вот: Скрытый текст outfit = { [0] = "actor_effects.use_weapon(0)", [1] = "xr_effects.disable_ui_lite_with_imput(db.actor, nil)", [2] = "xr_effects.play_inv_repair_sewing_kit()", [378] = "actor_effects.use_helmet(0)", [379] = "xr_effects.disable_nv(db.actor, nil)", [380] = "xr_effects.disable_ui_inventory(db.actor, nil)", [550] = "level.add_cam_effector('camera_effects\\\\item_use_fast.anm', 8063, false,'')", [2900] = "level.add_pp_effector('surge_fade.ppe', 8023, false)", [3020] = "level.add_cam_effector('camera_effects\\\\item_use_slow.anm', 8064, false,'')", [6000] = "level.remove_pp_effector(8023)", [7001] = "xr_effects.enable_ui_lite(db.actor, nil)", [7002] = "actor_effects.use_helmet(1)", [7003] = "xr_effects.enable_nv_and_imput(db.actor, nil)", [7004] = "actor_effects.use_weapon(1)" }, helm = { [0] = "actor_effects.use_weapon(0)", [1] = "xr_effects.disable_ui_lite_with_imput(db.actor, nil)", [2] = "xr_effects.disable_nv(db.actor, nil)", [3] = "actor_effects.use_helmet(0)", [4] = "xr_effects.disable_nv(db.actor, nil)", [5] = "level.add_cam_effector('camera_effects\\\\item_use_fast.anm', 8053, false,'')", -- [6] = "xr_effects.play_inv_repair_sewing_kit()", [7] = "level.add_cam_effector('camera_effects\\\\item_use_slow.anm', 8054, false,'')", [380] = "xr_effects.disable_ui_inventory(db.actor, nil)", [1700] = "actor_effects.use_helmet(1)", [1701] = "xr_effects.enable_ui_lite(db.actor, nil)", [2500] = "xr_effects.enable_imput(db.actor, nil)", [2503] = "actor_effects.use_weapon(1)" }, gun_oil_dummy = { [0] = "actor_effects.use_weapon(0)", [1] = "xr_effects.disable_ui_lite_with_imput(db.actor, nil)", -- [378] = "actor_effects.use_helmet(0)", -- [379] = "xr_effects.disable_nv(db.actor, nil)", [550] = "level.add_cam_effector('camera_effects\\\\item_use.anm', 8053, false,'')", [1040] = "xr_effects.disable_ui_inventory(db.actor, nil)", [1460] = "xr_effects.play_inv_repair_spray_oil()", [4351] = "xr_effects.enable_ui_lite(db.actor, nil)", -- [5450] = "actor_effects.use_helmet(1)", [6050] = "xr_effects.enable_imput(db.actor, nil)", [6650] = "actor_effects.use_weapon(1)" }, gun_oil_2_dummy = { [0] = "actor_effects.use_weapon(0)", [1] = "xr_effects.disable_ui_lite_with_imput(db.actor, nil)", -- [378] = "actor_effects.use_helmet(0)", -- [379] = "xr_effects.disable_nv(db.actor, nil)", [550] = "level.add_cam_effector('camera_effects\\\\item_use.anm', 8053, false,'')", [1040] = "xr_effects.disable_ui_inventory(db.actor, nil)", [1460] = "xr_effects.play_inv_repair_spray_oil()", [4351] = "xr_effects.enable_ui_lite(db.actor, nil)", -- [5450] = "actor_effects.use_helmet(1)", [6050] = "xr_effects.enable_imput(db.actor, nil)", [6650] = "actor_effects.use_weapon(1)" }, cleaning_kit_p_dummy = { [0] = "actor_effects.use_weapon(0)", [1] = "xr_effects.disable_ui_lite_with_imput(db.actor, nil)", -- [378] = "actor_effects.use_helmet(0)", -- [379] = "xr_effects.disable_nv(db.actor, nil)", [550] = "level.add_cam_effector('camera_effects\\\\item_use_fast.anm', 8063, false,'')", [1040] = "xr_effects.disable_ui_inventory(db.actor, nil)", [1460] = "xr_effects.play_inv_repair_brushes()", [3020] = "level.add_cam_effector('camera_effects\\\\item_use.anm', 8064, false,'')", [7681] = "xr_effects.enable_ui_lite(db.actor, nil)", -- [8480] = "actor_effects.use_helmet(1)", [9080] = "xr_effects.enable_imput(db.actor, nil)", [9680] = "actor_effects.use_weapon(1)" }, cleaning_kit_p_2_dummy = { [0] = "actor_effects.use_weapon(0)", [1] = "xr_effects.disable_ui_lite_with_imput(db.actor, nil)", -- [378] = "actor_effects.use_helmet(0)", -- [379] = "xr_effects.disable_nv(db.actor, nil)", [550] = "level.add_cam_effector('camera_effects\\\\item_use_fast.anm', 8063, false,'')", [1040] = "xr_effects.disable_ui_inventory(db.actor, nil)", [1460] = "xr_effects.play_inv_repair_brushes()", [3020] = "level.add_cam_effector('camera_effects\\\\item_use.anm', 8064, false,'')", [7681] = "xr_effects.enable_ui_lite(db.actor, nil)", -- [8480] = "actor_effects.use_helmet(1)", [9080] = "xr_effects.enable_imput(db.actor, nil)", [9680] = "actor_effects.use_weapon(1)" }, cleaning_kit_p_3_dummy = { [0] = "actor_effects.use_weapon(0)", [1] = "xr_effects.disable_ui_lite_with_imput(db.actor, nil)", -- [378] = "actor_effects.use_helmet(0)", -- [379] = "xr_effects.disable_nv(db.actor, nil)", [550] = "level.add_cam_effector('camera_effects\\\\item_use_fast.anm', 8063, false,'')", [1040] = "xr_effects.disable_ui_inventory(db.actor, nil)", [1460] = "xr_effects.play_inv_repair_brushes()", [3020] = "level.add_cam_effector('camera_effects\\\\item_use.anm', 8064, false,'')", [7681] = "xr_effects.enable_ui_lite(db.actor, nil)", -- [8480] = "actor_effects.use_helmet(1)", [9080] = "xr_effects.enable_imput(db.actor, nil)", [9680] = "actor_effects.use_weapon(1)" }, --И далее для всех-всех-всех предметов, которые используют анимации Я же у себя сделал немного попроще - сделал общие скрипты анимаций для однотипных предметов - например, для всех таблеток одна анимация, для еды - другая, для воды - третья и т.д., и далее при использовании предмета отслеживаю его секцию и запускаю анимацию. У меня так сделано по большей части из-за нескольких юзаний одного типа предмета: Скрытый текст function use_item_stack(s_obj,obj) -- DRUGS USE -- caffeine x5 if(s_obj)and(s_obj:section_name()=="caffeine_5")then alife():create("caffeine_4", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) local sleep_ch = system_ini():r_float(s_obj:section_name(), "eat_sleep") ui_sleep_dialog.set_sleep(sleep_ch) items_animation.drugs_anims() end if(s_obj)and(s_obj:section_name()=="caffeine_4")then alife():create("caffeine_3", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) local sleep_ch = system_ini():r_float(s_obj:section_name(), "eat_sleep") ui_sleep_dialog.set_sleep(sleep_ch) items_animation.drugs_anims() end if(s_obj)and(s_obj:section_name()=="caffeine_3")then alife():create("caffeine_2", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) local sleep_ch = system_ini():r_float(s_obj:section_name(), "eat_sleep") ui_sleep_dialog.set_sleep(sleep_ch) items_animation.drugs_anims() end if(s_obj)and(s_obj:section_name()=="caffeine_2")then alife():create("caffeine", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) local sleep_ch = system_ini():r_float(s_obj:section_name(), "eat_sleep") ui_sleep_dialog.set_sleep(sleep_ch) items_animation.drugs_anims() end if(s_obj)and(s_obj:section_name()=="caffeine")then local sleep_ch = system_ini():r_float(s_obj:section_name(), "eat_sleep") ui_sleep_dialog.set_sleep(sleep_ch) items_animation.drugs_anims() end -- DRUGS -- drug_charcoal x5 if(s_obj)and(s_obj:section_name()=="drug_charcoal_5")then alife():create("drug_charcoal_4", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) items_animation.drugs_anims() end if(s_obj)and(s_obj:section_name()=="drug_charcoal_4")then alife():create("drug_charcoal_3", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) items_animation.drugs_anims() end if(s_obj)and(s_obj:section_name()=="drug_charcoal_3")then alife():create("drug_charcoal_2", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) items_animation.drugs_anims() end if(s_obj)and(s_obj:section_name()=="drug_charcoal_2")then alife():create("drug_charcoal", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) items_animation.drugs_anims() end if(s_obj)and(s_obj:section_name()=="drug_charcoal")then items_animation.drugs_anims() end -- drug_coagulant x5 if(s_obj)and(s_obj:section_name()=="drug_coagulant_5")then alife():create("drug_coagulant_4", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) items_animation.drugs_anims() end и т.д. для всех предметов. Насколько я понял, у тебя в конфигах указывается тип используемого предмета. Так в чём, собственно проблема? В колбеке на использование предмета делаешь ссылку на функцию, в которой проверяешь, чему эта секция равна, и запускаешь анимку в зависимости от результата: -- в конфиге: [kolbasa]:booster, food_base $spawn = "food and drugs\kolbasa" visual = dynamics\devices\dev_kolbasa\dev_kolbasa.ogf description = st_kolbasa_descr inv_name = st_kolbasa inv_name_short = st_kolbasa inv_weight = 0.4 inv_grid_width = 1 inv_grid_height = 1 inv_grid_x = 35 inv_grid_y = 18 cost = 960 attach_angle_offset = 0.440521, 1.378287, -0.644026 attach_position_offset = 0.104196, -0.010821, 0.076969 attach_bone_name = bip01_r_hand auto_attach = false eat_satiety = 0.646 eat_radiation = 0.0 eat_alcohol = 0.100 eat_health = -0.05 use_sound = interface\inv_eat_paperwrap anim_type = food --тип анимации --в скрипте: local anim_type = ini:r_string(obj:section(), "anim_type") if anim_type == "food" then --запускаешь камеру и всё, что нужно elseif anim_type == "drug" then ... end И в дополнение, запускать функцию на проверку типа анимации предмета надо из bind_stalker.script таким образом: --функция: function actor_binder:use_inventory_item(obj) --в конце её, перед последним end, пишешь: items_manager.use_item_stack(obj) -- твоя функция (я вставил свою для примера) end 26.04.2021 в 07:33, I am Dead сказал(а): Как сделать тоже самое только для проверки предмета который находится на поясе? Добавлять в движке итератор для пояса и с его помощью проверять наличие предмета нужной секции. Иначе никак. Ссылка на комментарий
I am Dead 912 Опубликовано 27 Апреля 2021 Поделиться Опубликовано 27 Апреля 2021 49 минут назад, ARTLantist сказал(а): Добавлять в движке итератор для пояса и с его помощью проверять наличие предмета нужной секции. Иначе никак. Подсказали функцию которая замечательно работает. Скрытый текст function actor_has_item_on_belt(actor, npc, p) local obj = actor:object(p[1]) return obj and actor:is_on_belt(obj) end 2 Ссылка на комментарий
ARTLantist 14 Опубликовано 27 Апреля 2021 Поделиться Опубликовано 27 Апреля 2021 @I am Dead а какая платформа? Просто на чистой зп ни в скриптах (_g.script), ни в движке нет такой функции Ссылка на комментарий
I am Dead 912 Опубликовано 28 Апреля 2021 Поделиться Опубликовано 28 Апреля 2021 @ARTLantist Функция такая я как понял в OGSR моде присутствует. Ссылка на комментарий
ARTLantist 14 Опубликовано 28 Апреля 2021 Поделиться Опубликовано 28 Апреля 2021 @I am Dead так у тебя ОГСР? Тогда другое дело. Там и итератор тебе сразу есть, и эти проверки - is_on_belt, is_on_ruck и куча всего другого. Ссылка на комментарий
I am Dead 912 Опубликовано 28 Апреля 2021 Поделиться Опубликовано 28 Апреля 2021 (изменено) @ARTLantist Тогда вопрос уже другой, как эту функцию переделать под огср. Скрытый текст -- переносим все вещи из ящика с указанным story_id function transfer_from_box(box_sid) local box = level_object_by_sid(box_sid) if box then box:iterate_inventory_box(function(item) box:transfer_item(item, db.actor) end) end end С такой функцией у меня идет ругань на iterate_inventory_box так как в движке его нету, происходит вылет. Изменено 28 Апреля 2021 пользователем I am Dead Ссылка на комментарий
Stalkersof 137 Опубликовано 28 Апреля 2021 Поделиться Опубликовано 28 Апреля 2021 Рнебята пытаюсь прикрутить гуи окно с двумя кнопками к функции обыска монстров. function generic_object_binder:use_callback(obj, who) if self.use_flag == nil and self.object:section()~="m_trader" then self.object:set_nonscript_usable(false) self.use_flag = true end -------------------------- -------------------------- -------------------------- NewUI4.main() --self:mutanter_use(obj,who) end Разделил функцию на две. Где self:mutanter_use(obj,who) это все действия по обыску трупов. NewUI4.main() это собственно окно с двумя кнопками. Если вызываю из окна при нажатии кнопки скрипт валиться из за отсутствия переменных. Если функцию без окна запускаю все работает. Вызываю собственно так. function NewUI4:button1_button_clicked() bind_monster.generic_object_binder:mutanter_use() --bind_monster.generic_object_binder:mutanter_use(obj,who) self:Hide() end Freeplay Graphic Mod(FGM) Ссылка на комментарий
I am Dead 912 Опубликовано 28 Апреля 2021 Поделиться Опубликовано 28 Апреля 2021 @Stalkersof Попробуй так сделать: Скрытый текст function generic_object_binder:use_callback(obj, who) if self.use_flag == nil and self.object:section()~="m_trader" then self.object:set_nonscript_usable(false) self.use_flag = true end -------------------------- -------------------------- -------------------------- level.start_stop_menu(NewUI4.main(), true) --self:mutanter_use(obj,who) end Ссылка на комментарий
Stalkersof 137 Опубликовано 28 Апреля 2021 Поделиться Опубликовано 28 Апреля 2021 44 минуты назад, I am Dead сказал(а): @Stalkersof Попробуй так сделать: Показать function generic_object_binder:use_callback(obj, who) if self.use_flag == nil and self.object:section()~="m_trader" then self.object:set_nonscript_usable(false) self.use_flag = true end -------------------------- -------------------------- -------------------------- level.start_stop_menu(NewUI4.main(), true) --self:mutanter_use(obj,who) end Не а не получается. NewUI4.main() это скрипт и функция в нем. Окно появляется и кнопки и все. function main() local hud = NewUI4(get_hud()) level.start_stop_menu(hud, true) end Попытаюсь еще раз объяснить проблему функция self:mutanter_use(obj,who) вызываемая непосредственно в скрипте. Прекрасно работает. Комментирую ее и пытаюсь вызвать при нажатии кнопки вылет. Либо не корректные параметры либо отсутствие параметров. Т.е вот это (obj,who)я не могу передать из другого скрипта. Freeplay Graphic Mod(FGM) Ссылка на комментарий
ARTLantist 14 Опубликовано 28 Апреля 2021 Поделиться Опубликовано 28 Апреля 2021 @Stalkersof заведомо безнадёжная идея делать так, как сделано у тебя. При смерти мутанта в биндере он отлавливается и все действия относятся к нему, а когда ты хочешь заупустить из другой функции что-то из биндера монстров, ты уже теряешь этого монстра. Используй логические переменные и пересылай их в свой скрипт с ГУИ окном, там после нажатия кнопки делай true и в апдейте биндера монстров отлавливай момент, когда эта переменная true, выполняй нужные действия. 1 Ссылка на комментарий
Stalkersof 137 Опубликовано 28 Апреля 2021 Поделиться Опубликовано 28 Апреля 2021 2 минуты назад, ARTLantist сказал(а): @Stalkersof заведомо безнадёжная идея делать так, как сделано у тебя. При смерти мутанта в биндере он отлавливается и все действия относятся к нему, а когда ты хочешь заупустить из другой функции что-то из биндера монстров, ты уже теряешь этого монстра. Используй логические переменные и пересылай их в свой скрипт с ГУИ окном, там после нажатия кнопки делай true и в апдейте биндера монстров отлавливай момент, когда эта переменная true, выполняй нужные действия. Вроде с переменными тоже пробовал. Хорошо еще раз попробую. Freeplay Graphic Mod(FGM) Ссылка на комментарий
ARTLantist 14 Опубликовано 28 Апреля 2021 Поделиться Опубликовано 28 Апреля 2021 (изменено) @I am Dead ну, либо лезть в движок, либо костыльно как-то перебирать все предметы в ящике. Как вариант, попробуй так: Скрытый текст local cnt = box:object_count() for i=0, cnt-1 do local item = box:object(i) --нужные действия end Сразу говорю, что не ручаюсь за работоспособность у inventory_box, я эту функцию раньше использовал только для актора @Stalkersof и вообще, зачем тебе обратно ссылаться на биндер монстров? Можно же в скрипте с ГУИ выдать все нужные предметы и не забивать себе голову. Изменено 28 Апреля 2021 пользователем ARTLantist Ссылка на комментарий
Stalkersof 137 Опубликовано 28 Апреля 2021 Поделиться Опубликовано 28 Апреля 2021 11 минут назад, ARTLantist сказал(а): @Stalkersof и вообще, зачем тебе обратно ссылаться на биндер монстров? Можно же в скрипте с ГУИ выдать все нужные предметы и не забивать себе голову. У меня там не только предметы(запчасти) чтение конфига монстра, удар ножом, хит монстру и анимация. Мне вот это и актор нужен там и монстр(obj,who) надо. Freeplay Graphic Mod(FGM) Ссылка на комментарий
ARTLantist 14 Опубликовано 28 Апреля 2021 Поделиться Опубликовано 28 Апреля 2021 1 минуту назад, Stalkersof сказал(а): и актор нужен там и монстр(obj,who) Перешли их в скрипт с ГУИ окном: NewUI4.main(obj,who) и там уже устанавливай в той функции function main(obj,who) self.actor = who self.monstr = obj --и далее нужное и всё. 1 Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти