Модостроение. Редактирование и создание скриптов
|
|
denis2000 | Дата: Пн, 10.10.2011, 21:17 | Сообщение # 1 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Редактирование и создание скриптов Редактирование и создание скриптов на языке 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 по ссылке из шапки и соседнюю тему "Курс молодого бойца", возможно Ваш вопрос уже рассматривался.
Если произошел вылет - выкладываем лог! Вопрос ставим четко, не забываем указывать версию игры, установленные моды их версии, установленные фиксы модов и подробно ваши правки. Помните чем подробнее вопрос, тем точнее ответ.
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
a4927860 | Дата: Сб, 21.06.2014, 16:17 | Сообщение # 511 |
Новичок
Пользователи
Сообщений: 81
| 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]
|
|
|
Эти 0 пользователя(ей) поблагодарили a4927860 за это полезное сообщение: |
|
|
makdm | Дата: Сб, 21.06.2014, 21:04 | Сообщение # 512 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата 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
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
a4927860 | Дата: Вс, 22.06.2014, 14:05 | Сообщение # 513 |
Новичок
Пользователи
Сообщений: 81
| Добрый день, извиняюсь что пишу так часто, но сегодня у меня последний день отпуска и хотелось бы закончить уже по быстрее.
у меня есть вот такая конструкция [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 |
|
|
Эти 0 пользователя(ей) поблагодарили a4927860 за это полезное сообщение: |
|
|
FantomICW | Дата: Вс, 22.06.2014, 16:11 | Сообщение # 514 |
Лидер «Свободы»
Свобода
Сообщений: 4438
| 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)
|
|
|
Эти 0 пользователя(ей) поблагодарили FantomICW за это полезное сообщение: |
|
|
a4927860 | Дата: Вс, 22.06.2014, 16:31 | Сообщение # 515 |
Новичок
Пользователи
Сообщений: 81
| 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 |
|
|
Эти 0 пользователя(ей) поблагодарили a4927860 за это полезное сообщение: |
|
|
FantomICW | Дата: Вс, 22.06.2014, 16:50 | Сообщение # 516 |
Лидер «Свободы»
Свобода
Сообщений: 4438
| 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)
|
|
|
Эти 0 пользователя(ей) поблагодарили FantomICW за это полезное сообщение: |
|
|
a4927860 | Дата: Пн, 23.06.2014, 14:50 | Сообщение # 517 |
Новичок
Пользователи
Сообщений: 81
| Доделал и выложил
Сообщение отредактировал a4927860 - Пн, 23.06.2014, 14:55 |
|
|
Эти 0 пользователя(ей) поблагодарили a4927860 за это полезное сообщение: |
|
|
sergej5500 | Дата: Сб, 05.07.2014, 22:34 | Сообщение # 518 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый вечер. Хочу уточнить такой момент.
[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. Если надо поправить ф-ию, чтобы она вылетала из-за отсутствующих сквадов, то как это правильно сделать?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
denis2000 | Дата: Сб, 05.07.2014, 23:20 | Сообщение # 519 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| 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]
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
strelok200 | Дата: Вс, 03.08.2014, 00:34 | Сообщение # 520 |
Бывалый
Свобода
Сообщений: 126
| Приветствую. Возможно ли как-нибудь отследить активацию аномалии (при попадании в нее болта, а не при использовании артефакта)
Нет. denis2000
|
|
|
Эти 0 пользователя(ей) поблагодарили strelok200 за это полезное сообщение: |
|
|
sergej5500 | Дата: Вс, 17.08.2014, 17:46 | Сообщение # 521 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Всем привет. Возникла небольшая проблема. Для передачи игроком квестовых предметов неписям я применяю функцию типа.
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] Можно ли расширить эту функцию или написать новую для удаления нескольких одинаковых предметов? Как это правильно сделать?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
denis2000 | Дата: Вс, 17.08.2014, 19:29 | Сообщение # 522 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| 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)
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
strelok200 | Дата: Ср, 20.08.2014, 10:52 | Сообщение # 523 |
Бывалый
Свобода
Сообщений: 126
| Приветствую. Мне необходимо записать значение глобальной переменной в сейв 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 выполнялись определенные действия
|
|
|
Эти 0 пользователя(ей) поблагодарили strelok200 за это полезное сообщение: |
|
|
FantomICW | Дата: Ср, 20.08.2014, 17:51 | Сообщение # 524 |
Лидер «Свободы»
Свобода
Сообщений: 4438
| 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]
|
|
|
Эти 0 пользователя(ей) поблагодарили FantomICW за это полезное сообщение: |
|
|
sergej5500 | Дата: Вс, 24.08.2014, 14:30 | Сообщение # 525 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый день. В СГМ 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]
Как можно переделать фукнкцию или логику, чтобы не вылетало?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
|