h0N0r 324 Опубликовано 24 Января 2022 Поделиться Опубликовано 24 Января 2022 Суть проблемы, в оригинальном ТЧ сбрасывается текущая секция логики при оффлайн->онлайн / смена уровня. Частично, это исправляет код из скриптов ЗП: - нпс/монстры под кастомной логикой (с [smart_terrains] none = true) сохраняют текущую секцию в обоих случаях; - нпс под смартом сохраняют текущую секцию, но в обоих случаях находятся в позиции первой секции (та, что [logic] active = секция), после идут в точку пути второй секции; - монстры под смартом, почти также как нпс, только не сохраняют текущую секцию после смены уровня; https://drive.google.com/file/d/1go9irF5u8tl1JX-KkIuN7pNWZCed1Z1g/view?usp=sharing (в архиве тестовая карта+скрипты и прочее/бины с работающей функцией log; ai_test1_map_descr.jpg - где, что заспавлено; issue_reset_logic - описание) Если у вас есть время и разбираетесь в луа, может подскажете решение. 1 1 https://sites.google.com/view/xray-sdk-0-4-smg Ссылка на комментарий
naxac 2 445 Опубликовано 25 Января 2022 Поделиться Опубликовано 25 Января 2022 (изменено) @h0N0r , решение очевидно: на net_destroy объекта сохранять логику, на net_spawn - загружать, вместо save и load соответственно. Сохранять можно в custom_data, например. Изменено 25 Января 2022 пользователем naxac 1 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
h0N0r 324 Опубликовано 25 Января 2022 Автор Поделиться Опубликовано 25 Января 2022 Можно пример, как это сделать. Ещё проверил в ЗП, после смены уровня, у монстров тоже сбрасывается секция. Скрытый текст Уже ТЧ НОВАЯ ИГРА ai1_st_lair register called actor net spawn _bp: monster.bind: name='ai1_dog', id='6' BIND MONSTER: init BIND MONSTER: reload BIND MONSTER: reinit BIND MONSTER: net_spawn setup_gulag_and_logic_on_spawn obj=ai1_dog, strn_id=65535 DEBUG: object 'ai1_dog': activate_by_section: looking for section 'nil' _bp: reset_generic_schemes_on_scheme_switch: npc:name()='ai1_dog' [smart_terrain ai1_st_lair] register called obj=ai1_dog gulag_type=ai1_st_lair [smart_terrain ai1_st_lair] gulag: object_setup_offline: obj=ai1_dog [smart_terrain ai1_st_lair] gulag: object_setup_online: obj=ai1_dog need_setup_logic=true need_setup_restrictors=nil [smart_terrain ai1_st_lair] gulag: setJob: obj=ai1_dog job=1 logic@ai1_dog CHANGE TEAM [ai1_dog] to [43][19][1] [smart_terrain ai1_st_lair] gulag: beginJob: obj=ai1_dog job=1 logic@ai1_dog _bp: enable_scripts: object 'ai1_dog' has NO external configuration file, using 'misc\gulag_tasks.ltx' DEBUG: object 'ai1_dog': activate_by_section: looking for section 'mob_walker@ai1_dog_start' _bp: reset_generic_schemes_on_scheme_switch: npc:name()='ai1_dog' _bp: calling module('mob_walker') DEBUG: add_to_binder: npc:name()='ai1_dog', scheme='mob_walker', section='mob_walker@ai1_dog_start' _bp: mob_walker:reset_scheme: ai1_dog _bp: path_parse_waypoints: pathname='ai1_st_lair_dog_walk1' _bp: path_parse_waypoints: pathname='ai1_st_lair_dog_look1' BIND MONSTER: extrapolate_callback BIND MONSTER: waypoint_callback mob_walker:waypoint_callback(): name=ai1_dog, index=0 _bp [ai1_dog]: update_standing_state * Gulag: ai1_st_lair -- State: 0 -- Total population: 1/1 -- Non exclusive population: 0/0 Resources: id: 6 name: ai1_dog Jobs in this state: section: logic@ai1_dog, prior 1 ObjID: 6 Actor: ai1_dog, [43][19][1] current section: mob_walker@ai1_dog_start ПЕРЕХОД В СЕКЦИЮ 2 DEBUG: object 'ai1_dog': activate_by_section: looking for section 'mob_walker@ai1_dog_wait' _bp: reset_generic_schemes_on_scheme_switch: npc:name()='ai1_dog' _bp: calling module('mob_walker') _bp: mob_walker:reset_scheme: ai1_dog _bp: path_parse_waypoints: pathname='ai1_st_lair_dog_walk2' _bp: path_parse_waypoints: pathname='ai1_st_lair_dog_look2' BIND MONSTER: extrapolate_callback BIND MONSTER: waypoint_callback mob_walker:waypoint_callback(): name=ai1_dog, index=0 _bp [ai1_dog]: update_standing_state * Gulag: ai1_st_lair -- State: 0 -- Total population: 1/1 -- Non exclusive population: 0/0 Resources: id: 6 name: ai1_dog Jobs in this state: section: logic@ai1_dog, prior 1 ObjID: 6 Actor: ai1_dog, [43][19][1] current section: mob_walker@ai1_dog_wait В ОФФЛАЙН [smart_terrain ai1_st_lair] gulag: object_setup_offline: obj=ai1_dog BIND MONSTER: net_destroy В ОНЛАЙН * Gulag: ai1_st_lair -- State: 0 -- Total population: 1/1 -- Non exclusive population: 0/0 Resources: id: 6 name: ai1_dog Jobs in this state: section: logic@ai1_dog, prior 1 ObjID: 6 Actor: ai1_dog, [43][19][1] current section: <<<offline>>> _bp: monster.bind: name='ai1_dog', id='6' BIND MONSTER: init BIND MONSTER: reload BIND MONSTER: reinit BIND MONSTER: net_spawn changing position for object[ai1_dog] from [11.888967514038:0:0.68990504741669] to [14.699998855591:-3.0517578125e-005:1.3999996185303] : level vertex [3113] to [3342] setup_gulag_and_logic_on_spawn obj=ai1_dog, strn_id=5 [smart_terrain ai1_st_lair] gulag: object_setup_online: obj=ai1_dog need_setup_logic=true need_setup_restrictors=true _bp: enable_scripts: object 'ai1_dog' has NO external configuration file, using 'misc\gulag_tasks.ltx' DEBUG: object 'ai1_dog': activate_by_section: looking for section 'mob_walker@ai1_dog_wait' _bp: reset_generic_schemes_on_scheme_switch: npc:name()='ai1_dog' _bp: calling module('mob_walker') DEBUG: add_to_binder: npc:name()='ai1_dog', scheme='mob_walker', section='mob_walker@ai1_dog_wait' _bp: mob_walker:reset_scheme: ai1_dog _bp: path_parse_waypoints: pathname='ai1_st_lair_dog_walk2' _bp: path_parse_waypoints: pathname='ai1_st_lair_dog_look2' BIND MONSTER: extrapolate_callback BIND MONSTER: waypoint_callback mob_walker:waypoint_callback(): name=ai1_dog, index=0 _bp [ai1_dog]: update_standing_state * Gulag: ai1_st_lair -- State: 0 -- Total population: 1/1 -- Non exclusive population: 0/0 Resources: id: 6 name: ai1_dog Jobs in this state: section: logic@ai1_dog, prior 1 ObjID: 6 Actor: ai1_dog, [43][19][1] current section: mob_walker@ai1_dog_wait ПЕРЕД СМЕНОЙ УРОВНЯ actor_binder:save(): self.object:name()='single_player' ^^^ SAVE BIND MONSTER: save generic_object_binder:save(): self.object:name()='ai1_dog' save_obj: obj:name()='ai1_dog' save_obj: ini_filename='misc\gulag_tasks.ltx' save_obj: section_logic='logic@ai1_dog' save_obj: active_section='mob_walker@ai1_dog_wait' save_obj: gulag_name='ai1_st_lair' * Saving spawns... * Saving objects... * 9 objects are successfully saved - Disconnect [smart_terrain ai1_st_lair] gulag: object_setup_offline: obj=ai1_dog BIND MONSTER: net_destroy - Destroying level ВОЗВРАЩЕНИЕ НА УРОВЕНЬ actor_binder:load(): self.object:name()='single_player' actor_binder:object_binder.load(): self.object:name()='single_player' ^^^ LOAD actor net spawn _bp: monster.bind: name='ai1_dog', id='6' BIND MONSTER: init BIND MONSTER: reload BIND MONSTER: reinit BIND MONSTER: net_spawn changing position for object[ai1_dog] from [11.888967514038:0:0.68990504741669] to [14.699998855591:-3.0517578125e-005:1.3999996185303] : level vertex [3113] to [3342] setup_gulag_and_logic_on_spawn obj=ai1_dog, strn_id=5 [smart_terrain ai1_st_lair] gulag: object_setup_online: obj=ai1_dog need_setup_logic=true need_setup_restrictors=true _bp: enable_scripts: object 'ai1_dog' has NO external configuration file, using 'misc\gulag_tasks.ltx' DEBUG: object 'ai1_dog': activate_by_section: looking for section 'mob_walker@ai1_dog_start' _bp: reset_generic_schemes_on_scheme_switch: npc:name()='ai1_dog' _bp: calling module('mob_walker') DEBUG: add_to_binder: npc:name()='ai1_dog', scheme='mob_walker', section='mob_walker@ai1_dog_start' _bp: mob_walker:reset_scheme: ai1_dog _bp: path_parse_waypoints: pathname='ai1_st_lair_dog_walk1' _bp: path_parse_waypoints: pathname='ai1_st_lair_dog_look1' BIND MONSTER: waypoint_callback mob_walker:waypoint_callback(): name=ai1_dog, index=0 _bp [ai1_dog]: update_standing_state * Gulag: ai1_st_lair -- State: 0 -- Total population: 1/1 -- Non exclusive population: 0/0 Resources: id: 6 name: ai1_dog Jobs in this state: section: logic@ai1_dog, prior 1 ObjID: 6 Actor: ai1_dog, [43][19][1] current section: mob_walker@ai1_dog_start ~ quit https://sites.google.com/view/xray-sdk-0-4-smg Ссылка на комментарий
naxac 2 445 Опубликовано 26 Января 2022 Поделиться Опубликовано 26 Января 2022 (изменено) @h0N0r , ну, тут просто так на коленке пример не напишешь, много чего переделывать придётся вернее всего.. А чтобы не переделывать - можно добавить поддержку кондлиста в логике гулагов, там, где указывается основная секция (active). Это намного проще. Потом при написании логики выставлять условия для основных секций, например [logic] active = {+info1} section@1, {-info1 +info2} section@2, section@3 Изменено 26 Января 2022 пользователем naxac 1 1 Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
h0N0r 324 Опубликовано 27 Января 2022 Автор Поделиться Опубликовано 27 Января 2022 Уже встречалось здесь, работает с info, но вылетает при =dist_to_actor_le(5): -- вместо --local active_section = self.ltx:r_string( section, "active" ) -- условия для переключения основной логики local active_section_cond = xr_logic.cfg_get_condlist(self.ltx, section, "active", self) local active_section = xr_logic.pick_section_from_condlist(db.actor, self, active_section_cond.condlist) Ладно, будет гибридная система: active + переключение состояний в gulag_.script https://sites.google.com/view/xray-sdk-0-4-smg Ссылка на комментарий
naxac 2 445 Опубликовано 27 Января 2022 Поделиться Опубликовано 27 Января 2022 2 часа назад, h0N0r сказал: работает с info, но вылетает при =dist_to_actor_le(5) Это от того, что гулаги запускаются, когда актёра ещё нет. Тут желательно обходиться только инфопоршнями. Аддон для ОП-2.09.2: Яндекс/Google/GitHub Ссылка на комментарий
AndreySol 215 Опубликовано 27 Января 2022 Поделиться Опубликовано 27 Января 2022 6 часов назад, naxac сказал: Это от того, что гулаги запускаются, когда актёра ещё нет. Извиняюсь, а это проверенная информация? Где посмотреть? По теме, мои 5 коп.: наверное стоит посмотреть, как в xr_gulag(или где там?) происходит сохранение\загрузка работ для неписей под гулагом и прикрутить это в xr_logic, где обрабатывается собственно логика неписей. Но тогда, наверное, придется разруливать все эти взаимодействия xr_gulag и xr_logic? И что-то мне подсказывает, что полноценно это можно решить только совместной правкой движка и скриптов. @h0N0r Я кондлист в xr_gulag для [logic] active = .... уже давно прикрутил, и ни разу не заметил никаких проблем от этого. Ссылка на комментарий
dsh 3 824 Опубликовано 27 Января 2022 Поделиться Опубликовано 27 Января 2022 @h0N0r посмотри вот тут https://github.com/dsh2dsh/op2ogse/blob/7dd4bb322bd960d43e2a404743d8830164a1d4d0/gamedata/scripts/xr/xr_logic.script#L1810 save_logic_online() и load_logic_online(), а так же из вызов в xr_motivator.script https://github.com/dsh2dsh/op2ogse/blob/7dd4bb322bd960d43e2a404743d8830164a1d4d0/gamedata/scripts/xr/xr_motivator.script#L241 https://github.com/dsh2dsh/op2ogse/blob/7dd4bb322bd960d43e2a404743d8830164a1d4d0/gamedata/scripts/xr/xr_motivator.script#L361 Это для движка OGSR. Если посмотришь там историю коммитов, то в прошлом увидишь, как это было сделано для x-ray extensions, что, скорее всего, даже для классического движка подойдет. 1 dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
imcrazyhoudini 208 Опубликовано 6 Сентября 2022 Поделиться Опубликовано 6 Сентября 2022 @dsh это как понимаю для одиночных НПС, а для тех, что в гулаге есть правка? ищу человека, который смог бы заняться разработкой погоды на OGSR. кто может помочь - пишите в ЛС. Ссылка на комментарий
dsh 3 824 Опубликовано 6 Сентября 2022 Поделиться Опубликовано 6 Сентября 2022 @Houdini_one для тех, кто в гулаге, оно и так работает, активная секция изначально сохраняется. dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
imcrazyhoudini 208 Опубликовано 6 Сентября 2022 Поделиться Опубликовано 6 Сентября 2022 (изменено) @dsh взять того же Шустрого с ТЧ, он же под гулагом если не ошибаюсь, и постоянно бегал с АТП в деревню. У меня лично НПС в гулагах так же логику с самого начала отыгрывают (сохранял логику через кондлист, но неудобно + начинает сохранять текущую секцию логики лишь после сэйв-лоада). Изменено 6 Сентября 2022 пользователем Houdini_one ищу человека, который смог бы заняться разработкой погоды на OGSR. кто может помочь - пишите в ЛС. Ссылка на комментарий
dsh 3 824 Опубликовано 6 Сентября 2022 Поделиться Опубликовано 6 Сентября 2022 @Houdini_one не, не могу уже ничего вспомнить по этому поводу. Единственное замечу, что сложная логика в гулагах делается через состояния гулага, а не через разные секции логики. Например, если все в лагере должны до определенного момента патрулировать, а после определенного момента сидеть у костра, то вместо наворачивания разных секций логики и переходов между ними, лучше сделать два состояния лагеря, каждое со своей логикой. @Houdini_one а с тем же Шустрым, например, то вместо того, что бы находясь в первом гулаге на АТП, бежать в ДН, нужно перевести его в другой гулаг, например в тот же ДН, и пусть уже бежит спать, будет членом лагеря ДН. Собственно говоря, насколько вижу, оно так и происходит: [smart_terrains] esc_prisoner = {-tutorial_wounded_give_info} esc_lager = {+tutorial_wounded_give_info} Хотя у меня не оригинал распакован. Возможно это уже в ОП-2 поменяли. 1 dsh mod: https://github.com/dsh2dsh/op2ogse Ссылка на комментарий
imcrazyhoudini 208 Опубликовано 7 Сентября 2022 Поделиться Опубликовано 7 Сентября 2022 8 часов назад, dsh сказал: ОП-2 поменяли Скорее всего Ну окей, буду так делать ну и через кондлисты как раньше, ну и гулаги менять в случае чего. Главное с одиночными НПС всё окей уже. ищу человека, который смог бы заняться разработкой погоды на OGSR. кто может помочь - пишите в ЛС. Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти