Перейти к контенту

Рекомендуемые сообщения

1 час назад, Kirgudu сказал:

iterate_inventory_box

вот я в зп ковыряюсь, мало что о скриптах знаю и гуг ничего не выдаёт как пользоваться этой функцией

на ап про спрашивал тоже про это, тоже написали про iterate_inventory_box

Скрытый текст

Суть такова: Даете своему inventory box стори_ид, затем передаете в самописную функцию параметры - стори_ид ящика и имя секции искомого предмета. Затем в скрипте xr_conditions создаете функцию в которой по стори_ид получаете inventory box, как объект, применяете к нему метод iterate_inventory box, один из аргументов этого метода - функция которая будет вызвана для каждого объекта из ящика, и в этой функции вы сравниваете имя секции предмета с искомым и если есть совпадение выставляете флаг - нашел. Результат работы вашей самописной функции и есть этот флаг.

но мне бы пример живой увидеть хотя бы

Ссылка на комментарий
58 минут назад, Pavel_2000 сказал:

но мне бы пример живой увидеть хотя бы

Живой пример использования в ЗП (оригинал) можно увидеть здесь:
xr_effects.jup_b202_inventory_box_relocate(actor, npc)

Ссылка на комментарий

@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

 

Изменено пользователем Pavel_2000
Ссылка на комментарий
Скрытый текст
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

сказали что это должно работать но я не понимаю как оно работает

Ссылка на комментарий
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.

Ссылка на комментарий

@Zander_driver  мне нужно было проверить наличие артефакта в invectory_box 

я добавил эту функцию в xr_condition начал вызывать из логики

on_press = {=item_in_inventory_box(box_b400_story_id:af_oasis_heart)} ph_button@switch

и ничего не происходило 

поменял на на :section() и всё заработало, почему так?

и ящик в онлайне

Ссылка на комментарий
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.

Ссылка на комментарий

ну я прошу прощения (я не очень сильно во всём этом разбираюсь) и в любом случае большое спасибо за помощь

Добавлено  Купер,

Правила форума, 2.1.1 (оффтоп).
Для "Спасибо" в каждом сообщении справа-внизу есть кнопки. Старайтесь, пожалуйста, пользоваться ими.

  • Спасибо 1
Ссылка на комментарий

Здравствуйте, у меня есть скрипт на телепортацию который вызывается из 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)%

прописал в логике рестриктора запуск пост процесса на чёрный экран и при использовании актёр мгновенно телепортируется и это выглядит не очень

 как можно сделать задержку телепортации на две секунды?

а именно скорее всего мне нужно таймер в скрипт добавить

Ссылка на комментарий
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

 

Изменено пользователем Kirgudu
  • Спасибо 1
  • Нравится 1
Ссылка на комментарий

Бьюсь над тем, чтобы в однотипных квестах по поиску предметов можно было искать не только броню и оружие...

Собственно, подсказали когда-то тут:

Скрытый текст

Попробовал доработать 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 результата.

Изменено пользователем Капрал Хикс
Ссылка на комментарий

[task_manager.script] register_target() выбирает подходящие объекты при движковой регистрации и добавляет их id в task_info[задача].task_objects – куда-то сюда надо копать

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий

@Капрал Хикс 

Можно поправить 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
Ссылка на комментарий

Вспомнил вот… Для заданий artefact и monster_part список target_objects не заполняется и метка не создается, а возможность выдачи определяется только простыми проверками "наличие выданных заданий такого типа + отсрочка". Для нового задания с поиском обычной брони (без секции в all.spawn) должно хватить копии конфигов и скриптов задания artefact / monster_part под другим именем.

  • Полезно 1

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий

@Norman Eisenherz , работает! Осталось доработать тексты, но в целом на поиск детектора задание взялось, проапдейтилось и сдалось.

Изменено пользователем Капрал Хикс
  • Нравится 1
Ссылка на комментарий

Проверил в ТЧ, подтверждаю (стоило сразу так сделать вместо советов "может быть").

Полный список правок, если кому-то интересно:

• [game_tasks_by_vendor.xml] – новый тип задания "parent_new_type"

• [task_manager.ltx] – конфиг нового задания, обязательно с заголовком в начале файла

• [task_manager.script] – копия строк с обработкой задания "artefact" => "new_type"

  • Нравится 1
  • Полезно 3

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий

@Norman Eisenherz , ещё строка find_item (меняем на свой тип задания) = "return_for_reward_bring", - текст "принести заказчику обещанное".

Ссылка на комментарий

Не соглашусь: задание "find_item" имеет дополнительную обработку "есть на сервере, но не в кармане заказчика" – надо копировать или "artefact", или "monster_part".

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   2 пользователя

×
×
  • Создать...