Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: denis2000, FantomICW  
Модостроение. Редактирование и создание скриптов
denis2000Дата: Пн, 10.10.2011, 21:17 | Сообщение # 1
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Редактирование и создание скриптов

Редактирование и создание скриптов на языке LUA

Если у вас появились вопросы по применению скриптов в игре. Задавайте их в этой теме - умные головы,
модосторители и просто разбирающиеся в программировании люди вам ответят.


Много интересного материала здесь (wiki), Lua_help.script, Help из SDK 0.7

Сборник модостроения ЗП v10.10.11 (автор: XOBAH): *.CHM, *.HTML
[cut noguest=Если у вас не открывается файл CHM]Если у вас не открывается файл:
1. Запустите [Пуск]=>[Выполнить] (либо хот-кей [WIN]+[R])
2. Введите команду (без кавычек) "regsvr32 %windir%\system32\hhctrl.ocx"
3. Если вылезло окно об успешном завершении вы все сделали правильно и можете перезагружать компьютер (а может и не надо)
Также: файлы МОГУТ не открываться если в пути к файлу есть: символы кириллицы, "_", "#"
Также: есть не стандартные программы-просмоторщики CHM файлов. Например: FBReader[/cut]

[cut=Где найти лог игры после вылета]Что такое LOG ошибки, и как мне его найти?
Это система отладки происходивших вылетов, которая подается игрой в форме текста, хотя не всегда.
Для того чтоб найти LOG необходимо зайти вот сюда:

В Win хр лог находится:

C:\Documents and Settings\All Users\Документы\S.T.A.L.K.E.R. - Зов Припяти\logs

Затем открываете первый файл в формате TXT, и в нем отбираете с низу 25 строчек. После кидаете эти 25 строчек в сообщение на форум.

В Win7 лог находится C:\Users\Public\Documents\S.T.A.L.K.E.R. - Зов Припяти\logs

Путь к папке с логом можно найти открыв файл fsgame.ltx который находится в корневой директории ЗП, за это отвечает строка:
...
$app_data_root$ = true | false| $fs_root$| users\
(тут мы указываем что папка пользователя, будет хранится рядом с Fsgame.ltx)
...
$logs$ = true| false| $app_data_root$| logs\
(а тут мы указываем что в папке пользователя, в подпапке Logs будут храниться наши логи)
...
[/cut][cut=Получение более подробной информации о вылете (ХОВАН)]
Открываем файл _g.script и ищем такую функцию: function abort(fmt, ...)
Там есть заккомментированная строчка "--error_log(reason)", ее и надо расскомментировать, должно получиться вот так:
Code
function abort(fmt, ...)
                             local reason = string.format(fmt, ...)
                             error_log(reason)
end

Вот для примера два одинаковых вылета, первый с функцией по умолчанию, второй - с поправленной функцией

Первый:
Code
Expression    : !m_error_code
Function      : raii_guard::~raii_guard
File          : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
Line          : 748
Description   : ....a.l.k.e.r. - Зов Припяти\gamedata\scripts\_g.script:478: bad argument #2 to 'format' (string expected, got nil)

Второй:
Code
Expression    : 0
Function      : ErrorLog
File          : D:\prog_repository\sources\trunk\xrServerEntities\script_engine_script.cpp
Line          : 49
Description   : 'Attempt to read a non-existant string field 'path_walk' in section 'walker@mechanic'

[/cut]


Перед тем, как задать вопрос в этой теме, прочтите все предыдущие страницы,
статьи в wiki по ссылке из шапки и соседнюю тему "Курс молодого бойца",
возможно Ваш вопрос уже рассматривался.


Если произошел вылет - выкладываем лог! Вопрос ставим четко, не забываем указывать версию игры, установленные моды их версии, установленные фиксы модов и подробно ваши правки.
Помните чем подробнее вопрос, тем точнее ответ.


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
a4927860Дата: Сб, 21.06.2014, 16:17 | Сообщение # 511
Новичок
Пользователи
Сообщений: 81
Награды: 0
Репутация: [ 22 ]

FantomICW, у меня его нет в gamedata (CoP, SGM 2.2) искал сечем и визуально.
с помошью set_relation можно выбирать 3 позиции, по всей видимости я буду использовать двойную проверку - если враг, если нейтрал - потом буду возвращать обратно.

И теперь остался цикл нормальный, на сколько я понимаю можно либо вводить 9 переменных которые мотаются из мотиватора в мой скрипт и обратно либо... (на этом мысль останавливается)

Добавлено (21.06.2014, 15:48)
---------------------------------------------
FantomICW, не подскажешь как удобнее сделать такой таймер который бы включался по команде а выполнив действие отключался?

Добавлено (21.06.2014, 16:17)
---------------------------------------------
[cut=Как я делаю сейчас (не работает =)]

