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

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

15 часов назад, mole venomous сказал:

Есть ли какой скриптовый способ запретить НПСам НЕ брать конкретный предмет с земли и/или трупа/ящика?

Есть, примеры можно посмотреть в репозитории по dsh-mod на Githab.  Или в репозитории от Den1s'a там же ( вариант той же фишки для НЛС ).
Суть в том, что объекту в конфиг прописывается новый ключ, который задает то самое "руки прочь".
В ДШ-моде это 
watcher_act.bad_item = true

Ну и соответственно:
1) в watcher_act (онлайновое воровство - трупы/земля) - добавить чтение и обработку этого ключа
2) в amk_offline_alife - аналогично.

Способ проверен, все  работает.

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

След от кругов на воде - это тоже след (с)

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

Подскажите решение проблемы с большим количеством второстепенных квестов, когда сначала путаются их описания, а потом происходит вылет вида +165 bytes в конце - "XR_3DA.exe caused BREAKPOINT in module ""E:\GAMES\S.T.A.L.K.E.R\bin\xrCore.dll"" at 001B:00597D15, xrDebug::backend()+165 byte(s)"

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

@Капрал Хикс, это,вернее всего, происходит из-за превышения размера пакета сохранения клиентских данных у актера: информация о заданиях там сохраняется: см. task_manager.script

Решение: для сохранения этих данных подключить , допустим, хранилище от Artos'а.

Либо оптимизировать сохранение: выкинуть лишнее, для строк использовать хэши, булевы значения побитово записывать в u8, и прочие изощрения... Но хранилище, по-моему, лучший вариант.

 

Сейчас ещё глянул - там количество записей при сохранении ограничено u8 - т.е. 255, так что если заданий в конфиге больше - будут глюки. Решение: нужно заменить в сохранении/загрузке количества записей с r(w)_u8 на r(w)_u16 - тогда лимит будет 65535.

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

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

naxac.gif

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

@naxac, вах! По методу последнему и хранилище от Артоса не понадобится, верно?

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

function signals_mgr:subscribe_module( module_name )
  local module = _G[ module_name ]
  ASSERT(
    module,
    "signals_mgr:subscribe_module: Failed to subscribe module '%s'",
    module_name
  )
  ASSERT(
    type( module ) == "table",
    "signals_mgr:subscribe_module: Failed to subscribe module '%s', must be a table",
    module_name
  )
  ASSERT(
    type( module.attach ) == "function",
    "signals_mgr:subscribe_module: Failed to subscribe module '%s', has no 'attach' function",
     module_name
  )
  module.attach( self )
end

Строка 269 из скрипта выделена курсивом

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

@Капрал Хикс, смотря сколько у тебя тасков. Я проверял на ОП-2, там 165 квестов, на сохранение по старой схеме (но там уже строки сохранялись хэшами) данные занимали около 2kb, активных заданий при этом было всего 2, Пакет актёра - максимум 8kb, так туда обычно ещё много чего сохраняют: таймеры там всякие, переменные разные и т.д. Вот тут я переделал немного сохранение: ссылка. Места стало занимать почти в два раза меньше. А по сравнению с чистым ТЧ - разница, наверное, раза в четыре, потому что там всё строками сохранялось.

 

@DMT, у тебя функция ASSERT не рабочая. Если бы она работала - в логе было бы написано, что в папке scripts нет подключаемого модуля (файла), и было бы написано, какого именно.

Изменено пользователем naxac
  • Полезно 4

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

naxac.gif

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

@naxac, Я в _g.script прописал пустую функцию ASSERT

Цитата

function ASSERT( cond, ... )
end

Вылет каким был — таким и остался.

Я вырезал все вызовы ASSERT из ogse_signals.script, теперь вылет такой:

Цитата

LUA error: ...ow of chernobyl\gamedata\scripts\ogse_signals.script:243: attempt to index local 'module' (a nil value)

Кусок кода:

Цитата

function signals_mgr:subscribe_module( module_name )
  local module = _G[ module_name ]
  module.attach( self )
