Таймеры — различия между версиями — S.T.A.L.K.E.R. Inside Wiki

Таймеры — различия между версиями

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

Перейти к: навигация, поиск
Строка 42: Строка 42:
  
 
[[Категория:Скрипты]]
 
[[Категория:Скрипты]]
 
<big>Добавил J.DLRN</big>
 
 
По поводу таймера в единицах игрового времени: вместо time_global() берётся level.get_time_hours() - время в часах, либо: level.get_time_days() - количество игровых суток, или же: level.get_time_minutes() - игровые минуты.
 
 
Пример: Шуруп(механик Свободы) берёт заказ на изготовление арбалетных стрел("болтов"), через игровые пять часов отсылает Меченому сообщение типа: "приходи, готово".
 
 
В bind_stalker ставится:<code>
 
function actor_binder:update(delta)
 
object_binder.update(self, delta)
 
moi_scripts.vse_timers() ----- опрос таймеров
 
</code>
 
В новом файле moi_scripts.script пишутся проверки и обработки:
 
<code>
 
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
 
</code>
 
Необходимые для логичной работы диалогов инфопорции(в любом xml-файле с подобными):
 
<code> <info_portion id="strely_deal"></info_portion>
 
<info_portion id="strely_gotovy"></info_portion>
 
<info_portion id="strely_vydany"></info_portion>
 
</code>
 
Сами диалоги, в файле с, допустим, диалогами Свободы - dialogs_military.xml :
 
<code>
 
<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>
 
</code>
 
Расшифровка текста в stable_dialogs_military.xml :
 
<code>
 
<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>
 
</code>
 
Надо добавить наши диалоги самому персонажу:
 
файл character_desc_military.xml, секция SVOBODA ENGINEER, в конце, перед </specific_character> вставляем
 
<code> <actor_dialog>mil_shurup_strely_dialog</actor_dialog>
 
<actor_dialog>mil_shurup_strely_dialog_2</actor_dialog></code>
 
Заказали работу, заплатили, побродили пять часов, и вот - у нас есть болты к арбалету. Пока заказ одноразовый, разработка повторного обращения за тем же - в процессе:)Всё написано ради проверки работоспособности отсрочки события по времени. Благодарность <big>malandrinus</big> за информацию по выводу сообщения на экран.
 
Добавил J.DLRN e.delorean@qip.ru
 

Версия 15:59, 10 февраля 2015

Для чего нужны таймеры? Предположим, вы хотите, чтобы Меченому после диалога пришло сообщение на ПДА, но не сразу, а для придания большего реализма с задержкой в ~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.

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