из файла hero_ability я сначало вызываю

Код
  if item_name=="hero_ability_4" then         
     xr_motivator.timer1=1   
end  


затем в мотиваторе
Код

  if timer1 ~= nil then
  if time_global() - self.last_update > 5000 then
   sr_light.check_light(object)
   self.last_update = time_global()
   timer1 = nil
   hero_ability.tm_go1 = 1
  end
  end


и наконец снова в hero_ability

Код

  if tm_go1~=nil then
   give_object_to_actor("hero_ability_4")
   tm_go1=nil
  end



[/cut]
 
makdmДата: Сб, 21.06.2014, 21:04 | Сообщение # 512
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата a4927860 ()
не подскажешь как удобнее сделать такой таймер который бы включался по команде а выполнив действие отключался?

Используйте пространство имён LEVEL.

Попробуйте так написать в мотиваторе вместо вашего кода

Код
if timer1 ~= nil then  
  local it_is_time = time_global() + 5000
  local wait_timer = function()
   if time_global() > it_is_time then
    return true
   end
  end  
  local do_it = function()
   sr_light.check_light(object)
   give_object_to_actor("hero_ability_4")
  end
  timer1 = nil  
  level.add_call( wait_timer, do_it )
end


Терпение......
И все получится!
 
a4927860Дата: Вс, 22.06.2014, 14:05 | Сообщение # 513
Новичок
Пользователи
Сообщений: 81
Награды: 0
Репутация: [ 22 ]

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

у меня есть вот такая конструкция
[cut]
if target_on ~= nil then
xr_motivator.timer5=1
local oNpc = level.object_by_id(target_on)
if oNpc and oNpc:relation(actor)==game_object.neutral then
oNpc:set_relation (game_object.friend, db.actor)
xr_motivator.npcp = target_on
xr_motivator.npcs = 1
end
if oNpc and oNpc:relation(actor)==game_object.enemy then
oNpc:set_relation (game_object.friend, db.actor)
xr_motivator.npcp = target_on
xr_motivator.npcs = 2
end
else
give_object_to_actor("hero_ability_5")
end
[/cut]
но в ней не работают проверки - враг/нейтрал
не подскажете как в эти проверки нормально сделать?

[cut noguest=Совсем совсем последний]
на сталкерин есть вот такой вот код
Код

     local npc = alife():create("pri_monolith_respawn_2",vector():set(x,y,z),level_vertex_id,game_vertex_id)
     npc:set_relation (game_object.friend, db.actor)



однако при попытке его использования игра вылетает с сообщением
attempt to call method 'set_relation' (a nil value)

Как выбрать последнего созданного нпс для действия? Желательно в одном скрипте

[/cut]


Сообщение отредактировал a4927860 - Вс, 22.06.2014, 15:25
 
FantomICWДата: Вс, 22.06.2014, 16:11 | Сообщение # 514
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

a4927860, может, попробуй так изменить код:
[cut=Код]
Код
    if target_on ~= nil then    
           xr_motivator.timer5=1    
           local oNpc = level.object_by_id(target_on)    
           if oNpc and oNpc:relation(db.actor)==game_object.neutral then    
               oNpc:set_relation (game_object.friend, db.actor)    
               xr_motivator.npcp = target_on    
               xr_motivator.npcs = 1    
           elseif oNpc and oNpc:relation(db.actor)==game_object.enemy then    
               oNpc:set_relation (game_object.friend, db.actor)    
               xr_motivator.npcp = target_on    
               xr_motivator.npcs = 2    
           end    
       else    
          give_object_to_actor("hero_ability_5")    
       end
[/cut]
Сменил два if на цепочку if...elseif. Плюс, по идее, в проверке oNpc:relation должно быть не actor, а db.actor, если переменная или аргумент actor нигде выше не объявлен(а).

Добавлено (22.06.2014, 16:11)
---------------------------------------------
Цитата a4927860 ()
Как выбрать последнего созданного нпс для действия

Устанавливаешь ему локальную переменную:
Код
local npc_id = alife():object("id")

Или там:
Код
local npc_id = get_story_object_id("sid")

И дальше делаешь с ним, что угодно, в рамках данной функции:
Код
alife():create(npc_id,vector():set(x,y,z),level_vertex_id,game_vertex_id)   
npc_id:set_relation (game_object.friend, db.actor)



 
a4927860Дата: Вс, 22.06.2014, 16:31 | Сообщение # 515
Новичок
Пользователи
Сообщений: 81
Награды: 0
Репутация: [ 22 ]

FantomICW, действительно добавление db. заставило работать.

Спасибо большое

Добавлено (22.06.2014, 16:31)
---------------------------------------------
ууххх =)
такого бага у меня еще небыло

0023:03ABB7ED lua.JIT.1.1.4.dll, lua_yield()

выдает на