end

Строчка 243 выделена курсивом

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

@DMT, я ж тебе объясняю: сделай рабочей функцию ASSERT, и станет понятно, какой модуль отсутствует в скриптах.

Вот тут:

local module = _G[ module_name ]

Определяется переменная этого самого модуля. module_name - название скрипта. Выведи его в лог, и станет понятно, чего не хватает.

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

naxac.gif

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

@DMT, потому что эта функция в огсе предназначена для проверки: если первый аргумент - это false или nil, то выводится сообщение об ошибке, заданное остальными аргументами.

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

naxac.gif

Ссылка на комментарий
только что, DMT сказал:

Почему

потому что пустая функция ничего не делает.

  • Согласен 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.

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

Добрые люди, есть у кого какие соображения, отчего происходит вылет "...gamedata\scripts\amk.script:1403: attempt to perform arithmetic on local 'st' (a string value)". Я уже мозг сломал, не могу выявить причину. Недавно перешёл на таймеры из солянки (в смысле, заменил базовый АМКшный код), вылет происходит при загрузке любого сейва после сдачи вновь добавленного квеста у вновь добавленного СИДового НПС. Грешу на кривую адаптацию кода, ведь раньше вылета не было. Но не вижу взаимосвязи, потому и в тупике. При сдаче квеста ничего особенного - забираем вещь, даём ревард (в виде денег, хабара и тайника), ну и инфопорцию, конечно. Может кто сталкивался, уже не пойму, куда копать...

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

Здесь могла быть ваша реклама.

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

Господа, время доброго! Прошу подсказки

Имеется момент, где мы проигрываем звук:

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

snd_obj:play_no_feedback( npc, sound_object.s3d, 0, npc:position(), 1.0 )

 

Звук проигрывается, но строго в позиции НПС. Если НПС отойдет, то звук продолжается на том же месте, где непися уже нет. Вопрос: как скриптово заставить звук проиграться от лица НПС, будто обычная озвучка? 

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

http://stalkerin.gameru.net/wiki/index.php?title=SoC._Один_из_методов_спавна

 

Я внедрил в геймдату готовый пример от Бардака. Суть примера: имеется файл db.script, в котором две функции: одна спавнит электру, другая — вертолёт. Начинать новую игру не обязательно, НО если после спавна сделать сохранение и загрузку то получаю вылет:

Цитата

Line          : 30
Description   : Specified story object is already in the Story registry!

Мои собственные догадки о причинах вылета такие: после загрузки скрипт второй раз пытается заспавнить электру и вертолёт, которые уже заспавнены. То есть скрипт пытается использовать такие story_id, которые уже использованы. Если это верное предположение, то возникает вопрос: как модифицировать скрипт Бардака, чтобы не было вылета? Самый простой способ?

Несколько минут спустя: моё предположение оказалось неверным. Даже если удалить скрипт от Бардака, сейв всё равно не грузится, всё равно происходит этот вылет. Значит проблема в том, что заспавненные объекты неправильно сохраняются. Почему сейв получается битым ?

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

Почему сейв получается битым ?

Потому, что при установки story_id через нет-пакеты, движок не проверяет дубликаты и не регистрируeт story_id. Все это происходит при следующей загрузке сейва.

Собственно ошибка была при самом первом спане. Модифицировать не надо, надо следить за стори_ид: то ли использовал существующие сиды, то ли электре и вертолету задал одинаковые.

 

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

Модифицировать не надо, надо следить за стори_ид

В смысле ?

Если что, я не вносил никаких изменений в db.script от Бардака.

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

@DMT, добавь в db.script после строки "local story_id = packet:r_u32()" вывод story_id в лог, в функции create_anom и create_heli.

 

Попробуй заменить "local story_id = packet:r_u32()" на "local story_id = packet:r_s32()" и "packet:w_u32(story_id)" на "packet:w_s32(story_id)", тоже в двух функциях. Меняется u32 на s32. Битый сейв удали.

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

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

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

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

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

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

Войти

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

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

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