Таймеры — S.T.A.L.K.E.R. Inside Wiki

Таймеры

Материал из S.T.A.L.K.E.R. Inside Wiki

Перейти к: навигация, поиск

Для чего нужны таймеры? Предположим, вы хотите, чтобы Меченому после диалога пришло сообщение на ПДА, но не сразу, а для придания большего реализма с задержкой в ~7-8 секунд. В таком случае, если вы читаете эту статью, то у вас есть:
- Готовый диалог
- Необходимая функция в свежем скриптовом файле.
Для того, чтобы создать таймер, необходимо открыть файл с вашими скриптами и написать следующее :

local iTimer
function function_onetimer()
    iTimer = time_global() + 6*1000 
end
 
function timer_5_minutes()
    if iTimer and iTimer < time_global() then 
        iTimer = nil 
        wolfscripts.humorist_killed_msg() 
    end
end


Разъясню:

function function_onetimer() — название функции (это главная функция и её будем вызывать из диалога)
    iTimer = time_global() + 6*1000 -- задержка по времени (6 секунд)
function timer_5_minutes() — собственно, настройки таймера
        iTimer = nil       -- отключаем таймер
        wolfscripts.humorist_killed_msg() -- название скрипта.название функции


Тут, вроде бы, всё просто. Но таймер просто так не заработает. Лезем в bind_stalker.script и в

function actor_binder:update(delta)


пишем:

название_вашего_скрипта.timer_5_minutes()

Вуаля, теперь всё работает. Спасибо за внимание. Да, кстати, из диалога вызываем функцию function_onetimer.

Добавил J.DLRN

По поводу таймера в единицах игрового времени: вместо time_global() берётся level.get_time_hours() - время в часах, либо: level.get_time_days() - количество игровых суток, или же: level.get_time_minutes() - игровые минуты.

Пример: Шуруп(механик Свободы) берёт заказ на изготовление арбалетных стрел("болтов"), через игровые пять часов отсылает Меченому сообщение типа: "приходи, готово".

В bind_stalker ставится:
function actor_binder:update(delta)
object_binder.update(self, delta)
moi_scripts.vse_timers() ----- опрос таймеров

В новом файле moi_scripts.script пишутся проверки и обработки:

function has_strely_payment(actor, npc) ---проверка платёжеспособности актора
return actor:money() >= 4500
end
 
function give_shurup_money(actor, npc) --- перемещение денег от актора к механику
dialogs.relocate_money(npc, 4500, "out")
end
 
function give_strely_to_actor(first_speaker, second_speaker) --- забираем заказ(сорок стрел к арбалету)
local i = 0
for i = 1,40 do
dialogs.relocate_item_section(first_speaker, "ammo_arbolt", "in")
end
end
 
 
function message_shurupa() --- актор где-то бродит, надо сообщить о готовности
db.actor:give_info_portion("strely_gotovy") --- инфопорция для диалогов
local sactor = alife():actor() --получаем серверный объект актера
local cactor = level.object_by_id(sactor.id) --по его ID получаем клиентский объект актера
cactor:give_game_news(
"Меченый, это Шуруп\\nРабота сделана, подходи за заказом.", -- строка сообщение, может быть многострочной
"ui\\ui_iconsTotal", --текстура, из которой берется аватара "отправителя"
Frect():set(0,0,83,47), --координаты и размеры вырезаемого из текстуры изображения
math.random(1000, 3000), --начало показа сообщения с текущего момента (в миллисекундах)
10000 --длительность показа сообщения (в миллисекундах)
)
local snd_obj
snd_obj = xr_sound.get_safe_sound_object([[device\pda\pda_tip]]) -- путь до звукового файла
snd_obj:play_no_feedback(db.actor, sound_object.s2d, 1, vector(), 1.0) --- пиликает, чтоб не прошляпил сообщение в горячке боя
end
 
local iTimer
function vremya_strel() --- функция в диалогах
iTimer = level.get_time_hours() + 5
end
 
function vse_timers() --- обработка бинд_сталкером
if iTimer and iTimer < level.get_time_hours() then --- если прошёл срок
iTimer = nil -- отключаем таймер
moi_scripts.message_shurupa() --- сообщаем заказчику
end
end

Необходимые для логичной работы диалогов инфопорции(в любом xml-файле с подобными):

