DMT 2 Опубликовано 20 Ноября 2019 Есть какой-то простой способ узнать, находится ли актор в укрытии, защищённом от выбросов? И в зависимости от этого вернуть true или false Кто знает, помогите, подскажите. Я нашел ответ на свой вопрос: нужно использовать (surge_manager.actor_in_cover()) Поделиться этим сообщением Ссылка на сообщение
DMT 2 Опубликовано 12 Декабря 2019 Цитата LUA error: ...ow of chernobyl\gamedata\scripts\ogse_signals.script:269: attempt to index local 'module' (a nil value) Почему происходит этот вылет ? Кто знает, кто подскажет ? Поделиться этим сообщением Ссылка на сообщение
DMT 2 Опубликовано 12 Декабря 2019 Цитата 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 Поделиться этим сообщением Ссылка на сообщение
DMT 2 Опубликовано 12 Декабря 2019 @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 2 Опубликовано 12 Декабря 2019 @naxac, А в каком смысле функция ASSERT не является рабочей? Почему вариант Цитата function ASSERT( cond, ... ) end не является рабочим ? Поделиться этим сообщением Ссылка на сообщение
DMT 2 Опубликовано 12 Декабря 2019 @naxac, @Zander_driver, а существует какой-то справочник по скриптам огсе с описанием новых функций ? Поделиться этим сообщением Ссылка на сообщение
DMT 2 Опубликовано 13 Декабря 2019 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, которые уже использованы. Если это верное предположение, то возникает вопрос: как модифицировать скрипт Бардака, чтобы не было вылета? Самый простой способ? Несколько минут спустя: моё предположение оказалось неверным. Даже если удалить скрипт от Бардака, сейв всё равно не грузится, всё равно происходит этот вылет. Значит проблема в том, что заспавненные объекты неправильно сохраняются. Почему сейв получается битым ? Поделиться этим сообщением Ссылка на сообщение
DMT 2 Опубликовано 13 Декабря 2019 4 минуты назад, abramcumner сказал: Модифицировать не надо, надо следить за стори_ид В смысле ? Если что, я не вносил никаких изменений в db.script от Бардака. Поделиться этим сообщением Ссылка на сообщение
DMT 2 Опубликовано 13 Декабря 2019 24 минуты назад, abramcumner сказал: Попробуй заменить "local story_id = packet:r_u32()" на "local story_id = packet:r_s32()" и "packet:w_u32(story_id)" на "packet:w_s32(story_id)", тоже в двух функциях. Меняется u32 на s32. Битый сейв удали. Спасибо, сработало! Интересный момент: при каждом сохранении-загрузке спавнится ещё одна аномалия и ещё один вертолёт помимо тех, которые уже были заспавнены в прошлые разы. Так можно делать сколько угодно или после некоторого критического количества спавнов начнутся вылеты? А есть какие-то уроки с детальным разбором нет-пакетов и как ими пользоваться? Да, я читал коммент Malandrinus в справочнике по функциям и классам https://www.amk-team.ru/forum/topic/7450-spravochnik-po-funkciyam-i-klassam/?do=findComment&comment=258470 и даже кое-что понял, но этот коммент всё же вряд ли можно назвать уроком. Поделиться этим сообщением Ссылка на сообщение
DMT 2 Опубликовано 15 Декабря 2019 https://www.dropbox.com/s/wvub0j4ix30gecy/trade_manager.script?dl=0 Надо разбораться и понять, как работает функция update из этого скрипта. Имеются внешние локалы: Цитата local h24 = 24 local s24 = 3600 * h24 local c_time = game.CTime() local actor = db.actor local t_data = {} local t_ini = {} Имеется функция: Скрытый текст function update( npc ) local tt = t_data[npc:id()] if ( tt.update_time or 0 ) >= time_global() then return end tt.update_time = time_global() + 60000 + npc:id() -- хреновая, но рандомизация local str = pick_section( actor, npc, tt.buy_condition ) if tt.current_buy_condition ~= str then npc:buy_condition( tt.config, str ) tt.current_buy_condition = str end str = pick_section( actor, npc, tt.sell_condition ) if tt.current_sell_condition ~= str then npc:sell_condition( tt.config, str ) tt.current_sell_condition = str end if not tt.buy_supplies then return end str = pick_section( actor, npc, tt.buy_supplies ) if ( tt.current_buy_supplies ~= str ) or ( not tt.resuply_time ) or tt.resuply_time < game.get_game_time() then npc:buy_supplies( tt.config, str ) tt.current_buy_supplies = str c_time:setHMS( h24, 0, 0 ) tt.resuply_time = game.get_game_time() + c_time end end Из всех внешних локалов в теле этой функции используется только c_time. Но этот c_time нигде больше за пределами этой функции не используется, следовательно никакая информация через него не передаётся вовне. А что тогда вообще делает эта функция? Она принимает аргумент npc, ничего не возвращает и ничего не пишет во внешние локалы. Как тогда вызов этой функции может на что-то повлиять в игре? Тем не менее влияние на игровой процесс есть. Например если модифицировать строчку Цитата tt.update_time = time_global() + 60000 + npc:id() эффект может быть весьма заметным и ощутимым. Я не понимаю, каким образом вышеупомянутая функция может передать информацию (например update_time) за пределы себя. Кто может объяснить, помочь или хотя бы посочувствовать? 2 Поделиться этим сообщением Ссылка на сообщение
DMT 2 Опубликовано 16 Декабря 2019 2 часа назад, Kirgudu сказал: а результаты изменений, сделанных внутри функции update, доступны также и за её пределами. Я о том и спрашивал. Но... Нужны детали. 2 часа назад, Kirgudu сказал: Для общего понимания рекомендую почитать, что такое ссылочные типы данных и типы значений (reference type и value type). Насколько я знаю, в Lua ссылочные типы отсутствуют. Так ведь ? 1 час назад, abramcumner сказал: Это не чистая функция, у нее есть побочные эффекты в виде вызовов npc:buy_condition и аналогичных функций. А почему после npc:buy_condition( tt.config, str ) идет строка tt.current_buy_condition = str ? Для какой цели записывать что-то в локал tt, объявленный внутри функции, если вызов npc:buy_condition уже был ? Я написал следующий код: Цитата function func() local s if s==nil then print(64) s=32 end end func() func() Проверил его тут: https://repl.it/languages/lua Результат работы: Цитата 64 64 То есть значение переменной s не сохраняется между двумя вызовами функции func. Зачем тогда в скрипте торговли присваивание tt.current_buy_condition = str ? Как дальше это используется ? Поделиться этим сообщением Ссылка на сообщение
DMT 2 Опубликовано 26 Декабря 2019 (изменено) https://www.dropbox.com/s/wvub0j4ix30gecy/trade_manager.script?dl=0 С этим скриптом имеются странности: * Непись, зашедший в онлайн, потом оффлайн, а потом снова в онлайн, начинает торговать гитарой, губной гармошкой и кпк. * Сразу после старта игры лишних предметов в ассортименте ни у кого нет. Они появляются после того, как актор успел побегать по локации. * Если рядом с НПС, у которого в ассортименте есть гитара, губная гармошка и кпк, сохраниться и загрузиться, то лишних предметов после загрузки не будет. Что приводит к возникновению этого бага? И как пофиксить? Кто сталкивался с этим ? Изменено 26 Декабря 2019 пользователем DMT Поделиться этим сообщением Ссылка на сообщение
DMT 2 Опубликовано 26 Декабря 2019 @naxac, А почему в оригинале такой проблемы не возникает ? Поделиться этим сообщением Ссылка на сообщение
DMT 2 Опубликовано 27 Декабря 2019 @naxac, такой вариант не помог, увы. 1 Поделиться этим сообщением Ссылка на сообщение
DMT 2 Опубликовано 4 Апреля 2020 Как переместить всё содержимое некоторого тайника в инвентарь НПС ? Любые намёки, любые идеи пригодятся. А лучше, если есть готовое решение. Поделиться этим сообщением Ссылка на сообщение
DMT 2 Опубликовано 5 Апреля 2020 04.04.2020 в 10:03, Zander_driver сказал: Где treasure, obj, npc - это клиентские объекты тайника, перемещаемого итема, и НПС, соответственно. И делать надо в цикле, перебирая все итемы в тайнике. А как сделать? Я же заранее не знаю, что окажется в тайнике. Поделиться этим сообщением Ссылка на сообщение
DMT 2 Опубликовано 3 Февраля 2021 Можно ли при определённых условиях заспавнить заданных размеров бокс, защищающий от выброса ? Какие есть способы ? Поделиться этим сообщением Ссылка на сообщение
DMT 2 Опубликовано 3 Февраля 2021 3 минуты назад, Zander_driver сказал(а): Вообще-то, это зависит от местной реализации выброса в "там, о чем вы спрашиваете" Маленькое уточнение: вопрос о том, как вкрутить спавн бокса в оригинал ЗП. Поделиться этим сообщением Ссылка на сообщение