Jump to content
Sign in to follow this  
V3ct0r

Диалог с NPC в определенное время

Recommended Posts

Диалог с NPC в определенное время

 

Привет! В данном гайде я расскажу как можно сделать диалог с NPC доступным только в определенное время. Например, с 18:00 до 19:45.

 

Для начала напишем скелет скрипта NPC, который для примера назовем pn_FuncName:

function pn_FuncName()
 
    InitTrigger()
    TriggerCondition(1, CheckTime, 1800, 1945)
    TriggerAction(1, JumpPage, 1)
    TriggerFailure(1, JumpPage, 2)
    Start(GetMultiTrigger(), 1)
   
    Talk( 1, "Я буду с тобой говорить!" )
    Talk( 2, "Я НЕ буду с тобой говорить! Приходи в другое время!" )
   
end

 

В самом начале скрипта мы определяем условие времени

TriggerCondition(1, CheckTime, 1800, 1945)

Для этого служит функция CheckTime(t1, t2), которую мы опишем позже. Она принимает два параметра:
t1 - начальное время;

t2 - конечное время.

 

В данном примере, t1 и t2 соответствуют значения 1800 и 1945, что означает интервал времени от 18:00 до 19:45 включительно. Как Вы могли догадаться, время кодируется следующим образом:

t = часы * 100 + минуты

 

Итак, мы определили условие времени. Если оно выполняется, то игрок попадает на страницу 1 и видит сообщение "Я буду с тобой говорить!", в противном случае, игрок попадает на страницу 2 и видит сообщение "Я НЕ буду с тобой говорить! Приходи в другое время!". Все просто!

 

Далее нам необходимо написать функцию CheckTime(t1, t2). Для этого открываем файл functions.lua (GameServer\resource\script\calculate) и помещаем в него следующий код:

-- Функция для проверки времени
-- Если текущее время попадает в интервал [t1, t2]
--  , то функция возвращает true, в противном случае
--  функция возвращает false
function CheckTime(character, t1, t2)
   
    -- Получим текущее время
    local hour   = tonumber(os.date("%H")) * 100
    local minute = tonumber(os.date("%M"))
	
    -- Закодируем его по формуле
    -- t = часы * 100 + минуты
    local check  = hour + minute
	
    -- Определяем, находится ли текущее время
    -- в интервале [t1, t2]
    if (check >= t1 and check <= t2) then
	-- Время находится в интервале
        return LUA_TRUE
    end
   
    -- Время не находится в интервале
    return LUA_FALSE
end

 

Чтобы функцию можно было использовать в диалогах NPC, а именно в функции TriggerCondition(...), которая определяет различные условия, её необходимо зарегистрировать в файле MissionSdk.lua (GameServer\resource\script\MisSdk). Найдите в этом файле функцию ConditionsTest(...), а в ней следующий код:

			if conditions[i].func == NoMission then
				PRINT( "ConditionsTest:NoMission, p1 = ", conditions[i].p1 )
				local Ret = NoMission( character, conditions[i].p1 )
				if Ret ~= LUA_TRUE then
					PRINT( "ConditionsTest: NoMission = false" )
					return LUA_FALSE
				end

После данного блока кода вставьте код для функции CheckTime(t1, t2):

           elseif conditions[i].func == CheckTime then
                PRINT( "ConditionsTest: CheckTime")
                local ret = CheckTime(character)
                if ret ~= LUA_TRUE then
                    PRINT( "ConditionsTest: CheckTime = false" )
                    return LUA_FALSE
                end

На этом все, теперь Вы можете создать NPC c функцией pn_FuncName (название взято для примера) и протестировать его.

 

P.S. За идею были взяты NPC с о. Весны, которые говорят с игроком, только когда он прошел квест "Языковой барьер";

P.S.S. В функцию CheckTime(t1, t2) можно так же добавить проверку на день недели. См. Справочное руководство по языку Lua 5.1 - 5.8 – Функции операционной системы;

P.S.S.S. По такому же принципу можно делать любые проверки, например, на расу и профессию персонажа игрока.

  • Like 3

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×