Dennis_Chikin 3 665 Опубликовано 5 Июня 2017 Не, тупо, for i = 1, 65535 do if ... then alife():release( obj, true )end end а потом начинает отрабатывать net_spawn() всего удаленного. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 24 Июня 2017 Если мы точно знаем, что повис action_planner:update(), и точно знаем, у какого непися он повис - выяснить, НА ЧЕМ ИМЕННО он повис - все равно ни как нельзя ? Или эта информация все-таки может быть как-то вытянута ? Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 1 Июля 2017 4 часа назад, tsap-tsap сказал: if amk_mod.check_npc_in_hideout(db.actor) function check_npc_in_hideout(npc,hide) Просто стоит посмотреть в скрипт, который пытаетесь использовать. Кстати, тема для таких вопросов выбрана не вполне удачная, поскольку внесено очень большое количество изменений, делающих неработоспособным то, к чему все привыкли по другим модам. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 3 Июля 2017 Вообще-то это делает движок. Если непись не висит. Ну а что где правилось для приведения движка в состояние полного изумления - это уже вопрос для телепатов. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 15 Июля 2017 Граждане, да вы издеваетесь... bind_stalker.actor_binder:net_spawn() вызывается таки один раз при старте/загрузке. При НИ в bind_stalker.actor_binder:update() используется с оригинала еще проверка if not has_alife_info("storyline_actor_start") and (level.name() == "l01_escape") then self.object:give_info_portion("storyline_actor_start") _G.g_start_avi = true printf("*AVI* RUN START AVI") end - стартовый ролик, ага ? P.S. Давайте добавим на каждую локацию ТЫЩУ рестрикторов. И будем их все перебирать каждые 20ms для проверки - какой надо удалить. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 15 Июля 2017 Так это с версии 0.0000 какой-нибудь. Когда еще половина движка вообще не работала. И с тех пор ни кто и не убирал. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 19 Августа 2017 Прямо в соседней теме и было. Только к скриптам отношения не имеет: чистый конфиг. Создаем пистолет на n патронов, создаем для него патроны с отрицательным весом, устанавливаем в нем патроны через set_ammo_elapsed() Сами патроны ни куда не спавнить. Ни при каких обстоятельствах. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 5 Сентября 2017 Это зависит от того, что хочется получить в результате, и есть ли где-то переменная st_test. Наличие в xml тэга с аналогичным названием ни каким образом не связано с существованием каких-либо переменных. Ну и в зависимости от того, что там за news_manager. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 24 Ноября 2017 Все 4 функции внутри: assert(), printf(), dbglog() рассчитаны на какую-то конкретную правку движка. На стандартном ТЧ ни одна из них не выдаст ничего. Далее, саму abort() кто-то должен вызвать, обнаружив проблему и передав туда корректные параметры, понимаемые string.format() В общем, от вышеприведенных танцев с бубном в логе ничего вразумительного не появится. Более того, передав неправильные параметры, можно получить этот самый вылет без лога или с логом совершенно невменяемым в самой безобидной ситуации. Так что для начала следует определиться с движком. В стандартном - единственный способ записать в лог то, что мы хотим - это дать какую-нибудь неправильную команду консоли, например: get_console():execute( "load несуществующий_файл что-то еще" ), и, чтобы гарантированно получить запись в файл всего, что выдавали ранее - get_console():execute( "flush" ) 1 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 25 Ноября 2017 Ну, то есть, закомментировано все, кроме function dbglog(fmt,...) local msg = string.format(fmt, ...) local msg_no_ws = string.gsub(msg, "%s", "_") get_console():execute("dbg:" .. msg_no_ws) end string.format() пытается повторить с собственным результатом то же, что делала в abort. Если там на входе в первом аргументе будет, к примеру, %s, а в последующих - true, false, или вообще nil, не говоря о таблице или userdata - вылет будет со странным и загадочным логом даже в абсолютно безобидной ситуации. Такое может организовать, к примеру, xr_logic.script из оригинала/амк и over 99% их потомков. string.gsub() пытается заменить пробелы на подчеркивания, если до него вообще когда-нибудь дойдет очередь. get_console() в таком виде действительно попытается записать что-нибудь в лог, но, если получившаяся в результате предшествующих операций строка будет не длиннее 200 с копейками байт, и если после этого на самом деле не случится безлоговый вылет. А главное, повторюсь, тот abort() сначала должен быть вызван кем-то. В случае реального вылета вызвать его будет уже некому. Мораль - тебе надо самому организовать вывод в лог, и ставить его в подозрительных местах. К примеру, так: my_script.script: function abort( src, fmt, ... ) get_console():execute( string_format( "load ~error~: [%s] %s", src, ( ... and string_format( fmt, ... ) ) or fmt or "" ) ) get_console():execute( "load ~~~ Обнаружена ошибка. Описание ошибки смотрите выше. Игра остановлена." ) get_console():execute( "load ~~~ Пожалуйста, не надо сообщать об ошибке в строке ***." ) get_console():execute( "load ~~~ Какую-либо ценность имеют 10 строк ДО этого сообщения." ) get_console():execute( "flush" ) watchdog = src local error ; error = 1/error; get_console():execute( "quit" ) -- Warning ! Может не срабатывать из апдейтов и иже с ними, если это не актор. Используейте watchdog. end bind_stalker.script: function actor_binder:update( delta ) if _my_script.watchdog then abort( "bind_stalker", "actor, ошибки в скрипте: %s", my_script.watchdog ) end подозрительный скрипт: где-то в подозрительном месте: obj.respawn_section = r_spawns( ini, section_name, "respawn_section", obj.sectSpawnProps, p ) or abort( "мой_подозрительный_скрипт.script", "init_respawn_params, invalid section: [%s], line: [respawn_section] (%s)", section_name, obj.amk_name or obj_name ) результат: если ты всадил ошибку в олспавн, то у тебя при респане будет вылет с указанием неправильной секции и строки с ахинеей, вместо того, чтобы вылететь по "недостаточной памяти" или еще с какой "строкой 804".минут через 10 после того, как твой спавн повис наглухо 1 2 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 28 Ноября 2017 Нет, в сталкере нет возможности изменять содержимое графический файлов при помощи скриптов. Да и xml, по большому счету, тоже. Хотя есть некоторые трюки с записью "в память" и "перезагрузкой" измененного, но в данном случае (как и большинстве других), этот трюк совершенно бесполезен. Есть возможность копирования файлов из иерархии сталкера, типа local f = getFS() local f1 = f:update_path( "$game_config$", "file1.ltx" ) local f2 = f:update_path( "$game_config$", "file2.ltx" ) f:file_copy( f1, f2 ) Но это тоже ничего не дает. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 28 Ноября 2017 7 часов назад, AndrewMor сказал: Это потому, что одни в одном гулаге сидят. Убивая одного, они будут реагировать. А если сталкер отдельно от всех - его как угодно вали, никто не чухнется. И что случилось с обработкой gamedata\config\creatures\game_relations.ltx [communities_sympathy]/*_goodwill/*_reputation ? Правда, не вполне понимаю, зачем с этим все еще и что-то делать скриптово, как и в предыдущем вопросе про реализацию фотошопа на LUA. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 7 Декабря 2017 (изменено) 16 часов назад, dsh сказал: Это экономия на спичках. спички при этом с легкостью необычайной могут выглядеть как bd.actor, dd.actor, bb.actor или даже db,actor Кроме того, это реально может быть actor без предварительного actor = db.actor не по тому, что "экономили на спичках", а по тому, что "пишу то, что думаю". Есть еще вариант, когда обращение к актору зачем-то надо до того, как он вошел в онлайн, и конструкция if db.actor then foo( db.actor, .... ) else foo( db.actor_proxy, ... ) end - написанная раз, этак, много - это уже не про "экономию на спичках", а куда-то в разряд развлечений с латексом, наручниками и плетками. (С чего, собственно, и начался этот трэд.) 14 часов назад, Fenrir02 сказал: local a ; a = 1/a; get_console():execute( "quit" ) А немного выше - русский текст про принудительную остановку игры и вывод того, что не нравится в "добавленном уникальном персонаже на кордоне". И все это есть в логе. Изменено 7 Декабря 2017 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 7 Декабря 2017 Может. Чем больше набиваем - тем больше опечаток. А когда при достижении некоторого объема в ход идет копипаста - вот здесь и начинается настоящее веселье... Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 15 Декабря 2017 (изменено) Гм... pstor_save_all/pstor_load_all() - это дописывание в конец пакета произвольных данных. Фактически, то же, что и действия перед ним. Разумеется, ни кто не запрещает воткнуть в любое место запись каких-то данных еще в каком-то порядке. Следовательно, чтобы прочитать записанное, читать надо ровно в том же порядке, в каком писали. Как внутри организованного блока, так в последовательности блоков разных форматов. К примеру, меня не устроили сохранения неких значительных массивов данных, по-этому в свое время было сделано такое: function my_binder:save( pk ) object_binder.save( self, pk ) xr_logic.save_obj( self.object, pk ) local n = 0 -- корректировка и сохранение времени for k, v in pairs( tm_sec ) do n = n + 1 end pk:w_u32( n ) for k, v in pairs( tm_sec ) do pk:w_stringZ( k ); pk:w_float( v - game_time_sec ) end n = 0 for k, v in pairs( tm_ms ) do n = n + 1 end pk:w_u32( n ) for k, v in pairs( tm_ms ) do pk:w_stringZ( k ); pk:w_float( v - game_time_ms ) end end а мог, к примеру, писать так: function my_binder:save( pk ) object_binder.save( self, pk ) xr_logic.pstor_save_all( obj, pk ) local n = 0 -- корректировка и сохранение времени ... end Или, если мне ни какие "стандартные" данные не нужны, просто сразу писать что-то свое, не трогая xr_loigic вообще. Но, нельзя делать так: function load_obj( npc, pk ) ... local s = pk:r_stringZ() if s == "" then st.loaded_ini_filename = nil else st.loaded_ini_filename = s end s = pk:r_stringZ() if s == "" then st.loaded_section_logic = nil else st.loaded_section_logic = s end ... end function save_obj( npc, pk ) ... pk:w_stringZ( st.section_logic or "" ) pk:w_stringZ( st.ini_filename or "" ) ... end - будет лапша вместо данных. Изменено 15 Декабря 2017 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 21 Декабря 2017 В любом. local lv = alife():level_id() if db.storage[0].pstor.on_level ~= lv then db.storage[0].pstor.on_level = lv if lv == 1 then ... зашли на Кордон end end Только прежде, чем это делать, надо понимать, что от "написать", оно "к игре" не подключится. Как и приведенный образец (который - сам по себе из серии "никогда так не делайте"). А также то, что для работы необходимо наличие стартовавшего актора. Если надо раньше, то вместо db.storage[0].pstor следует использовать, скажем, custom_data актора или, к примеру, сидоровича, и читать/сохранять ее через их нетпакет. Вообще, следовало бы начать со смысла данного действа. 10 часов назад, dsh сказал: Что за криворукие уедятлы Студентам раздали темы для курсачей, а потом результаты собрали в кучу и выпустили в виде игры. Впрочем, перлы типа if obj:id() == id and obj.id and obj then ... регулярно рожаются людьми вполне взрослыми через 10 лет после выхода игры... Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 5 Января 2018 (изменено) Предполагается, что кто-нибудь особо одаренный может засунуть туда false, а где-то сильно потом его захотеть. upd: да, оно еще и с ошибкой. Изменено 6 Января 2018 пользователем Dennis_Chikin 1 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 5 Января 2018 function CSurgeManager:play_siren_sound() local snd_obj=self.blowout_sounds["siren"] В таком виде "извне" уже недоступно. Править саму функцию. А поскольку сделано "псевдообъектом" - то еще и его куда-то вытягивать. Проще написать свое. 1 Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 9 Января 2018 (изменено) treasures[treasure_id].active в данном случае - из того, что мы здесь видим - является попыткой извлечь что-то из nil. Что предполагалось получить таким способом - сложно сказать. Впрочем, для начала, еще интересно, ОТКУДА должно что-то вызываться в on_actor_inside = sr_idle@nil %=give_treasure(esc_treasure_1)% и есть ли оно ТАМ. Изменено 9 Января 2018 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение
Dennis_Chikin 3 665 Опубликовано 9 Января 2018 Гм, ну тогда надо смотреть, как (чем) заполняется treasures[] Ну а потом проверять, точно ли везде передается строка, и является ли она ключом в этой таблице. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Поделиться этим сообщением Ссылка на сообщение