Код

   if item_name=="hero_ability_6" then  
    xr_motivator.timer6=1
                         local oNpc = alife():object("psy_dog")
                         alife():create("oNpc",db.actor:position():add(db.actor:direction():mul(2)), 1, db.actor:game_vertex_id())
                         oNpc:set_relation (game_object.friend, db.actor)
   end


Сообщение отредактировал a4927860 - Вс, 22.06.2014, 16:13
 
FantomICWДата: Вс, 22.06.2014, 16:50 | Сообщение # 516
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

a4927860, во-первых, зачем брать oNpc в кавычки? Во-вторых, что за объект спавнишь? Дефолтная собака?
Код
local oNpc = "psy_dog"
alife():create(oNpc.id,db.actor:position():add(db.actor:direction():mul(2)), 1, db.actor:game_vertex_id())   
                           oNpc.id:set_relation (game_object.friend, db.actor)



 
a4927860Дата: Пн, 23.06.2014, 14:50 | Сообщение # 517
Новичок
Пользователи
Сообщений: 81
Награды: 0
Репутация: [ 22 ]

Доделал и выложил

Сообщение отредактировал a4927860 - Пн, 23.06.2014, 14:55
 
sergej5500Дата: Сб, 05.07.2014, 22:34 | Сообщение # 518
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый вечер. Хочу уточнить такой момент.

[cut=Функция]-- Сделать сквады врагами, передаются два сквада set_squads_enemies(squad_name_1:squad_name_2)
function set_squads_enemies(actor, npc, p)
if (p[1] == nil or p[2] == nil) then
abort("Wrong parameters in function set_squad_enemies")
return
end

local squad_1 = get_story_squad(p[1])
local squad_2 = get_story_squad(p[2])

if squad_1 == nil then
assert("There is no squad with id[%s]", tostring(p[1]))
return
end
if squad_2 == nil then
assert("There is no squad with id[%s]", tostring(p[2]))
return
end

for k in squad_1:squad_members() do
local npc_obj_1 = db.storage[k.id] and db.storage[k.id].object
if npc_obj_1 ~= nil then
for kk in squad_2:squad_members() do
local npc_obj_2 = db.storage[kk.id] and db.storage[kk.id].object
if npc_obj_2 ~= nil then
npc_obj_1:set_relation(game_object.enemy, npc_obj_2)
npc_obj_2:set_relation(game_object.enemy, npc_obj_1)
printf("set_squads_enemies: %d:set_enemy(%d)", npc_obj_1:id(), npc_obj_2:id())
end
end
end
end
end[/cut]

Я переделываю квест на зачистку базы Чапая под сквады. В деле участвуют 7 сквадов (5 бандитских и 2 сталкерских). В квесте есть задание "Сделать первый выстрел". После этого бандиты становятся врагами и сквады ссорятся. Но игрок может заложить взрывчатку, например. Часть сквадов бандитов может погибнуть. Функция ссоры может быть вызвана для уже погибших сквадов. Делать проверку на существование каждого сквада долго и сложно.

Вопросы.
1. Будут ли вылеты, если ф-ия ссоры вызывается к уже погибшим сквадам.
2. Если надо поправить ф-ию, чтобы она вылетала из-за отсутствующих сквадов, то как это правильно сделать?
 
denis2000Дата: Сб, 05.07.2014, 23:20 | Сообщение # 519
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500,
[cut]Так вот же проверка на отсутствие сквадов:
Код
if squad_1 == nil then
assert("There is no squad with id[%s]", tostring(p[1]))
return
end
if squad_2 == nil then
assert("There is no squad with id[%s]", tostring(p[2]))
return
end

И функция прерывает выполнение если одного из сквадов нет без принудительного краша игры.
[/cut]


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
strelok200Дата: Вс, 03.08.2014, 00:34 | Сообщение # 520
Бывалый
Свобода
Сообщений: 126
Награды: 0
Репутация: [ 33 ]

Приветствую. Возможно ли как-нибудь отследить активацию аномалии (при попадании в нее болта, а не при использовании артефакта)

Нет. denis2000
 
sergej5500Дата: Вс, 17.08.2014, 17:46 | Сообщение # 521
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Всем привет. Возникла небольшая проблема. Для передачи игроком квестовых предметов неписям я применяю функцию типа.

xr_effects.remove_item(actor,npc,{"reduce_cs_heavy_outfit"})

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

[cut=Функция]function jup_b206_rasvet_prior_give_bad_outfit_2(actor, npc)
xr_effects.remove_item(actor,npc,{"reduce_cs_heavy_outfit"})
xr_effects.remove_item(actor,npc,{"reduce_cs_heavy_outfit"})
xr_effects.remove_item(actor,npc,{"reduce_cs_heavy_outfit"})
xr_effects.remove_item(actor,npc,{"reduce_cs_heavy_outfit"})
xr_effects.remove_item(actor,npc,{"reduce_cs_heavy_outfit"})
dialogs.relocate_money(npc,10000,"out")
end
[/cut]
Можно ли расширить эту функцию или написать новую для удаления нескольких одинаковых предметов?
Как это правильно сделать?
 
