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

Скриптование


Svoboда

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

Не, тупо, for i = 1, 65535 do

if ... then alife():release( obj, true )end

end

 

а потом начинает отрабатывать net_spawn() всего удаленного.

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


Ссылка на сообщение

Если мы точно  знаем, что повис action_planner:update(), и точно знаем, у какого непися он повис   - выяснить, НА ЧЕМ ИМЕННО он повис - все равно ни как нельзя ? Или эта информация все-таки может быть как-то вытянута ?

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


Ссылка на сообщение
4 часа назад, tsap-tsap сказал:

 if amk_mod.check_npc_in_hideout(db.actor)

function check_npc_in_hideout(npc,hide)

 

Просто стоит посмотреть в скрипт, который пытаетесь использовать.

 

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

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


Ссылка на сообщение

Вообще-то это делает движок. Если непись не висит.

Ну а что где правилось для приведения движка в состояние полного изумления - это уже вопрос для телепатов.

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


Ссылка на сообщение

Граждане, да вы издеваетесь...

 

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 для проверки - какой надо удалить.

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


Ссылка на сообщение

Так это с версии 0.0000 какой-нибудь. Когда еще половина движка вообще не работала. И с тех пор ни кто и не убирал.

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


Ссылка на сообщение

Прямо в соседней теме и было. Только к скриптам отношения не имеет: чистый конфиг. Создаем пистолет на n патронов, создаем для него патроны с отрицательным весом, устанавливаем в нем патроны через set_ammo_elapsed()

 

Сами патроны ни куда не спавнить. Ни при каких обстоятельствах.

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


Ссылка на сообщение

Это зависит от того, что хочется получить в результате, и есть ли где-то переменная st_test. Наличие в xml тэга с аналогичным названием ни каким образом не связано с существованием каких-либо переменных.

 

Ну и в зависимости от того, что там за  news_manager.

 

 

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


Ссылка на сообщение

Все 4 функции внутри:  assert(),  printf(),  dbglog() рассчитаны на какую-то конкретную правку движка. На стандартном ТЧ ни одна из них не выдаст ничего.

Далее, саму abort() кто-то должен вызвать, обнаружив проблему и передав туда корректные параметры, понимаемые string.format()

 

В общем, от вышеприведенных танцев с бубном в логе ничего вразумительного не появится. Более того, передав неправильные параметры, можно получить этот самый вылет без лога или с логом совершенно невменяемым в самой безобидной ситуации.

 

Так что для начала следует определиться с движком.

В стандартном - единственный способ записать в лог то, что мы хотим - это дать какую-нибудь неправильную команду консоли, например: get_console():execute( "load несуществующий_файл что-то еще" ), и, чтобы гарантированно получить запись в файл всего, что выдавали ранее - get_console():execute( "flush" )

 

  • Полезно 1

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


Ссылка на сообщение

Ну, то есть, закомментировано все, кроме

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

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


Ссылка на сообщение

Нет, в сталкере нет возможности изменять содержимое графический файлов при помощи скриптов. Да и 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 )
Но это тоже ничего не дает.

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


Ссылка на сообщение
7 часов назад, AndrewMor сказал:

Это потому, что одни в одном гулаге сидят. Убивая одного, они будут реагировать. А если сталкер отдельно от всех - его как угодно вали, никто не чухнется.

 

И что случилось с обработкой gamedata\config\creatures\game_relations.ltx

[communities_sympathy]/*_goodwill/*_reputation ?

 

Правда, не вполне понимаю, зачем с этим все еще и что-то делать скриптово, как и в предыдущем вопросе про реализацию фотошопа на LUA.

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


Ссылка на сообщение
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" )

 

А немного выше - русский текст про принудительную остановку игры и вывод того, что не нравится в "добавленном уникальном персонаже на кордоне". И все это есть в логе.

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

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


Ссылка на сообщение

Может. Чем больше набиваем - тем больше опечаток.

А когда при достижении некоторого объема в ход идет копипаста - вот здесь и начинается настоящее веселье...

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


Ссылка на сообщение

Гм... 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

- будет лапша вместо данных.

 

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

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


Ссылка на сообщение

В любом.

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 лет после выхода игры...

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


Ссылка на сообщение

Предполагается, что кто-нибудь особо одаренный может засунуть туда false, а где-то сильно потом его захотеть.

 

upd: да, оно еще и с  ошибкой.

Изменено пользователем Dennis_Chikin
  • Спасибо 1

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


Ссылка на сообщение
function CSurgeManager:play_siren_sound()
	local snd_obj=self.blowout_sounds["siren"]

В таком виде "извне" уже недоступно. Править саму функцию.

А поскольку сделано "псевдообъектом" - то еще и его куда-то вытягивать.

 

Проще написать свое.

  • Спасибо 1

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


Ссылка на сообщение

treasures[treasure_id].active в данном случае - из того, что мы здесь видим -  является попыткой извлечь что-то из nil.  Что предполагалось получить таким способом - сложно сказать.

 

Впрочем, для начала, еще интересно, ОТКУДА должно что-то вызываться в

on_actor_inside = sr_idle@nil %=give_treasure(esc_treasure_1)%

и есть ли оно ТАМ.

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

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


Ссылка на сообщение

Гм, ну тогда надо смотреть, как (чем) заполняется treasures[]

Ну а потом проверять, точно ли везде передается строка, и является ли она ключом в этой таблице.

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


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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