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

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

Словил тут вылет, когда помер в ЗП:

xr_conditions.script:2196: attempt to index field 'actor' (a nil value)

Точнее при загрузке последнего сохранения.


В кондишнс у меня добавлен код:

function sad_predateli_pda()
if (db.actor:object("sad_mudak_pda") ~= nil) and not (db.actor:has_info("sad_predateli_info")) then
db.actor:give_info_portion("sad_predateli_info")
end
end


2196 это вторая строка, которая if
В чем тут дело?

 

Изначальная функция взята отсюда: http://www.amk-team.ru/forum/topic/8806-cop-kvesty/?page=2&tab=comments#comment-349951

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

Discord-сервер modfaq.ru: https://discord.gg/9j42BXwB

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

@dsh предложили добавить проверку актора на nil:

function sad_predateli_pda()
if db.actor ~= nil and db.actor:object("sad_mudak_pda") ~= nil and not db.actor:has_info("sad_predateli_info") then
db.actor:give_info_portion("sad_predateli_info")
end
end

Проверил, теперь не вылетает.

Discord-сервер modfaq.ru: https://discord.gg/9j42BXwB

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

@aka_sektor вылет, возможно, происходит тогда, когда карта уже загрузилась и ты вызываешь эту функцию, а игрок ещё не появился. Соответственно db.actor ещё не существует(равен nil).

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

Не, всё нормально вроде. Но...

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

Не я же придумал.

function sad_predateli_pda()
local actor = db.actor
if actor ~= nil and actor:object("sad_mudak_pda") ~= nil and not actor:has_info("sad_predateli_info") then
actor:give_info_portion("sad_predateli_info")
end
end

 

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

Подскажите, что делать: добавил уникального персонажа в НС 2016 на Кордоне. Задал ему логику стоять на месте. Всё работает, но после его спавна, происходят постоянные вылеты с непонятным для меня логом:
FATAL ERROR
 
[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_error
[error]File          : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp
[error]Line          : 73
[error]Description   : <no expression>
[error]Arguments     : LUA error: ...ogrammes\s.t.a.l.k.e.r\gamedata\scripts\_util.script:20: attempt to perform arithmetic on local 'a' (a nil value)
 
Что это за ошибка?

Важнейшая задача цивилизации - научить человека мыслить.

Ссылка на комментарий
21 minutes ago, Nazgool said:

local actor = db.actor

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

 

  • Согласен 3
Ссылка на комментарий
1 час назад, Fenrir02 сказал:

[error]Arguments     : LUA error: ...ogrammes\s.t.a.l.k.e.r\gamedata\scripts\_util.script:20: attempt to perform arithmetic on local 'a' (a nil value)
 Что это за ошибка?

Открой редактором, у которого есть нумерация строк, файл gamedata\scripts\_util.script и смотри, что в нем на 20-й строке прописано.

Ссылка на комментарий
1 час назад, AndreySol сказал:

Открой редактором, у которого есть нумерация строк, файл gamedata\scripts\_util.script и смотри, что в нем на 20-й строке прописано.

 

local a ; a = 1/a; get_console():execute( "quit" ) - не знаю что это означает. Пробовал удалить эту строку - получаю вылет с ссылкой на другой фаил

Важнейшая задача цивилизации - научить человека мыслить.

Ссылка на комментарий
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
Ссылка на комментарий

@Dennis_Chikin все, что угодно, может стать всем, чем угодно, в результате очепятки. И actor на следующей строке с лёгкостью может стать aktor-ом.

 

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

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

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

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

Господа, а никто не реализовывал такую вещь, чтобы НПС стреляли реальными патронами из инвентаря? То есть нет патронов - нечем стрелять НПСишке. Прошу прощения у модеров, если не в ту ветку строчу. 

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

Можно ли добавлять свои данные (в конец) для сохранения или смещение тут нельзя трогать?

xr_logic.script ТЧ

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

function save_obj(obj, packet)
    printf("save_obj: obj:name()='%s'", obj:name())

    local npc_id = obj:id()
    local st = db.storage[npc_id]

    printf("save_obj: ini_filename='%s'", utils.to_str(st.ini_filename))
    printf("save_obj: section_logic='%s'", utils.to_str(st.section_logic))
    printf("save_obj: active_section='%s'", utils.to_str(st.active_section))
    printf("save_obj: gulag_name='%s'", utils.to_str(st.gulag_name))

    if st.ini_filename then
        packet:w_stringZ(st.ini_filename)
    else
        packet:w_stringZ("")
    end

    if st.section_logic then
        packet:w_stringZ(st.section_logic)
    else
        packet:w_stringZ("")
    end

    if st.active_section then
        packet:w_stringZ(st.active_section)
    else
        packet:w_stringZ("")
    end

    --if st.active_scheme then
    --    packet:w_stringZ(st.active_scheme)
    --else
    --    packet:w_stringZ("")
    --end

    if st.gulag_name then
        packet:w_stringZ(st.gulag_name)
    else
        packet:w_stringZ("")
    end

    --packet:w_s32(st.stype)

    save_logic(obj, packet)

    if st.active_scheme then
        issue_event(obj, db.storage[npc_id][st.active_scheme], "save")
    end

    pstor_save_all(obj, packet)
end

 

 

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

@Graff46 можно. Почему нет. Главное обратно прочитать в правильном порядке и за границу нетпакета не вылезти.

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

@Graff46 дополню ответ dsh очевидным (хотя, может, и не для всех) уточнением: после таких изменений нужна новая игра, старые сейвы, не содержащие добавленных данных, читаться будут некорректно.

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

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

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

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

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

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

Войти

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

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

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