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

[ТЧ] Сброс текущей секции логики при оффлайн->онлайн

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

Суть проблемы, в оригинальном ТЧ сбрасывается текущая секция логики при оффлайн->онлайн / смена уровня. Частично, это исправляет код из скриптов ЗП:

- нпс/монстры под кастомной логикой (с [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
Ссылка на комментарий

@h0N0r , решение очевидно: на net_destroy объекта сохранять логику, на net_spawn - загружать, вместо save и load соответственно. Сохранять можно в custom_data, например.

Изменено пользователем naxac
  • Согласен 1
  • Полезно 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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

Можно пример, как это сделать. Ещё проверил в ЗП, после смены уровня, у монстров тоже сбрасывается секция.

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

Уже ТЧ

 

НОВАЯ ИГРА


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
 

 

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

@h0N0r , ну, тут просто так на коленке пример не напишешь, много чего переделывать придётся вернее всего.. А чтобы не переделывать - можно добавить поддержку кондлиста в логике гулагов, там, где указывается основная секция (active). Это намного проще. Потом при написании логики выставлять условия для основных секций, например

[logic]

active = {+info1} section@1, {-info1 +info2} section@2, section@3

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

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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

Уже встречалось здесь, работает с 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

 

Ссылка на комментарий
2 часа назад, h0N0r сказал:

работает с info, но вылетает при =dist_to_actor_le(5)

Это от того, что гулаги запускаются, когда актёра ещё нет. Тут желательно обходиться только инфопоршнями.

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Ссылка на комментарий
6 часов назад, naxac сказал:

Это от того, что гулаги запускаются, когда актёра ещё нет.

Извиняюсь, а это проверенная информация? Где посмотреть?

 

По теме, мои 5 коп.: наверное стоит посмотреть, как в xr_gulag(или где там?) происходит сохранение\загрузка работ для неписей под гулагом и прикрутить это в xr_logic, где обрабатывается собственно логика неписей. Но тогда, наверное, придется разруливать все эти взаимодействия xr_gulag и xr_logic? И что-то мне подсказывает, что полноценно это можно решить только совместной правкой движка и скриптов.

 

@h0N0r Я кондлист в xr_gulag для 

[logic]

active = ....

уже давно прикрутил, и ни разу не заметил никаких проблем от этого.

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

@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  это как понимаю для одиночных НПС, а для тех, что в гулаге есть правка?

ищу человека, который смог бы заняться разработкой погоды на OGSR.
кто может помочь - пишите в ЛС.

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

@Houdini_one для тех, кто в гулаге, оно и так работает, активная секция изначально сохраняется.

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

@dsh взять того же Шустрого с ТЧ, он же под гулагом если не ошибаюсь, и постоянно бегал с АТП в деревню.

 

У меня лично НПС в гулагах так же логику с самого начала отыгрывают (сохранял логику через кондлист, но неудобно + начинает сохранять текущую секцию логики лишь после сэйв-лоада).

Изменено пользователем Houdini_one

ищу человека, который смог бы заняться разработкой погоды на OGSR.
кто может помочь - пишите в ЛС.

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

@Houdini_one не, не могу уже ничего вспомнить по этому поводу. Единственное замечу, что сложная логика в гулагах делается через состояния гулага, а не через разные секции логики. Например, если все в лагере должны до определенного момента патрулировать, а после определенного момента сидеть у костра, то вместо наворачивания разных секций логики и переходов между ними, лучше сделать два состояния лагеря, каждое со своей логикой.

 

@Houdini_one а с тем же Шустрым, например, то вместо того, что бы находясь в первом гулаге на АТП, бежать в ДН, нужно перевести его в другой гулаг, например в тот же ДН, и пусть уже бежит спать, будет членом лагеря ДН. Собственно говоря, насколько вижу, оно так и происходит:

[smart_terrains]
esc_prisoner = {-tutorial_wounded_give_info}
esc_lager = {+tutorial_wounded_give_info}

Хотя у меня не оригинал распакован. Возможно это уже в ОП-2 поменяли.

  • Нравится 1
Ссылка на комментарий
8 часов назад, dsh сказал:

ОП-2 поменяли

Скорее всего

 

Ну окей, буду так делать ну и через кондлисты как раньше, ну и гулаги менять в случае чего.

Главное с одиночными НПС всё окей уже.

 

 

ищу человека, который смог бы заняться разработкой погоды на OGSR.
кто может помочь - пишите в ЛС.

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

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

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

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

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

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

Войти

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

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

    Ни один зарегистрированный пользователь не просматривает эту страницу.

AMK-Team.ru

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