denis2000Дата: Вс, 17.08.2014, 19:29 | Сообщение # 522
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

sergej5500, Пробуй такую функцию:
Код
function release_actor_inventory(object_name, count)
      local function release_object_item(item)
       if item:section() == object_name and count > 0 then
        alife():release(alife():object(item:id()), true)
        count = count - 1
       end
      end
      db.actor:inventory_for_each(release_object_item)
end

Вызов:
Код
release_actor_inventory("reduce_cs_heavy_outfit", 5)


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
strelok200Дата: Ср, 20.08.2014, 10:52 | Сообщение # 523
Бывалый
Свобода
Сообщений: 126
Награды: 0
Репутация: [ 33 ]

Приветствую.
Мне необходимо записать значение глобальной переменной в сейв
function save(package)
package:w_u32(start_time_resp_anom)
end

function load(package)
start_time_resp_anom = package:r_u32()
end
Функции вызваны из bind.stalker
Но при загрузке сохранение вылет
[error]Expression : !m_error_code
[error]Function : raii_guard::~raii_guard
[error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
[error]Line : 748
[error]Description : e:\strelok200\gamedata\scripts\bind_stalker.script:501: attempt to concatenate field '?' (a nil value)


stack trace:
Судя по всему не удалось загрузить значение переменной.

Добавлено (20.08.2014, 10:52)
---------------------------------------------
Еще такой вопрос: для того, чтобы проверить какая анимация проигрывается персонажем, нужно использовать метод get_state? Просто необходимо, чтобы при проигрывании анимации probe_stand выполнялись определенные действия

 
FantomICWДата: Ср, 20.08.2014, 17:51 | Сообщение # 524
Лидер «Свободы»
Свобода
Сообщений: 4438
Награды: 44
Репутация: [ 1340 ]

strelok200, если тебе нужен конкретный НПС, то в логике просто выдавай инфопорцию при переходе на схему с probe_stand. Думаю, это понятно. Если для всех НПС, то все немного по-другому.
Цитата strelok200 ()
get_state

Ну, если ты про state_manager, то да.
Предполагаю, что можно в state_manager:update() (файл - state_mgr.script) куда-то внутрь прописать проверку в роде:
Код
if self.st.target_state == "probe_stand"

Но есть идея по лучше - табличный элемент f в state_mgr_animations_list.script. Глянь:
[cut=punch]
Код
punch  = {    prop    = { maxidle = 5,
          sumidle = 2,
          rnd = 100 },
       into    = {    [0]    = {    "norm_facer_0_0", {f=xr_effects.actor_punch}, "norm_facer_0_1", {f=xr_effects.clearAbuse}},
          [1]    = {    "norm_facer_1_0", {f=xr_effects.actor_punch}, "norm_facer_1_1", {f=xr_effects.clearAbuse}},
          [2]    = {    "norm_facer_2_0", {f=xr_effects.actor_punch}, "norm_facer_2_1", {f=xr_effects.clearAbuse}},
          [3]    = {    "norm_facer_3_0", {f=xr_effects.actor_punch}, "norm_facer_3_1", {f=xr_effects.clearAbuse}},
          [4]    = {    "norm_facer_4_0", {f=xr_effects.actor_punch}, "norm_facer_4_1", {f=xr_effects.clearAbuse}},
          [8]    = {    "norm_facer_8_0", {f=xr_effects.actor_punch}, "norm_facer_8_1", {f=xr_effects.clearAbuse}},
          [9]    = {    "norm_facer_9_0", {f=xr_effects.actor_punch}, "norm_facer_9_1", {f=xr_effects.clearAbuse}},
          [10]= {    "norm_facer_10_0", {f=xr_effects.actor_punch}, "norm_facer_10_1", {f=xr_effects.clearAbuse}}},
       out  = nil,
       idle    = nil,
       rnd  = nil},
[/cut]
Я думаю, ты понял, что такое
Код
{f=xr_effects.actor_punch}

и ему подобное.
Кстати, probe_stand тоже имеет свои функции:
[cut=probe_stand]
Код
probe_stand  = {    prop    = { maxidle = 0,
          sumidle = 0,
          rnd = 100 },
       into    = {    [0]    = {"metering_anomalys_0_draw_0", {f=xr_effects.get_best_detector}, "metering_anomalys_0_draw_1"} },
       out  = {    [0]    = {"metering_anomalys_0_hide_0", {f=xr_effects.hide_best_detector}, "metering_anomalys_0_hide_1"} },
       idle    = {    [0]    = "metering_anomalys_0_idle_0" },
       rnd  = {    [0]    = {"metering_anomalys_0_idle_1",
                               "metering_anomalys_0_idle_2",
                               "metering_anomalys_0_idle_3",
                               "metering_anomalys_0_idle_4",
                               "metering_anomalys_0_idle_5"} } },
[/cut]
Варианты:
1. В функции xr_effects.get_best_detector и xr_effects.hide_best_detector добавить свои строки. Но, вероятно, при вызове из других файлов, может вызвать ошибки. Да и вообще - как-то не эстетично.
2. Продублировать данные функции, дать им другие название, добавить в них свои строки, прописать вызов этих функций вместо оригинальных исключительно в state_mgr_animations_list.script.
3. Добавить в таблицу вызов своих функций отдельно:
[cut=Обновленный скрипт]
Код
probe_way  = {    prop    = { maxidle = 0,
          sumidle = 0,
          rnd = 100 },
       into    = {    [0]    = {"metering_anomalys_0_draw_0", {f=xr_effects.get_best_detector}, "metering_anomalys_0_draw_1", {f=скрипт.функция}, "metering_anomalys_0_idle_6"} },
       out  = {    [0]    = {"metering_anomalys_0_hide_0", {f=xr_effects.hide_best_detector}, "metering_anomalys_0_hide_1"} },
       idle    = {    [0]    = "metering_anomalys_0_idle_0" },
       rnd  = nil },
[/cut]



 
sergej5500Дата: Вс, 24.08.2014, 14:30 | Сообщение # 525
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый день. В СГМ 2.2 есть квест, в котором надо выполнить заполнение тайников Рассвета разным имуществом.

Отслеживает наполняемость тайников функция в sgm_caalbacks.

[cut=Функция]function on_update_inventory_box(box)
if check_seconds(2) and has_alife_info("pri_expiation_sin_2_start") and dont_has_alife_info("pri_expiation_sin_2_taynik_vse_zalogeni") and dont_has_alife_info("pri_expiation_sin_2_fail") then
if find_in_string(box:section(),"pri_monolith_taynik_1") and dont_has_alife_info("pri_expiation_sin_2_taynik_1_zalogen") then
if get_item_section_f_inventory_box(box,"ammo_gauss") and get_item_section_f_inventory_box(box,"medkit") and get_item_section_f_inventory_box(box,"bandage") and (get_item_section_f_inventory_box(box,"antirad") or get_item_section_f_inventory_box(box,"psy_complex")) and ((get_item_section_f_inventory_box(box,"wpn_ak74") and get_item_section_f_inventory_box(box,"ammo_5.45x")) or (get_item_section_f_inventory_box(box,"wpn_lr300") and get_item_section_f_inventory_box(box,"ammo_5.56x")) or (get_item_section_f_inventory_box(box,"wpn_spas12") and get_item_section_f_inventory_box(box,"ammo_12x"))) then
game_hide_menu()
give_info("pri_expiation_sin_2_taynik_1_zalogen")
end
elseif find_in_string(box:section(),"pri_monolith_taynik_2") and has_alife_info("pri_expiation_sin_2_taynik_1_zalogen") and dont_has_alife_info("pri_expiation_sin_2_taynik_2_zalogen") then
if get_item_section_f_inventory_box(box,"ammo_gauss") and get_item_section_f_inventory_box(box,"medkit") and get_item_section_f_inventory_box(box,"bandage") and (get_item_section_f_inventory_box(box,"antirad") or get_item_section_f_inventory_box(box,"psy_complex")) and ((get_item_section_f_inventory_box(box,"wpn_ak74") and get_item_section_f_inventory_box(box,"ammo_5.45x")) or (get_item_section_f_inventory_box(box,"wpn_lr300") and get_item_section_f_inventory_box(box,"ammo_5.56x")) or (get_item_section_f_inventory_box(box,"wpn_spas12") and get_item_section_f_inventory_box(box,"ammo_12x"))) then
game_hide_menu()
give_info("pri_expiation_sin_2_taynik_2_zalogen")
end
elseif find_in_string(box:section(),"pri_monolith_taynik_3") and has_alife_info("pri_expiation_sin_2_taynik_2_zalogen") and dont_has_alife_info("pri_expiation_sin_2_taynik_3_zalogen") then
if get_item_section_f_inventory_box(box,"ammo_gauss") and get_item_section_f_inventory_box(box,"medkit") and get_item_section_f_inventory_box(box,"bandage") and (get_item_section_f_inventory_box(box,"antirad") or get_item_section_f_inventory_box(box,"psy_complex")) and ((get_item_section_f_inventory_box(box,"wpn_ak74") and get_item_section_f_inventory_box(box,"ammo_5.45x")) or (get_item_section_f_inventory_box(box,"wpn_lr300") and get_item_section_f_inventory_box(box,"ammo_5.56x")) or (get_item_section_f_inventory_box(box,"wpn_spas12") and get_item_section_f_inventory_box(box,"ammo_12x"))) then
game_hide_menu()
give_info("pri_expiation_sin_2_taynik_3_zalogen")
end
elseif find_in_string(box:section(),"pri_monolith_taynik_4") and has_alife_info("pri_expiation_sin_2_taynik_3_zalogen") and dont_has_alife_info("pri_expiation_sin_2_taynik_4_zalogen") then
if get_item_section_f_inventory_box(box,"ammo_gauss") and get_item_section_f_inventory_box(box,"medkit") and get_item_section_f_inventory_box(box,"bandage") and (get_item_section_f_inventory_box(box,"antirad") or get_item_section_f_inventory_box(box,"psy_complex")) and ((get_item_section_f_inventory_box(box,"wpn_ak74") and get_item_section_f_inventory_box(box,"ammo_5.45x")) or (get_item_section_f_inventory_box(box,"wpn_lr300") and get_item_section_f_inventory_box(box,"ammo_5.56x")) or (get_item_section_f_inventory_box(box,"wpn_spas12") and get_item_section_f_inventory_box(box,"ammo_12x"))) then
game_hide_menu()
give_info("pri_expiation_sin_2_taynik_4_zalogen")
end
elseif find_in_string(box:section(),"pri_monolith_taynik_5") and has_alife_info("pri_expiation_sin_2_taynik_4_zalogen") and dont_has_alife_info("pri_expiation_sin_2_taynik_5_zalogen") then
if get_item_section_f_inventory_box(box,"ammo_gauss") and get_item_section_f_inventory_box(box,"medkit") and get_item_section_f_inventory_box(box,"bandage") and (get_item_section_f_inventory_box(box,"antirad") or get_item_section_f_inventory_box(box,"psy_complex")) and ((get_item_section_f_inventory_box(box,"wpn_ak74") and get_item_section_f_inventory_box(box,"ammo_5.45x")) or (get_item_section_f_inventory_box(box,"wpn_lr300") and get_item_section_f_inventory_box(box,"ammo_5.56x")) or (get_item_section_f_inventory_box(box,"wpn_spas12") and get_item_section_f_inventory_box(box,"ammo_12x"))) then
game_hide_menu()
give_info("pri_expiation_sin_2_taynik_5_zalogen")
end
elseif find_in_string(box:section(),"pri_monolith_taynik_6") and has_alife_info("pri_expiation_sin_2_taynik_5_zalogen") and dont_has_alife_info("pri_expiation_sin_2_taynik_6_zalogen") then
if get_item_section_f_inventory_box(box,"ammo_gauss") and get_item_section_f_inventory_box(box,"medkit") and get_item_section_f_inventory_box(box,"bandage") and (get_item_section_f_inventory_box(box,"antirad") or get_item_section_f_inventory_box(box,"psy_complex")) and ((get_item_section_f_inventory_box(box,"wpn_ak74") and get_item_section_f_inventory_box(box,"ammo_5.45x")) or (get_item_section_f_inventory_box(box,"wpn_lr300") and get_item_section_f_inventory_box(box,"ammo_5.56x")) or (get_item_section_f_inventory_box(box,"wpn_spas12") and get_item_section_f_inventory_box(box,"ammo_12x"))) then
game_hide_menu()
give_info("pri_expiation_sin_2_taynik_6_zalogen")
end
elseif find_in_string(box:section(),"pri_monolith_taynik_7") and has_alife_info("pri_expiation_sin_2_taynik_6_zalogen") and dont_has_alife_info("pri_expiation_sin_2_taynik_7_zalogen") then
if get_item_section_f_inventory_box(box,"ammo_gauss") and get_item_section_f_inventory_box(box,"medkit") and get_item_section_f_inventory_box(box,"bandage") and (get_item_section_f_inventory_box(box,"antirad") or get_item_section_f_inventory_box(box,"psy_complex")) and ((get_item_section_f_inventory_box(box,"wpn_ak74") and get_item_section_f_inventory_box(box,"ammo_5.45x")) or (get_item_section_f_inventory_box(box,"wpn_lr300") and get_item_section_f_inventory_box(box,"ammo_5.56x")) or (get_item_section_f_inventory_box(box,"wpn_spas12") and get_item_section_f_inventory_box(box,"ammo_12x"))) then
game_hide_menu()
give_info("pri_expiation_sin_2_taynik_7_zalogen")
end
elseif find_in_string(box:section(),"pri_monolith_taynik_8") and has_alife_info("pri_expiation_sin_2_taynik_7_zalogen") and dont_has_alife_info("pri_expiation_sin_2_taynik_8_zalogen") then
if get_item_section_f_inventory_box(box,"ammo_gauss") and get_item_section_f_inventory_box(box,"medkit") and get_item_section_f_inventory_box(box,"bandage") and (get_item_section_f_inventory_box(box,"antirad") or get_item_section_f_inventory_box(box,"psy_complex")) and ((get_item_section_f_inventory_box(box,"wpn_ak74") and get_item_section_f_inventory_box(box,"ammo_5.45x")) or (get_item_section_f_inventory_box(box,"wpn_lr300") and get_item_section_f_inventory_box(box,"ammo_5.56x")) or (get_item_section_f_inventory_box(box,"wpn_spas12") and get_item_section_f_inventory_box(box,"ammo_12x"))) then
game_hide_menu()
give_info("pri_expiation_sin_2_taynik_8_zalogen")
end
elseif find_in_string(box:section(),"pri_monolith_taynik_9") and has_alife_info("pri_expiation_sin_2_taynik_8_zalogen") and dont_has_alife_info("pri_expiation_sin_2_taynik_9_zalogen") then
if get_item_section_f_inventory_box(box,"ammo_gauss") and get_item_section_f_inventory_box(box,"medkit") and get_item_section_f_inventory_box(box,"bandage") and (get_item_section_f_inventory_box(box,"antirad") or get_item_section_f_inventory_box(box,"psy_complex")) and ((get_item_section_f_inventory_box(box,"wpn_ak74") and get_item_section_f_inventory_box(box,"ammo_5.45x")) or (get_item_section_f_inventory_box(box,"wpn_lr300") and get_item_section_f_inventory_box(box,"ammo_5.56x")) or (get_item_section_f_inventory_box(box,"wpn_spas12") and get_item_section_f_inventory_box(box,"ammo_12x"))) then
game_hide_menu()
give_info("pri_expiation_sin_2_reward,pri_expiation_sin_2_reload,pri_expiation_sin_2_taynik_9_zalogen")
end
end
end
if check_seconds(2) and has_alife_info("jup_b206_rasvet_prior_quest_ready_to_past") and dont_has_alife_info("jup_b206_rasvet_all_tainiki_zalogeny") and dont_has_alife_info("jup_b206_rasvet_prior_quest_fail") then
if find_in_string(box:section(),"jup_rasvet_spez_taynik_1") and not has_alife_info("jup_rasvet_spez_taynik_1_zalogen") then
if get_item_section_f_inventory_box(box,"detector_elite") and get_item_section_f_inventory_box(box,"medkit") and get_item_section_f_inventory_box(box,"bandage") and (get_item_section_f_inventory_box(box,"antirad") or get_item_section_f_inventory_box(box,"psy_complex")) and get_item_section_f_inventory_box(box,"cs_heavy_outfit") and ((get_item_section_f_inventory_box(box,"wpn_abakan") and get_item_section_f_inventory_box(box,"ammo_5.45x")) or (get_item_section_f_inventory_box(box,"wpn_l85") and get_item_section_f_inventory_box(box,"ammo_5.56x")) or (get_item_section_f_inventory_box(box,"wpn_wincheaster1300") and get_item_section_f_inventory_box(box,"ammo_12x"))) then
game_hide_menu()
give_info("jup_rasvet_spez_taynik_1_zalogen")
end
elseif find_in_string(box:section(),"jup_rasvet_spez_taynik_2") and not has_alife_info("jup_rasvet_spez_taynik_2_zalogen") then
if get_item_section_f_inventory_box(box,"detector_elite") and get_item_section_f_inventory_box(box,"medkit") and get_item_section_f_inventory_box(box,"bandage") and (get_item_section_f_inventory_box(box,"antirad") or get_item_section_f_inventory_box(box,"psy_complex")) and get_item_section_f_inventory_box(box,"cs_heavy_outfit") and ((get_item_section_f_inventory_box(box,"wpn_abakan") and get_item_section_f_inventory_box(box,"ammo_5.45x")) or (get_item_section_f_inventory_box(box,"wpn_l85") and get_item_section_f_inventory_box(box,"ammo_5.56x")) or (get_item_section_f_inventory_box(box,"wpn_wincheaster1300") and get_item_section_f_inventory_box(box,"ammo_12x"))) then
game_hide_menu()
give_info("jup_rasvet_spez_taynik_2_zalogen")
end
elseif find_in_string(box:section(),"jup_rasvet_spez_taynik_3") and not has_alife_info("jup_rasvet_spez_taynik_3_zalogen") then
if get_item_section_f_inventory_box(box,"detector_elite") and get_item_section_f_inventory_box(box,"medkit") and get_item_section_f_inventory_box(box,"bandage") and (get_item_section_f_inventory_box(box,"antirad") or get_item_section_f_inventory_box(box,"psy_complex")) and get_item_section_f_inventory_box(box,"cs_heavy_outfit") and ((get_item_section_f_inventory_box(box,"wpn_abakan") and get_item_section_f_inventory_box(box,"ammo_5.45x")) or (get_item_section_f_inventory_box(box,"wpn_l85") and get_item_section_f_inventory_box(box,"ammo_5.56x")) or (get_item_section_f_inventory_box(box,"wpn_wincheaster1300") and get_item_section_f_inventory_box(box,"ammo_12x"))) then
game_hide_menu()
give_info("jup_rasvet_spez_taynik_3_zalogen")
end
elseif find_in_string(box:section(),"jup_rasvet_spez_taynik_4") and not has_alife_info("jup_rasvet_spez_taynik_4_zalogen") then
if get_item_section_f_inventory_box(box,"detector_elite") and get_item_section_f_inventory_box(box,"medkit") and get_item_section_f_inventory_box(box,"bandage") and (get_item_section_f_inventory_box(box,"antirad") or get_item_section_f_inventory_box(box,"psy_complex")) and get_item_section_f_inventory_box(box,"cs_heavy_outfit") and ((get_item_section_f_inventory_box(box,"wpn_abakan") and get_item_section_f_inventory_box(box,"ammo_5.45x")) or (get_item_section_f_inventory_box(box,"wpn_l85") and get_item_section_f_inventory_box(box,"ammo_5.56x")) or (get_item_section_f_inventory_box(box,"wpn_wincheaster1300") and get_item_section_f_inventory_box(box,"ammo_12x"))) then
game_hide_menu()
give_info("jup_rasvet_spez_taynik_4_zalogen")
end
elseif find_in_string(box:section(),"jup_rasvet_spez_taynik_5") and not has_alife_info("jup_rasvet_spez_taynik_5_zalogen") then
if get_item_section_f_inventory_box(box,"detector_elite") and get_item_section_f_inventory_box(box,"medkit") and get_item_section_f_inventory_box(box,"bandage") and (get_item_section_f_inventory_box(box,"antirad") or get_item_section_f_inventory_box(box,"psy_complex")) and get_item_section_f_inventory_box(box,"cs_heavy_outfit") and ((get_item_section_f_inventory_box(box,"wpn_abakan") and get_item_section_f_inventory_box(box,"ammo_5.45x")) or (get_item_section_f_inventory_box(box,"wpn_l85") and get_item_section_f_inventory_box(box,"ammo_5.56x")) or (get_item_section_f_inventory_box(box,"wpn_wincheaster1300") and get_item_section_f_inventory_box(box,"ammo_12x"))) then
game_hide_menu()
give_info("jup_rasvet_spez_taynik_5_zalogen")
end
end
end
end[/cut]

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

Попробовал запустить проверку из логики самого заполняемого тайника.

[cut=Логика][logic]
active = ph_idle@pustoy

[ph_idle@pustoy]
nonscript_usable = true
tips = st_shron_check_descr
on_info = {=dist_to_actor_le(3)} %=jup_rasvet_spez_taynik_1_binder%
on_info2 = {+jup_rasvet_spez_taynik_1_zalogen} ph_idle@ustanovlen

[ph_idle@ustanovlen]
nonscript_usable = false
tips = st_shron_installed_descr
[/cut]

[cut=Функция]function jup_rasvet_spez_taynik_1_binder(actor,npc)
if find_in_string(box:section(),"jup_rasvet_spez_taynik_1") and not has_alife_info("jup_rasvet_spez_taynik_1_zalogen") then
if get_item_section_f_inventory_box(box,"detector_elite") and get_item_section_f_inventory_box(box,"medkit")
and get_item_section_f_inventory_box(box,"bandage") and (get_item_section_f_inventory_box(box,"antirad") or get_item_section_f_inventory_box(box,"psy_complex"))
and get_item_section_f_inventory_box(box,"cs_heavy_outfit") and ((get_item_section_f_inventory_box(box,"wpn_abakan")
and get_item_section_f_inventory_box(box,"ammo_5.45x")) or (get_item_section_f_inventory_box(box,"wpn_l85")
and get_item_section_f_inventory_box(box,"ammo_5.56x")) or (get_item_section_f_inventory_box(box,"wpn_wincheaster1300")
and get_item_section_f_inventory_box(box,"ammo_12x"))) then game_hide_menu() give_info("jup_rasvet_spez_taynik_1_zalogen")
end
end
end[/cut]

При активации функции проверки имею стабильный вылет.

[cut=Вылет]FATAL ERROR

[error]Expression : !m_error_code
[error]Function : raii_guard::~raii_guard
[error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
[error]Line : 748
[error]Description : ...les 1\Зов Припяти\gamedata\scripts\xr_effects.script:5572: attempt to index global 'box' (a nil value)


stack trace:[/cut]

Как можно переделать фукнкцию или логику, чтобы не вылетало?
 
Поиск: