Модостроение. Редактирование и создание скриптов
|
|
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 за это полезное сообщение: |
|
|
sergej5500 | Дата: Пн, 30.03.2015, 13:27 | Сообщение # 601 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый день.
Имеются две функции в xr_condition. Измеряют расстояния от актора до точек в way_*** [cut=Функции] function distance_from_actor_to_point_ge(actor, npc, p) local patrol_way = patrol(p[2]) local point_id = 0 if p[3] then point_id = tonumber(p[3]) end if actor then return actor():distance_to_sqr(patrol_way:point(point_id)) >= p[1]*p[1] end return false end
function distance_from_actor_to_point_le(actor, npc, p) local patrol_way = patrol(p[2]) local point_id = 0 if p[3] then point_id = tonumber(p[3]) end if actor then return actor():distance_to_sqr(patrol_way:point(point_id)) < p[1]*p[1] end return false end[/cut]
[cut=Рестриктор]
[sr_idle@task1] on_info = {=distance_to_smart_ge(zat_stalker_base_smart:330)} sr_idle@task2 %=zat_b103_lost_merc_curjer_info_sms_1% on_info2 = {+zat_b103_merc_fight} sr_idle@end on_info3 = {+zat_b103_merc_storyline_done} sr_idle@end
[sr_idle@task2] on_info = {=distance_from_actor_to_point_le(zat_b103_lost_merc_curjer_1_rukzak_1:150)} sr_idle@task3 %=zat_b103_lost_merc_curjer_1_squad_spawn% on_info2 = {=distance_from_actor_to_point_le(zat_b103_lost_merc_curjer_1_rukzak_2:150)} sr_idle@task3 %=zat_b103_lost_merc_curjer_1_squad_spawn% on_info3 = {=distance_from_actor_to_point_le(zat_b103_lost_merc_curjer_1_rukzak_3:150)} sr_idle@task3 %=zat_b103_lost_merc_curjer_1_squad_spawn% on_info4 = {+zat_b103_merc_fight} sr_idle@end %=zat_b103_lost_merc_curjer_quests_delete1% on_info5 = {+zat_b103_merc_storyline_done} sr_idle@end %=zat_b103_lost_merc_curjer_quests_delete1%
[sr_idle@task3] on_info = {=actor_has_item(zat_b103_lost_merc_curjer_1_pda)} sr_idle@task4 %+zat_b103_lost_merc_curjer_1% on_info2 = {+zat_b103_merc_fight} sr_idle@end %=zat_b103_lost_merc_curjer_quests_delete1% on_info3 = {+zat_b103_merc_storyline_done} sr_idle@end %=zat_b103_lost_merc_curjer_quests_delete1%[/cut]
При удалении от смарта Скадовска приходит СМС и спавнятся квестовые объекты. Но на вторую секцию рестриктор принципиально не переходит. Если после прихода СМС сделать сейв и загрузиться с него, то придет 2-я СМС и отреспится 2-й комплект квестовых предметов.
Вопрос: рабочие ли функции?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
makdm | Дата: Пн, 30.03.2015, 16:21 | Сообщение # 602 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата sergej5500 ( ) рабочие ли функции? Функции не рабочие. Измеряться должен квадрат расстояния между точками на карте. А в вашем случае это не происходит.
Вместо
actor():distance_to_sqr(patrol_way:point(point_id)) >= p[1]*p[1]
пишем
actor:position():distance_to_sqr(patrol_way:point(point_id)) >= p[1]*p[1]
Аналогично во второй функции.
Кроме того у вас перепутаны аргументы.
Там где указано p[2] нужно указать p[1], и наоборот, там где p[1] указать p[2]
Терпение...... И все получится!
Сообщение отредактировал makdm - Пн, 30.03.2015, 16:24 |
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
sergej5500 | Дата: Пн, 30.03.2015, 23:25 | Сообщение # 603 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый вечер. Возникли такие вопросы.
Имеется смарт-террайн. Рядом со смартом имеется спальное место для игрока.
При помощи какой функции можно проверить такие вещи.
1. Свободен ли смарт или занят сквадами? 2. Есть ли среди сквадов, занимающих смарт, сквады, враждебные игроку?
Проверка запускается из логики спального места.
Есть идея переделать логику спальных мест. Если рядом никого, или неподалеку враги, то спать нельзя.
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
denis2000 | Дата: Вт, 31.03.2015, 13:01 | Сообщение # 604 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Цитата sergej5500 ( ) Свободен ли смарт или занят сквадами? Функция без "защиты от дурака": Код function is_smart_empty(actor, npc, p) return sim_board.get_sim_board():get_smart_population(sim_board.get_sim_board().smarts_by_names[p[1]]) > 0 end
Цитата sergej5500 ( ) Есть ли среди сквадов, занимающих смарт, сквады, враждебные игроку? Что-то типа такой функции: Код function is_smart_enemy_to_actor(actor, npc, p) local sim = sim_board.get_sim_board() for k,v in pairs(sim.smarts[sim:get_smart_by_name(p[1]).id].squads) do if k~=nil then if game_relations.check_all_squad_members(v, "enemy") then return true end end end return false end
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
sergej5500 | Дата: Вс, 12.04.2015, 21:41 | Сообщение # 605 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый вечер.
В своей сборке я переделал квест на 400 зомби из СГМ. Эти зомби теперь спавнятся как сквады.
[cut=Сквады]
[freeplay_zombied_1_squad]:online_offline_group faction = zombied npc_random = freeplay_zombied_1, freeplay_zombied_2, freeplay_zombied_3, freeplay_zombied_13_gunner npc_in_squad = 2, 4
[freeplay_zombied_2_squad]:online_offline_group faction = zombied npc_random = freeplay_zombied_4, freeplay_zombied_5, freeplay_zombied_6, freeplay_zombied_13_gunner npc_in_squad = 2, 4
[freeplay_zombied_3_squad]:online_offline_group faction = zombied npc_random = freeplay_zombied_7, freeplay_zombied_8, freeplay_zombied_9, freeplay_zombied_13_gunner npc_in_squad = 2, 4
[freeplay_zombied_4_squad]:online_offline_group faction = zombied npc_random = freeplay_zombied_10, freeplay_zombied_11, freeplay_zombied_12, freeplay_zombied_13_gunner npc_in_squad = 2, 4[/cut]
Их спавном управляет рестриктор.
[cut=Рабочая секция логики][sr_idle@control_sim_1] on_info = {=distance_to_smart_ge(jup_sim_1:250)} sr_idle@random_sim_1, sr_idle@control_sim_2
[sr_idle@random_sim_1] on_info = {~25} sr_idle@control_sim_2 %=jup_freeplay_zombied_squad_spawn =create_squad(freeplay_zombied_1_squad:jup_sim_1)%, {~25} sr_idle@control_sim_2 %=jup_freeplay_zombied_squad_spawn =create_squad(freeplay_zombied_2_squad:jup_sim_1)%, {~25} sr_idle@control_sim_2 %=jup_freeplay_zombied_squad_spawn =create_squad(freeplay_zombied_3_squad:jup_sim_1)%, sr_idle@control_sim_2 %=jup_freeplay_zombied_squad_spawn =create_squad(freeplay_zombied_4_squad:jup_sim_1)%[/cut]
Если дистанция до смарта больше 250 метров, то с определенной вероятностью спавним там сквад зомби.
Схема работает. Квест выполняется. Но есть одно но. Для достаточно быстрого выполнения задания нужно спавнить зомби с запасом. Неубитые остаются на локациях и создают проблемы. Тормозят игру. Нападают на дружественных НПС.
Нужно после окончания квеста убрать со всех локаций сквады с именами: freeplay_zombied_1_squad, freeplay_zombied_2_squad, freeplay_zombied_3_squad и freeplay_zombied_4_squad.
Какой функцией можно воспользоваться? Или как её составить?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
makdm | Дата: Пн, 13.04.2015, 10:19 | Сообщение # 606 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата sergej5500 ( ) Какой функцией можно воспользоваться? Самая простая
Код function clear_squads( actor, npc ) local board = sim_board.get_sim_board() for i = 1,65534 do local squad = alife():object( i ) if squad and squad:clsid() == 94 and string.find( squad:section_name(), "freeplay_zombied" ) ~= nil then board:remove_squad( squad ) end end end
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
sergej5500 | Дата: Пн, 13.04.2015, 11:15 | Сообщение # 607 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| makdm,
Спасибо за помощь. Возник вопрос по функции.
Что дает запись squad and squad:clsid() == 94 и почему число равно 94 а не 95?
Почему функцию нельзя написать в таком виде: if squad and squad:clsid() == 94 and string.find( squad:section_name(), "freeplay_zombied" ) ~= nil then
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
makdm | Дата: Пн, 13.04.2015, 12:11 | Сообщение # 608 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата sergej5500 ( ) Что дает запись squad and squad:clsid() == 94 и почему число равно 94 а не 95? Запись проверяет имеется ли серверный объект с данным ID и какой класс присвоил объекту движок. Если класс 94, значит это объект сквад.
Терпение...... И все получится!
|
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
sergej5500 | Дата: Сб, 18.04.2015, 21:39 | Сообщение # 609 |
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
| Добрый вечер. Решил переделать систему заказов у Шустрого. Чтобы он мог приносить одну и ту же вещь много раз.
[cut=Контроль денег для задатка.] function zat_b51_has_prepay(actor, npc) if dont_has_alife_info("zat_b51_order_refused") then if has_alife_info("zat_b51_processing_category_1") then return db.actor:money()>=1000 elseif has_alife_info("zat_b51_processing_category_2") then return db.actor:money()>=2000 elseif has_alife_info("zat_b51_processing_category_3") then return db.actor:money()>=5000 elseif has_alife_info("zat_b51_processing_category_4") then return db.actor:money()>=15000 elseif has_alife_info("zat_b51_processing_category_5") then return db.actor:money()>=10000 elseif has_alife_info("zat_b51_processing_category_6") then return db.actor:money()>=30000 else return db.actor:money()>=80000 end else if has_alife_info("zat_b51_processing_category_1") then return db.actor:money()>=3000 elseif has_alife_info("zat_b51_processing_category_2") then return db.actor:money()>=5000 elseif has_alife_info("zat_b51_processing_category_3") then return db.actor:money()>=8000 elseif has_alife_info("zat_b51_processing_category_4") then return db.actor:money()>=20000 elseif has_alife_info("zat_b51_processing_category_5") then return db.actor:money()>=16000 elseif has_alife_info("zat_b51_processing_category_6") then return db.actor:money()>=40000 else return db.actor:money()>=120000 end end end function zat_b51_hasnt_prepay(actor, npc) if dont_has_alife_info("zat_b51_order_refused") then if has_alife_info("zat_b51_processing_category_1") then return db.actor:money()<1000 elseif has_alife_info("zat_b51_processing_category_2") then return db.actor:money()<2000 elseif has_alife_info("zat_b51_processing_category_3") then return db.actor:money()<5000 elseif has_alife_info("zat_b51_processing_category_4") then return db.actor:money()<15000 elseif has_alife_info("zat_b51_processing_category_5") then return db.actor:money()<10000 elseif has_alife_info("zat_b51_processing_category_6") then return db.actor:money()<30000 else return db.actor:money()<80000 end else if has_alife_info("zat_b51_processing_category_1") then return db.actor:money()<3000 elseif has_alife_info("zat_b51_processing_category_2") then return db.actor:money()<5000 elseif has_alife_info("zat_b51_processing_category_3") then return db.actor:money()<8000 elseif has_alife_info("zat_b51_processing_category_4") then return db.actor:money()<20000 elseif has_alife_info("zat_b51_processing_category_5") then return db.actor:money()<16000 elseif has_alife_info("zat_b51_processing_category_6") then return db.actor:money()<40000 else return db.actor:money()<120000 end end end[/cut]
[cut=Передача задатка] function zat_b51_give_prepay(actor, npc) if dont_has_alife_info("zat_b51_order_refused") then if has_alife_info("zat_b51_processing_category_1") then dialogs.relocate_money(npc,1000,"out") elseif has_alife_info("zat_b51_processing_category_2") then dialogs.relocate_money(npc,2000,"out") elseif has_alife_info("zat_b51_processing_category_3") then dialogs.relocate_money(npc,5000,"out") elseif has_alife_info("zat_b51_processing_category_4") then dialogs.relocate_money(npc,15000,"out") elseif has_alife_info("zat_b51_processing_category_5") then dialogs.relocate_money(npc,10000,"out") elseif has_alife_info("zat_b51_processing_category_6") then dialogs.relocate_money(npc,30000,"out") else dialogs.relocate_money(npc,80000,"out") end else if has_alife_info("zat_b51_processing_category_1") then dialogs.relocate_money(npc,3000,"out") elseif has_alife_info("zat_b51_processing_category_2") then dialogs.relocate_money(npc,5000,"out") elseif has_alife_info("zat_b51_processing_category_3") then dialogs.relocate_money(npc,8000,"out") elseif has_alife_info("zat_b51_processing_category_4") then dialogs.relocate_money(npc,20000,"out") elseif has_alife_info("zat_b51_processing_category_5") then dialogs.relocate_money(npc,16000,"out") elseif has_alife_info("zat_b51_processing_category_6") then dialogs.relocate_money(npc,40000,"out") else dialogs.relocate_money(npc,120000,"out") end end end[/cut]
[cut=Генерация заказа] function zat_b51_randomize_item(actor, npc) local zat_b51_processing_category_1=math.random(1,3) local zat_b51_processing_category_2=math.random(1,3) local zat_b51_processing_category_3=math.random(1,3) local zat_b51_processing_category_4=math.random(1,3) local zat_b51_processing_category_5=math.random(1,2) local zat_b51_processing_category_6=math.random(1,2) local zat_b51_processing_category_7=math.random(1,3) if has_alife_info("zat_b51_processing_category_1") then if zat_b51_processing_category_1==1 then give_info("zat_b51_ordered_item_1_1") elseif zat_b51_processing_category_1==2 then give_info("zat_b51_ordered_item_1_2") else give_info("zat_b51_ordered_item_1_3") end elseif has_alife_info("zat_b51_processing_category_2") then if zat_b51_processing_category_2==1 then give_info("zat_b51_ordered_item_2_1") elseif zat_b51_processing_category_2==2 then give_info("zat_b51_ordered_item_2_2") else give_info("zat_b51_ordered_item_2_3") end elseif has_alife_info("zat_b51_processing_category_3") then if zat_b51_processing_category_3==1 then give_info("zat_b51_ordered_item_3_1") elseif zat_b51_processing_category_3==2 then give_info("zat_b51_ordered_item_3_2") else give_info("zat_b51_ordered_item_3_3") end elseif has_alife_info("zat_b51_processing_category_4") then if zat_b51_processing_category_4==1 then give_info("zat_b51_ordered_item_4_1") elseif zat_b51_processing_category_4==2 then give_info("zat_b51_ordered_item_4_2") else give_info("zat_b51_ordered_item_4_3") end elseif has_alife_info("zat_b51_processing_category_5") then if zat_b51_processing_category_5==1 then give_info("zat_b51_ordered_item_5_1") else give_info("zat_b51_ordered_item_5_2") end elseif has_alife_info("zat_b51_processing_category_6") then if zat_b51_processing_category_6==1 then give_info("zat_b51_ordered_item_6_1") else give_info("zat_b51_ordered_item_6_2") end else if zat_b51_processing_category_7==1 then give_info("zat_b51_ordered_item_7_1") elseif zat_b51_processing_category_7==2 then give_info("zat_b51_ordered_item_7_2") else give_info("zat_b51_ordered_item_7_3") end end end[/cut]
[cut=Контроль денег для выкупа заказа] function zat_b51_has_item_cost(actor, npc) if dont_has_alife_info("zat_b51_order_refused") then if has_alife_info("zat_b51_processing_category_1") then return db.actor:money()>=9000 elseif has_alife_info("zat_b51_processing_category_2") then return db.actor:money()>=20000 elseif has_alife_info("zat_b51_processing_category_3") then return db.actor:money()>=40000 elseif has_alife_info("zat_b51_processing_category_4") then return db.actor:money()>=129000 elseif has_alife_info("zat_b51_processing_category_5") then return db.actor:money()>=70000 elseif has_alife_info("zat_b51_processing_category_6") then return db.actor:money()>=170000 else return db.actor:money()>=520000 end else if has_alife_info("zat_b51_processing_category_1") then return db.actor:money()>=12000 elseif has_alife_info("zat_b51_processing_category_2") then return db.actor:money()>=30000 elseif has_alife_info("zat_b51_processing_category_3") then return db.actor:money()>=52000 elseif has_alife_info("zat_b51_processing_category_4") then return db.actor:money()>=160000 elseif has_alife_info("zat_b51_processing_category_5") then return db.actor:money()>=84000 elseif has_alife_info("zat_b51_processing_category_6") then return db.actor:money()>=220000 else return db.actor:money()>=800000 end end end
function zat_b51_hasnt_item_cost(actor, npc) if dont_has_alife_info("zat_b51_order_refused") then if has_alife_info("zat_b51_processing_category_1") then return db.actor:money()<9000 elseif has_alife_info("zat_b51_processing_category_2") then return db.actor:money()<20000 elseif has_alife_info("zat_b51_processing_category_3") then return db.actor:money()<40000 elseif has_alife_info("zat_b51_processing_category_4") then return db.actor:money()<129000 elseif has_alife_info("zat_b51_processing_category_5") then return db.actor:money()<70000 elseif has_alife_info("zat_b51_processing_category_6") then return db.actor:money()<170000 else return db.actor:money()<520000 end else if has_alife_info("zat_b51_processing_category_1") then return db.actor:money()<12000 elseif has_alife_info("zat_b51_processing_category_2") then return db.actor:money()<30000 elseif has_alife_info("zat_b51_processing_category_3") then return db.actor:money()<52000 elseif has_alife_info("zat_b51_processing_category_4") then return db.actor:money()<160000 elseif has_alife_info("zat_b51_processing_category_5") then return db.actor:money()<84000 elseif has_alife_info("zat_b51_processing_category_6") then return db.actor:money()<220000 else return db.actor:money()<800000 end end end[/cut]
[cut=Передача денег] function zat_b51_buy_item(actor, npc) if dont_has_alife_info("zat_b51_order_refused") then if has_alife_info("zat_b51_processing_category_1") then dialogs.relocate_money(npc,9000,"out") elseif has_alife_info("zat_b51_processing_category_2") then dialogs.relocate_money(npc,20000,"out") elseif has_alife_info("zat_b51_processing_category_3") then dialogs.relocate_money(npc,40000,"out") elseif has_alife_info("zat_b51_processing_category_4") then dialogs.relocate_money(npc,129000,"out") elseif has_alife_info("zat_b51_processing_category_5") then dialogs.relocate_money(npc,70000,"out") elseif has_alife_info("zat_b51_processing_category_6") then dialogs.relocate_money(npc,170000,"out") else dialogs.relocate_money(npc,520000,"out") end else if has_alife_info("zat_b51_processing_category_1") then dialogs.relocate_money(npc,12000,"out") elseif has_alife_info("zat_b51_processing_category_2") then dialogs.relocate_money(npc,30000,"out") elseif has_alife_info("zat_b51_processing_category_3") then dialogs.relocate_money(npc,52000,"out") elseif has_alife_info("zat_b51_processing_category_4") then dialogs.relocate_money(npc,160000,"out") elseif has_alife_info("zat_b51_processing_category_5") then dialogs.relocate_money(npc,84000,"out") elseif has_alife_info("zat_b51_processing_category_6") then dialogs.relocate_money(npc,220000,"out") else dialogs.relocate_money(npc,800000,"out") end end end[/cut] [cut=Выдача заказа]
function zat_b51_actor_item(actor, npc) if has_alife_info("zat_b51_processing_category_1") then if has_alife_info("zat_b51_ordered_item_1_1") then give_reward("wpn_desert_eagle_nimble") elseif has_alife_info("zat_b51_ordered_item_1_2") then give_reward("wpn_sig220_nimble") else give_reward("wpn_usp_nimble") end elseif has_alife_info("zat_b51_processing_category_2") then if has_alife_info("zat_b51_ordered_item_2_1") then give_reward("wpn_mp5_nimble") elseif has_alife_info("zat_b51_ordered_item_2_2") then give_reward("wpn_spas12_nimble") else give_reward("wpn_protecta_nimble") end elseif has_alife_info("zat_b51_processing_category_3") then if has_alife_info("zat_b51_ordered_item_3_1") then give_reward("wpn_groza_nimble") elseif has_alife_info("zat_b51_ordered_item_3_2") then give_reward("wpn_g36_nimble") else give_reward("wpn_fn2000_nimble") end elseif has_alife_info("zat_b51_processing_category_4") then if has_alife_info("zat_b51_ordered_item_4_1") then give_reward("wpn_vintorez_nimble") elseif has_alife_info("zat_b51_ordered_item_4_2") then give_reward("wpn_svu_nimble") else give_reward("wpn_svd_nimble") end elseif has_alife_info("zat_b51_processing_category_5") then if has_alife_info("zat_b51_ordered_item_5_1") then give_reward("cs_heavy_outfit") give_reward("helm_tactic") else give_reward("dolg_heavy_outfit") give_reward("helm_battle") end elseif has_alife_info("zat_b51_processing_category_6") then if has_alife_info("zat_b51_ordered_item_6_1") then give_reward("scientific_outfit") else give_reward("ecolog_regular_outfit") end else if has_alife_info("zat_b51_ordered_item_7_1") then give_reward("dolg_exo_outfit") elseif has_alife_info("zat_b51_ordered_item_7_2") then give_reward("freedom_exo_outfit") else give_reward("killer_exo_outfit") end end end[/cut]
Сбой на последнем этапе. Всякий раз получаю экзу наемников. Почему функция дает сбой?
|
|
|
Эти 0 пользователя(ей) поблагодарили sergej5500 за это полезное сообщение: |
|
|
makdm | Дата: Вс, 19.04.2015, 00:22 | Сообщение # 610 |
Рожденный в СССР
Разработчики
Сообщений: 1294
| Цитата sergej5500 ( ) Всякий раз получаю экзу наемников. Почему функция дает сбой? Потому что ни один из проверяемых инфопоршней на момент выполнения функции не был выдан. Раз вы утверждаете, что предыдущие функции работают правильно, значит инфопорции выдавались, а вы их забрали раньше времени. Забирать инфопорции нужно в последний момент. Вот так:
if has_alife_info("zat_b51_processing_category_1") then if has_alife_info("zat_b51_ordered_item_1_1") then give_reward("wpn_desert_eagle_nimble") disable_info("zat_b51_processing_category_1") disable_info("zat_b51_ordered_item_1_1") elseif has_alife_info("zat_b51_ordered_item_1_2") then
и т.д.
Терпение...... И все получится!
Сообщение отредактировал makdm - Вс, 19.04.2015, 00:30 |
|
|
Эти 0 пользователя(ей) поблагодарили makdm за это полезное сообщение: |
|
|
Сахар | Дата: Пн, 04.05.2015, 13:13 | Сообщение # 611 |
Гражданский
Пользователи
Сообщений: 2
| Всем доброго здравия. Имеется такая функция. Код function mine_boom(actor, npc, p) local mesh_explode = get_story_object (p[1]) local anomal = get_story_object(p[2]) if mesh_explode == nil then abort("Переменная mesh_explode равна nil") end if anomal == nil then abort("Переменная anomal равна nil") end -- if mesh_explode ~= nil and anomal ~= nil then mesh_explode:explode(0) anomal:disable_anomaly() end end Вызываю её через рескриптор. Код on_info = {=npc_in_zone(esc_a2_zdravstui_zona_sms_control_restrictor)} %=mine_boom(mesh_test:mine_test)% nil Но нечего не происходит.
Сообщение отредактировал Сахар - Пн, 04.05.2015, 13:44 |
|
|
Эти 0 пользователя(ей) поблагодарили Сахар за это полезное сообщение: |
|
|
denis2000 | Дата: Пн, 04.05.2015, 13:57 | Сообщение # 612 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| mesh_explode не того класса?
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
Сахар | Дата: Пн, 04.05.2015, 15:08 | Сообщение # 613 |
Гражданский
Пользователи
Сообщений: 2
| Цитата denis2000 ( ) mesh_explode не того класса? В смысле объект у которого проверяется story id? То я использую physic_destroyable_object
|
|
|
Эти 0 пользователя(ей) поблагодарили Сахар за это полезное сообщение: |
|
|
denis2000 | Дата: Пн, 04.05.2015, 15:15 | Сообщение # 614 |
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
| Сахар, Не тот класс, нужен: class = S_EXPLO
"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..." (Чугунный всадник)
|
|
|
Эти 0 пользователя(ей) поблагодарили denis2000 за это полезное сообщение: |
|
|
Сахар | Дата: Пн, 04.05.2015, 15:15 | Сообщение # 615 |
Гражданский
Пользователи
Сообщений: 2
| Попробовал запустить функцию без проверке на рескриптор получил вылет с аргументом. Код Переменная anomal равна nil Это может быть из-за того что sid который я использую указывает на аномалию точнее на мину.
|
|
|
Эти 0 пользователя(ей) поблагодарили Сахар за это полезное сообщение: |
|
|
|