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

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

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

Перейти к: навигация, поиск
(Но есть способ проще)
 
(не показаны 2 промежуточных версий 2 участников)
Строка 41: Строка 41:
 
Да, кстати, из диалога вызываем функцию '''function_onetimer'''.
 
Да, кстати, из диалога вызываем функцию '''function_onetimer'''.
  
[[Категория:Скрипты]]
+
=== Но есть способ проще ===
 +
<lua>
 +
  function action_timer()
 +
      .... ваш код по истечению таймера ....
 +
  end
  
<big>Добавил J.DLRN</big>
+
  function start_timer()
 +
      -- взводим таймер на 10 секунд
 +
      local iTimer = time_global() + 10000
  
По поводу таймера в единицах игрового времени: вместо time_global() берётся level.get_time_hours() - время в часах, либо: level.get_time_days() - количество игровых суток, или же: level.get_time_minutes() - игровые минуты.
+
      -- функция ожидания истечения таймера
 +
      local function check_timer()
 +
        return time_global() > iTimer
 +
      end
  
Пример: Шуруп(механик Свободы) берёт заказ на изготовление арбалетных стрел("болтов"), через игровые пять часов отсылает Меченому сообщение типа: "приходи, готово".
+
      -- ставим её на апдейт
 +
      level.add_call(check_timer, action_timer)
 +
  end
 +
</lua>
  
В bind_stalker ставится:<code>
+
По сути, это то же самое, но реализация проще. Все умещается в одном файле, без редактирования '''bind_stalker.script'''.
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
+

Текущая версия на 17:52, 9 июля 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.

Но есть способ проще

 
   function action_timer()
      .... ваш код по истечению таймера ....
   end
 
   function start_timer()
      -- взводим таймер на 10 секунд
      local iTimer = time_global() + 10000
 
      -- функция ожидания истечения таймера
      local function check_timer()
         return time_global() > iTimer
      end
 
      -- ставим её на апдейт
      level.add_call(check_timer, action_timer)
   end
 

По сути, это то же самое, но реализация проще. Все умещается в одном файле, без редактирования bind_stalker.script.

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