Войти на сайт Регистрация Лента форума Пользователи Правила сайта Поиск по форуму
Модератор форума: 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 по ссылке из шапки и соседнюю тему "Курс молодого бойца",
возможно Ваш вопрос уже рассматривался.


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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
sergej5500Дата: Пн, 30.03.2015, 13:27 | Сообщение # 601
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый день.

Имеются две функции в 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-й комплект квестовых предметов.

Вопрос: рабочие ли функции?
 
makdmДата: Пн, 30.03.2015, 16:21 | Сообщение # 602
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата 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
 
sergej5500Дата: Пн, 30.03.2015, 23:25 | Сообщение # 603
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый вечер. Возникли такие вопросы.

Имеется смарт-террайн. Рядом со смартом имеется спальное место для игрока.

При помощи какой функции можно проверить такие вещи.

1. Свободен ли смарт или занят сквадами?
2. Есть ли среди сквадов, занимающих смарт, сквады, враждебные игроку?

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

Есть идея переделать логику спальных мест. Если рядом никого, или неподалеку враги, то спать нельзя.
 
denis2000Дата: Вт, 31.03.2015, 13:01 | Сообщение # 604
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Цитата 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


"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
sergej5500Дата: Вс, 12.04.2015, 21:41 | Сообщение # 605
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый вечер.

В своей сборке я переделал квест на 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.

Какой функцией можно воспользоваться? Или как её составить?
 
makdmДата: Пн, 13.04.2015, 10:19 | Сообщение # 606
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата 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


Терпение......
И все получится!
 
sergej5500Дата: Пн, 13.04.2015, 11:15 | Сообщение # 607
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

makdm,

Спасибо за помощь. Возник вопрос по функции.

Что дает запись squad and squad:clsid() == 94 и почему число равно 94 а не 95?

Почему функцию нельзя написать в таком виде:
if squad and squad:clsid() == 94 and string.find( squad:section_name(), "freeplay_zombied" ) ~= nil then
 
makdmДата: Пн, 13.04.2015, 12:11 | Сообщение # 608
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата sergej5500 ()
Что дает запись squad and squad:clsid() == 94 и почему число равно 94 а не 95?

Запись проверяет имеется ли серверный объект с данным ID и какой класс присвоил объекту движок.
Если класс 94, значит это объект сквад.


Терпение......
И все получится!
 
sergej5500Дата: Сб, 18.04.2015, 21:39 | Сообщение # 609
Полевой Исследователь
Ученые сталкеры
Сообщений: 3793
Награды: 29
Репутация: [ 1355 ]

Добрый вечер. Решил переделать систему заказов у Шустрого. Чтобы он мог приносить одну и ту же вещь много раз.

[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]

Сбой на последнем этапе. Всякий раз получаю экзу наемников. Почему функция дает сбой?
 
makdmДата: Вс, 19.04.2015, 00:22 | Сообщение # 610
Рожденный в СССР
Разработчики
Сообщений: 1294
Награды: 29
Репутация: [ 1909 ]

Цитата 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
 
СахарДата: Пн, 04.05.2015, 13:13 | Сообщение # 611
Гражданский
Пользователи
Сообщений: 2
Награды: 4
Репутация: [ 69 ]

Всем доброго здравия. Имеется такая функция.
Код
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
 
denis2000Дата: Пн, 04.05.2015, 13:57 | Сообщение # 612
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

mesh_explode не того класса?

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
СахарДата: Пн, 04.05.2015, 15:08 | Сообщение # 613
Гражданский
Пользователи
Сообщений: 2
Награды: 4
Репутация: [ 69 ]

Цитата denis2000 ()
mesh_explode не того класса?

В смысле объект у которого проверяется story id? То я использую physic_destroyable_object


 
denis2000Дата: Пн, 04.05.2015, 15:15 | Сообщение # 614
Полевой исследователь
Ученые сталкеры
Сообщений: 2399
Награды: 35
Репутация: [ 1918 ]

Сахар, Не тот класс, нужен: class = S_EXPLO

"Он ловко выхватил из-под себя табуретку и очень метко и сильно бросил ее в докладчика..."
(Чугунный всадник)
 
СахарДата: Пн, 04.05.2015, 15:15 | Сообщение # 615
Гражданский
Пользователи
Сообщений: 2
Награды: 4
Репутация: [ 69 ]

Попробовал запустить функцию без проверке на рескриптор получил вылет с аргументом.
Код
Переменная anomal равна nil

Это может быть из-за того что sid который я использую указывает на аномалию точнее на мину.


 
Форум » Моды для игр » Модостроение » Модостроение. Редактирование и создание скриптов
Поиск: