Перейти к содержанию
Авторизация  
_professor_Sakharov_

S.T.A.L.K.E.R.: Shadow of Chernobyl - Build 1902 - 2004 год

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

 

Благодарю. На горячую спрошу еще. Надеюсь не достаю. С отношениями проблема решаемая? При убийстве военных все становятся врагами. Помню что то подобное было в 1935.


Дополнено 0 минут спустя

 


Дополнено 5 минуты спустя
Цитата

Файл system.ltx

actor.ltx 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 
1 минуту назад, CHRNVMXM сказал:

Благодарю. На горячую спрошу еще. Надеюсь не достаю. С отношениями проблема решаемая? При убийстве военных все становятся врагами. Помню что то подобное было в 1935.


Дополнено 0 минут спустя

 

Пытался:

Спойлер

 

game_relations.ltx — добавил правильную матрицу, не помогло.

death_manager.script — такого файла в билде 1902 нет.

xr_reactions.script, xr_meet.script, stateattack.script, xr_bandit.script, xr_chaser.script, system.ltx, m_stalker.ltx — ни в одном из них нет кода, который бы делал всех врагами после атаки.

Вывод: скорее всего, это поведение зашито в движок (экзешник). В более поздних билдах (например 1935) его отключили, а в 1902 оно осталось. Без правки бинарников тут уже не обойтись — как когда-то macron патчил одно ядро и память.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
 

1902_agro_heli_fixx_v2 
Маленький патч 
https://disk.yandex.ru/i/9YuCu0I_Cie-kA
Положить сюда: gamedata\scripts

Спойлер

---CHelicopter::state[510705]==(eIdleState)
---CHelicopter::state[510751]==(eInitiatePatrolByPath)
---CHelicopter::state[511711]==(eMovingByPatrolPath)
***STOP*** file 'd:\projects\xray\xr3da\xrgame\safe_map_iterator_inline.h', line 59.
***Reason***: *** Assertion failed ***
Expression: no_assert
Specified object hasn't been found in the registry!
***STOP*** file '(null)', line 0.

 


Дополнено 32 минуты спустя
Спойлер

 

Основной вывод
Реализовать динамические новости как отслеживание смертей всех NPC/мутантов в этом билде невозможно без модификации C++ кода движка или ручного назначения story_id в редакторе. Все известные скриптовые методы были исчерпаны.

Ключевые ограничения билда 1902

-Отсутствует callback-событие on_npc_death — оно появилось только в более поздних сборках (1935+).

-В таблице callback нет ключа death — в документации билда перечислены только callback.hit, callback.sound и т.п. Это значит, что даже теоретически невозможно зарегистрировать колбэк на смерть объекта через set_callback.

-Разрыв между Alife-объектами и клиентскими объектами — hit_callback работает только на клиентских объектах, а level.object_by_id() возвращает объект лишь когда он находится в онлайне. Без работающего итератора невозможно заранее узнать, какие id окажутся в онлайне, поэтому массовая установка колбэков нереализуема.

-Итератор alife():first_object()/next_object() нестабилен в пользовательских циклах с wait(). Даже с блокировкой sim_iterator_lock он либо не находит объекты, либо не вызывается вовсе.

-Невозможно установить hit_callback или death_callback на серверные объекты — эти колбэки работают только для клиентских объектов, а серверные (Alife-сущности) их не поддерживают.

-register_callback для событий смерти не реализован в этом билде.

-Методы memory(), best_enemy() и звуковые колбэки не позволяют зафиксировать момент смерти — только факт видимости или атаки.

-motivator_binder:update() перестаёт вызываться после смерти объекта, поэтому отследить переход в «мёртвое» состояние внутри биндера нельзя.

Перечень всех проверенных методов (28+ попыток работы с добавлением динамических новостей с сохранением статических):

1. Добавление итератора в основной цикл level_news.script без задержек → сломались даже статические новости.

2. Итератор с задержкой 30 сек и блокировкой sim_iterator_lock → статика работает, динамика отсутствует.

3. Отладочная выдача тестовой инфопорции при обнаружении NPC → не сработала — итератор не находит персонажей.

4. Тестовая инфопорция в начале main() → вылет при отсутствии XML-записи.

5. register_callback("on_npc_death") → не поддерживается билдом.

6. set_hit_callback через alife():story_object() → колбэк не вызывается.

7. Периодический опрос story_id → у персонажей нет story_id без редактора.

8. Поддержка разных уровней в fill_news() → исправлена статика.

9. Замена # на table.getn (Lua 5.0) → устранена синтаксическая ошибка.

10. Исправление опечаток news/news → скрипт заработал без ошибок.

11. Замена give_info_portion_via_pda на give_info_portion → не повлияло.

12. Отдельный скрипт dynamic_news.script с собственным циклом → динамики нет.

13. Интеграция в xr_motivator.script → нет метода death_callback.

14. Использование точных имён объектов с итератором → объекты не найдены.

15. Обернули каждый потенциально опасный вызов (например, sim:first_object(), obj:alive(), actor:give_info_portion_via_pda()) в конструкцию pcall(function() ... end). Это предотвращает аварийное завершение скрипта при возникновении ошибки, но не решает саму проблему динамических новостей.

16. Увеличение задержки до 120 секунд → не помогло.

17. Подключение dynamic_news.script через script.ltx → скрипт запустился, но не работает.

18. Замена device():time_global() на game.time() и обратно → без эффекта.

19. Вариации захвата итератора (без блокировки, с одной, с двойной проверкой) → итератор нестабилен в любом варианте.

20. Ручное убийство сталкеров для проверки → динамика не сработала.

21. Подготовлен полный XML с уникальными инфопорциями → скрипт не фиксирует смерть.

22. «Тихая» выдача через give_info_portion → не решает проблему детекта.

25. Замена printf на log → не помогло в отладке.

26. Использование game_graph для обхода всех вершин → не даёт доступа к game_object или alife_object, только к информации о вершинах графа.

27. debug.sethook для перехвата событий → не позволяет отследить смерть конкретного объекта и критически замедляет игру.

28. Чтение specific_character.xml для получения story_id → это лишь шаблоны, не привязанные к конкретным экземплярам на карте.

29. Создание своего биндера для всех сталкеров и мутантов → потребовало бы глобальной замены motivator_binder, что слишком рискованно и меняет поведение всех NPC.

30. Модификация xr_motivator.script — в сборке 1902 у биндера нет метода death_callback, и его добавление ломает совместимость.

 

Другие попытки: использовать game_object:memory(), best_enemy(), clsid, specific_character.xml, net_destroy, debug.sethook, game_graph и другие методы → все оказались неработоспособны или неприменимы.

Анализ возможности создания собственного биндера с death_callback → вероятно рискованно и не тестировалось.

Достигнутый результат:
Статические новости (level_news.script) работают и появляются. Динамические новости в попытке сделать из текущей конфигурации признаны нереализуемыми. Тема закрыта окончательно.

Дополнительно:
В оригинальном скрипте level_news.script можно убрать ограничение по разделению новостей по уровням, и тогда новости будут писаться в случайном порядке без ограничений на имя уровня. Это позволяет сделать поток новостей разнообразнее на любой локации, не требуя динамического отслеживания смертей.

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   1 пользователь онлайн

Важная информация

Мы разместили cookie-файлы на ваше устройство, чтобы помочь сделать этот сайт лучше. Вы можете изменить свои настройки cookie-файлов, или продолжить без изменения настроек. Оставаясь на сайте, вы подтверждаете свое согласие на их использование. Политика конфиденциальности | Условия использования