dsh 3 820 Опубликовано 26 Февраля Поделиться Опубликовано 26 Февраля 22 hours ago, Капрал Хикс said: Нужно для целого гулага вояк на Кордоне. Ну угадай с одного раза - где: https://github.com/dsh2dsh/op2ogse/blob/5a01f59d220b7808dbb68cce0af42ce333bb85d4/gamedata/scripts/dsh/dsh_enemies.script#L50 И вот прямо таки как раз для целого гулага вояк на Кордоне. 1 dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
Pavel_2000 5 Опубликовано 26 Февраля Поделиться Опубликовано 26 Февраля (изменено) Интересно, а есть проверка на наличие определённого предмета в inventory box? Пытался гуглить ничего не нашёл. Может какие то костыли есть? Изменено 27 Февраля пользователем Опричник Ссылка на комментарий
Norman Eisenherz 276 Опубликовано 27 Февраля Поделиться Опубликовано 27 Февраля Перебрать сервер с проверками "существующий объект + наличие родителя + id родителя = id коробки". 1 Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
imcrazyhoudini 188 Опубликовано 27 Февраля Поделиться Опубликовано 27 Февраля @Pavel_2000 можно в bind_stalker.script в actor_binder:take_item_from_box: if box:story_id() == 47 and item:section() == "af_ice" then db.actor:give_info_portion("yan_have_snezhinka") end Как пример. Правда, надо стори ид назначать. 1 ищу человека, который смог бы заняться разработкой погоды на OGSR. кто может помочь - пишите в ЛС. Ссылка на комментарий
Kirgudu 1 151 Опубликовано 27 Февраля Поделиться Опубликовано 27 Февраля @Pavel_2000 зависит от версии игры. В ЧН и ЗП есть вполне себе работающий итератор iterate_inventory_box, аналогичный по действию итератору iterate_inventory, но предназначенный, как можно догадаться, как раз для ящиков. В ТЧ - см. совет выше по перебору серверных объектов. 1 1 Инструмент Ссылка на комментарий
Pavel_2000 5 Опубликовано 27 Февраля Поделиться Опубликовано 27 Февраля 1 час назад, Kirgudu сказал: iterate_inventory_box вот я в зп ковыряюсь, мало что о скриптах знаю и гуг ничего не выдаёт как пользоваться этой функцией на ап про спрашивал тоже про это, тоже написали про iterate_inventory_box Скрытый текст Суть такова: Даете своему inventory box стори_ид, затем передаете в самописную функцию параметры - стори_ид ящика и имя секции искомого предмета. Затем в скрипте xr_conditions создаете функцию в которой по стори_ид получаете inventory box, как объект, применяете к нему метод iterate_inventory box, один из аргументов этого метода - функция которая будет вызвана для каждого объекта из ящика, и в этой функции вы сравниваете имя секции предмета с искомым и если есть совпадение выставляете флаг - нашел. Результат работы вашей самописной функции и есть этот флаг. но мне бы пример живой увидеть хотя бы Ссылка на комментарий
Kirgudu 1 151 Опубликовано 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 908 Опубликовано 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 321 Опубликовано 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 321 Опубликовано 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 151 Опубликовано 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 Инструмент Ссылка на комментарий
Капрал Хикс 497 Опубликовано 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 276 Опубликовано 3 Марта Поделиться Опубликовано 3 Марта [task_manager.script] register_target() выбирает подходящие объекты при движковой регистрации и добавляет их id в task_info[задача].task_objects – куда-то сюда надо копать Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
h0N0r 312 Опубликовано 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 276 Опубликовано 5 Марта Поделиться Опубликовано 5 Марта Вспомнил вот… Для заданий artefact и monster_part список target_objects не заполняется и метка не создается, а возможность выдачи определяется только простыми проверками "наличие выданных заданий такого типа + отсрочка". Для нового задания с поиском обычной брони (без секции в all.spawn) должно хватить копии конфигов и скриптов задания artefact / monster_part под другим именем. 1 Мини-моды: ТЧ ЧН ЗП Шпаргалка Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти