Таймеры — различия между версиями — 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() - игровые минуты.
 +
 +
Пример: Шуруп(механик Свободы) берёт заказ на изготовление арбалетных стрел("болтов"), через игровые пять часов отсылает Меченому сообщение типа: "приходи, готово".
 +
<code>
 +
В 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, секция <!---------------------------SVOBODA ENGINEER-----------------------> , в конце, перед </specific_character> вставляем
 +
<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

Версия 06:52, 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.

Добавил 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, секция <!---------------------------SVOBODA ENGINEER-----------------------> , в конце, перед </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