<info_portion id="strely_deal"></info_portion>
<info_portion id="strely_gotovy"></info_portion>
<info_portion id="strely_vydany"></info_portion>

Сами диалоги, в файле с, допустим, диалогами Свободы - dialogs_military.xml :

<dialog id="mil_shurup_strely_dialog"> <!--- диалог самого заказа--->
<dont_has_info>strely_deal</dont_has_info>
<phrase_list>
<phrase id="0">
<text>mil_shurup_strely_dialog_0</text>
<next>1</next>
</phrase>
<phrase id="1">
<text>mil_shurup_strely_dialog_1</text>
<next>2</next>
</phrase>
<phrase id="2">
<text>mil_shurup_strely_dialog_2</text>
<next>3</next>
</phrase>
<phrase id="3">
<text>mil_shurup_strely_dialog_3</text>
<next>4</next>
<next>5</next>
</phrase>
<phrase id="4">
<precondition>moi_scripts.has_strely_payment</precondition> <!--- если деньги есть, то при нажатии на "договорились" : -->
<text>mil_shurup_strely_dialog_4</text>
<give_info>strely_deal</give_info> <!-- инфопорция "сделка состоялась"-->
<action>moi_scripts.give_shurup_money</action> <!-- акция"предоплата"-->
<action>moi_scripts.vremya_strel</action> <!-- акция"время пошло"-->
</phrase>
<phrase id="5"> <!-- есть деньги, или нет - наше дело, можем передумать-->
<text>mil_shurup_strely_dialog_5</text>
<action>dialogs.break_dialog</action> <!-- акция"выход из диалога"-->
</phrase>
</phrase_list>
</dialog>
<dialog id="mil_shurup_strely_dialog_2"> <!--- диалог после выполнения заказа--->
<has_info>strely_gotovy</has_info> <!-- время вышло, то же самое, что работа готова-->
<dont_has_info>strely_vydany</dont_has_info> <!-- если стрелы уже забирали, то диалог не появится-->
<phrase_list>
<phrase id="0">
<text>mil_shurup_strely_gotovy_0</text>
<next>1</next>
</phrase>
<phrase id="1">
<text>mil_shurup_strely_gotovy_1</text>
<next>2</next>
</phrase>
<phrase id="2">
<give_info>strely_vydany</give_info>
<text>mil_shurup_strely_gotovy_2</text>
<action>moi_scripts.give_strely_to_actor</action> <!-- акция"давай стрелы"-->
</phrase>
</phrase_list>
</dialog>

Расшифровка текста в stable_dialogs_military.xml :

<string id="mil_shurup_strely_dialog_0">
<text>Не подскажешь - где мне найти болты к арбалету?</text>
</string>
<string id="mil_shurup_strely_dialog_1">
<text>Найти - врядли. А вот сделать на заказ - могу. Штук сорок.</text>
</string>
<string id="mil_shurup_strely_dialog_2">
<text>И во сколько мне это обойдётся?</text>
</string>
<string id="mil_shurup_strely_dialog_3">
<text>Так, алюминий есть. Сталь на наконечники... Плюс работа, часов пять. Итого - четыре с половиной тыщи.</text>
</string>
<string id="mil_shurup_strely_dialog_4">
<text>Договорились, вот деньги. Зайду через несколько часов.</text>
</string>
<string id="mil_shurup_strely_dialog_5">
<text>Не, меня не устраивает. Пока.</text>
</string>
<string id="mil_shurup_strely_gotovy_0">
<text>Говоришь, справился уже с заказом?</text>
</string>
<string id="mil_shurup_strely_gotovy_1">
<text>Всё готово, забирай.</text>
</string>
<string id="mil_shurup_strely_gotovy_2">
<text>Ну, и отлично. Благодарю за труд.</text>
</string>

Надо добавить наши диалоги самому персонажу: файл character_desc_military.xml, секция , в конце, перед </specific_character> вставляем

<actor_dialog>mil_shurup_strely_dialog</actor_dialog>
<actor_dialog>mil_shurup_strely_dialog_2</actor_dialog>

Заказали работу, заплатили, побродили пять часов, и вот - у нас есть болты к арбалету. Пока заказ одноразовый, разработка повторного обращения за тем же - в процессе:)Всё написано ради проверки работоспособности отсрочки события по времени. Благодарность malandrinus за информацию по выводу сообщения на экран. Добавил J.DLRN e.delorean@qip.ru

Другие места
LANGUAGE