Pavel_2000 5 Опубликовано 27 Февраля Поделиться Опубликовано 27 Февраля 1 час назад, Kirgudu сказал: iterate_inventory_box вот я в зп ковыряюсь, мало что о скриптах знаю и гуг ничего не выдаёт как пользоваться этой функцией на ап про спрашивал тоже про это, тоже написали про iterate_inventory_box Скрытый текст Суть такова: Даете своему inventory box стори_ид, затем передаете в самописную функцию параметры - стори_ид ящика и имя секции искомого предмета. Затем в скрипте xr_conditions создаете функцию в которой по стори_ид получаете inventory box, как объект, применяете к нему метод iterate_inventory box, один из аргументов этого метода - функция которая будет вызвана для каждого объекта из ящика, и в этой функции вы сравниваете имя секции предмета с искомым и если есть совпадение выставляете флаг - нашел. Результат работы вашей самописной функции и есть этот флаг. но мне бы пример живой увидеть хотя бы Ссылка на комментарий
Kirgudu 1 216 Опубликовано 27 Февраля Поделиться Опубликовано 27 Февраля 58 минут назад, Pavel_2000 сказал: но мне бы пример живой увидеть хотя бы Живой пример использования в ЗП (оригинал) можно увидеть здесь: xr_effects.jup_b202_inventory_box_relocate(actor, npc) Инструмент Ссылка на комментарий
Pavel_2000 5 Опубликовано 27 Февраля Поделиться Опубликовано 27 Февраля (изменено) @Kirguduвидел его, пока искал в скриптах всё связаное с "inventory_box" нашёл вот function item_in_inventory_box(actor, npc, p) --p[1] - стори_ид_ящика --p[2] - имя_предмета local inv_box = get_story_object(p[1]) local items_table = {} local item_in_box = false local function add_items(inv_box, item) table.insert(items_table, item) end inv_box:iterate_inventory_box(add_items, inv_box) for k,v in pairs(items_table) do if v:name() == p[2] then item_in_box = true end end return item_in_box end Изменено 27 Февраля пользователем Pavel_2000 Ссылка на комментарий
I am Dead 912 Опубликовано 27 Февраля Поделиться Опубликовано 27 Февраля 6 часов назад, imcrazyhoudini сказал: Как пример Ему надо проверить что в ящике лежит а не что он из ящика берет 1 1 Ссылка на комментарий
Pavel_2000 5 Опубликовано 27 Февраля Поделиться Опубликовано 27 Февраля Скрытый текст function item_in_inventory_box(actor, npc, p) --p[1] - стори_ид_ящика --p[2] - имя_предмета local inv_box = get_story_object(p[1]) local items_table = {} local item_in_box = false local function add_items(inv_box, item) table.insert(items_table, item) end inv_box:iterate_inventory_box(add_items, inv_box) for k,v in pairs(items_table) do if v:name() == p[2] then item_in_box = true end end return item_in_box end сказали что это должно работать но я не понимаю как оно работает Ссылка на комментарий
Zander_driver 10 334 Опубликовано 27 Февраля Поделиться Опубликовано 27 Февраля 3 часа назад, Pavel_2000 сказал: Суть такова: Тебе подсказали правильно. 2 часа назад, Pavel_2000 сказал: нашёл вот Нашел правильно. Это сработает (Если надо искать не по имени объекта а по секции, просто меняешь :name() на :section() 16 минут назад, Pavel_2000 сказал: сказали что это должно работать Правильно сказали. Это работает. Как - ровно так как ты и просил. А как надо?) 2 часа назад, Pavel_2000 сказал: inv_box:iterate_inventory_box В порядке (возможно) полезной доп.инфы. 1) В ОГСР ЕМНИП, метод iterate_inventory выполняет то же самое. И для актора, и для нпс, и для ящиков. Я это лично сам туда заносил, если не выпилили то значит работает. 2) Методы iterate_inventory и iterate_inventory_box - это методы клиентского объекта. Если ящик не в онлайне, то они не сработают естественно. В этом случае остается только перебор по parent_id серверного объекта. Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
Pavel_2000 5 Опубликовано 27 Февраля Поделиться Опубликовано 27 Февраля @Zander_driver мне нужно было проверить наличие артефакта в invectory_box я добавил эту функцию в xr_condition начал вызывать из логики on_press = {=item_in_inventory_box(box_b400_story_id:af_oasis_heart)} ph_button@switch и ничего не происходило поменял на на :section() и всё заработало, почему так? и ящик в онлайне Ссылка на комментарий
Zander_driver 10 334 Опубликовано 27 Февраля Поделиться Опубликовано 27 Февраля 2 минуты назад, Pavel_2000 сказал: af_oasis_heart Наверное потому, что это секция. А не имя. 15 часов назад, Pavel_2000 сказал: проверка на наличие определённого предмета Формулируйте свои желания правильно. Определенного - по имени? секции? ID? story_id? Еще по какому признаку? 1 Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine. Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист. AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD. Ссылка на комментарий
Pavel_2000 5 Опубликовано 27 Февраля Поделиться Опубликовано 27 Февраля ну я прошу прощения (я не очень сильно во всём этом разбираюсь) и в любом случае большое спасибо за помощь Добавлено Купер, 28 Февраля Правила форума, 2.1.1 (оффтоп). Для "Спасибо" в каждом сообщении справа-внизу есть кнопки. Старайтесь, пожалуйста, пользоваться ими. 1 Ссылка на комментарий
Pavel_2000 5 Опубликовано 28 Февраля Поделиться Опубликовано 28 Февраля Здравствуйте, у меня есть скрипт на телепортацию который вызывается из gametutorials при использовании рестриктора function gaus_laz_v_gaus() if xr_conditions.actor_in_zone(actor, npc, {"gaus_laz_v_gaus_sr"}) then db.actor:give_info_portion("af_run_tutor") teleport_actor(nil, nil, {"gaus_prolez_v_gaus_way","gaus_prolez_v_gaus_look"}) end end [logic] active = sr_idle@start [sr_idle@start] on_info = {=actor_in_zone(gaus_laz_v_gaus_sr)} %=run_tutorial(gaus_laz_v_gaus_tutor)% on_info2 = {+af_run_tutor} sr_idle@tutorial %=run_postprocess(black:666)% [sr_idle@tutorial] on_info = {!actor_in_zone(gaus_laz_v_gaus_sr)} %=stop_tutorial% on_info2 = {+af_run_tutor} %-af_run_tutor% on_game_timer = 30 | sr_idle@start %=stop_postprocess(666)% прописал в логике рестриктора запуск пост процесса на чёрный экран и при использовании актёр мгновенно телепортируется и это выглядит не очень как можно сделать задержку телепортации на две секунды? а именно скорее всего мне нужно таймер в скрипт добавить Ссылка на комментарий
Kirgudu 1 216 Опубликовано 28 Февраля Поделиться Опубликовано 28 Февраля (изменено) 2 часа назад, Pavel_2000 сказал: как можно сделать задержку телепортации на две секунды? function gaus_laz_v_gaus() if xr_conditions.actor_in_zone(actor, npc, {"gaus_laz_v_gaus_sr"}) then db.actor:give_info_portion("af_run_tutor") local timer = time_global() + 2000 -- установка маркера времени на 2 секунды вперёд level.add_call( function() return timer < time_global() end, -- проверка, что текущее время стало больше, чем установленный маркер function() teleport_actor(nil, nil, {"gaus_prolez_v_gaus_way","gaus_prolez_v_gaus_look"}) end -- действие, как только проверка вернула true ) end end Изменено 28 Февраля пользователем Kirgudu 1 1 Инструмент Ссылка на комментарий
Капрал Хикс 530 Опубликовано 3 Марта Поделиться Опубликовано 3 Марта (изменено) Бьюсь над тем, чтобы в однотипных квестах по поиску предметов можно было искать не только броню и оружие... Собственно, подсказали когда-то тут: Скрытый текст Попробовал доработать se_item.script: class "se_item_detector" (cse_alife_item_detector) function se_item_detector:__init (section) super (section) end function se_item_detector:on_register() cse_alife_item_custom_outfit.on_register( self ) -- Регистрация в таскменеджере task_manager.get_random_task():register_target(self) -- Собираем статистику по предметам. if registred_items[self:section_name()] == nil then registred_items[self:section_name()] = 1 else registred_items[self:section_name()] = registred_items[self:section_name()] + 1 end end function se_item_detector:on_unregister() --' Отрегистрация в таскменеджере task_manager.get_random_task():unregister_target(self) end В class_registrator: строку добавил: cs_register (object_factory, "CAttch", "se_item.se_item_detector", "D_SIMDET", "device_detector_simple") ...чтобы хотя бы можно было детекторы искать. И нифига. Быть может, можно как-то заполнить таблицу local registred_items = {} в начале se_item.script? Но как? Пробовал вписать detector_simple = true и 0 результата. Изменено 3 Марта пользователем Капрал Хикс Ссылка на комментарий
Norman Eisenherz 312 Опубликовано 3 Марта Поделиться Опубликовано 3 Марта [task_manager.script] register_target() выбирает подходящие объекты при движковой регистрации и добавляет их id в task_info[задача].task_objects – куда-то сюда надо копать Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
h0N0r 325 Опубликовано 3 Марта Поделиться Опубликовано 3 Марта @Капрал Хикс Можно поправить task_manager.script: CRandomTask:action_give_task ... -- заремить этот блок, т.к. метки ставятся только на существующий объект --elseif task_desc.type == "find_item" then -- objective:set_map_hint(task_desc.text) -- objective:set_map_location("find_item_location") -- objective:set_object_id(task_desc.selected_target) CRandomTask:check_task_props ... elseif self.task_info[task_id].type == "find_item" then if self.task_info[task_id].target_objects == nil or table.getn(self.task_info[task_id].target_objects) == 0 then -- всегда true, чтобы задание было доступно, даже если предмета нет в игре self.task_info[task_id].enabled_props = true return end Минус - не будет отметок на предметах. 1 https://sites.google.com/view/xray-sdk-0-4-smg Ссылка на комментарий
Norman Eisenherz 312 Опубликовано 5 Марта Поделиться Опубликовано 5 Марта Вспомнил вот… Для заданий artefact и monster_part список target_objects не заполняется и метка не создается, а возможность выдачи определяется только простыми проверками "наличие выданных заданий такого типа + отсрочка". Для нового задания с поиском обычной брони (без секции в all.spawn) должно хватить копии конфигов и скриптов задания artefact / monster_part под другим именем. 1 Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Капрал Хикс 530 Опубликовано 5 Марта Поделиться Опубликовано 5 Марта (изменено) @Norman Eisenherz , работает! Осталось доработать тексты, но в целом на поиск детектора задание взялось, проапдейтилось и сдалось. Изменено 5 Марта пользователем Капрал Хикс 1 Ссылка на комментарий
Norman Eisenherz 312 Опубликовано 5 Марта Поделиться Опубликовано 5 Марта Проверил в ТЧ, подтверждаю (стоило сразу так сделать вместо советов "может быть"). Полный список правок, если кому-то интересно: • [game_tasks_by_vendor.xml] – новый тип задания "parent_new_type" • [task_manager.ltx] – конфиг нового задания, обязательно с заголовком в начале файла • [task_manager.script] – копия строк с обработкой задания "artefact" => "new_type" 1 3 Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Капрал Хикс 530 Опубликовано 5 Марта Поделиться Опубликовано 5 Марта @Norman Eisenherz , ещё строка find_item (меняем на свой тип задания) = "return_for_reward_bring", - текст "принести заказчику обещанное". Ссылка на комментарий
Norman Eisenherz 312 Опубликовано 5 Марта Поделиться Опубликовано 5 Марта Не соглашусь: задание "find_item" имеет дополнительную обработку "есть на сервере, но не в кармане заказчика" – надо копировать или "artefact", или "monster_part". Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Капрал Хикс 530 Опубликовано 5 Марта Поделиться Опубликовано 5 Марта Я для примера. Копировал конечно же артефакт. Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти