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

@V3ct0r А вот, к примеру, проверка на уровень ГМ.

НПС:

yn10H84NlLE.jpg

Function.lua

KVh_pLGr4oQ.jpg

Ну и MissionSDK.lua

DSQ9lpSzDgI.jpg

Ошибка

EpwpsBHEHhA.jpg

Можете привести пример или натолкнуть на правильный код?))

Edited by Graf

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  

×