-- ======================================== -- СОБЫТИЯ ЛЕДОВОГО ПОБОИЩА -- Управление активностью события -- ======================================== -- ======================================== -- ОКНО СООБЩЕНИЙ И РЕГИСТРАЦИЯ -- ======================================== -- Обработка клика по окну сообщения -- Управляет регистрацией и входом на поле боя function Poboishe_OnClick(MapID, InstanceID, RoleID, TOMsgID, ToMapID, x, y, z) local curhour = tonumber(os.date("%H")) -- Текущий час local curmin = tonumber(os.date("%M")) -- Текущая минута local day = os.date("%A") -- День недели if TOMsgID == 951032 then -- Регистрация на событие (20:50-20:51) if (day == "Tuesday" or day == "Thursday") and 20 == curhour and (curmin == 50 or curmin == 51) then CreatPoboisheRoleObj(RoleID) else -- Время регистрации истекло local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 71, 100006) -- Вы нажали подтверждение слишком поздно msg.DispatchRoleMsgEvent(RoleID, MsgID) end else -- Вход на поле боя (21:00-21:01) if (day == "Tuesday" or day == "Thursday") and 21 == curhour and (curmin == 0 or curmin == 1) then -- Отменяем торговлю если игрок торгует if role.IsRoleInStatus(RoleID, 1024) then role.CancelRoleStallState(MapID, InstanceID, RoleID) end -- Выбираем случайную точку появления local k = math.random(1, 9) local Target_MapID, Target_InstanceID = role.GetRoleMapID(RoleID) if Target_MapID and Target_InstanceID then role.RoleGotoNewMap(Target_MapID, Target_InstanceID, RoleID, S66_1_MapID, S66_1_Point[k].x, S66_1_Point[k].y, S66_1_Point[k].z) end else -- Время входа истекло local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 71, 100006) -- Вы нажали подтверждение слишком поздно msg.DispatchRoleMsgEvent(RoleID, MsgID) end end end -- ======================================== -- УПРАВЛЕНИЕ СОБЫТИЕМ -- ======================================== -- Активация события -- Инициализирует событие и распределяет игроков по командам function Poboishe_OnStart(actID) Poboishe_baoming = 0 Poboishe_ChooseSide() -- Распределяем игроков по командам -- Отправляем уведомления всем зарегистрированным игрокам for k, v in pairs(Poboishe_Role) do local Target_MapID, Target_InstanceID = role.GetRoleMapID(k) if Target_MapID and Target_InstanceID then msg.SendRoleSwitchMsg(303, Target_MapID, Target_InstanceID, k, 1, 1145) end end end -- Таймер события (вызывается каждую минуту) -- Управляет временными событиями и обновлением состояния function Poboishe_OnTimerMin(actID) local Min = tonumber(os.date("%M")) -- Текущая минута -- Завершение события в 60-ю минуту if Min == 60 then for k, v in pairs(Poboishe_Battle) do -- Телепортируем всех игроков обратно role.RoleGotoNewMap(MapID, InstanceID, RoleID, 3424073512, 630, 1000, 630) end end -- Создание флага крови каждые 10 минут if Min % 10 == 0 then for k, v in pairs(Poboishe_Battle) do local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 102, 900251) -- Флаг крови появился на просторах Снежного пика msg.DispatchMapMsgEvent(MsgID, S66_1_MapID, k) map.MapCreateColCreature(S66_1_MapID, k, 9010354, 181, 7239, 208, 1, "") end end -- Обновление счета каждые 3 минуты if Min % 3 == 0 then for k, v in pairs(Poboishe_Battle) do local MsgID = msg.BeginMsgEvent() local blue_war_point = map.GetMapScriptData(S66_1_MapID, k, 1, 2) local red_war_point = map.GetMapScriptData(S66_1_MapID, k, 1, 1) msg.AddMsgEvent(MsgID, 101, 950342) -- Счет команд msg.AddMsgEvent(MsgID, 9, red_war_point) msg.AddMsgEvent(MsgID, 9, blue_war_point) msg.DispatchMapMsgEvent(MsgID, S66_1_MapID, k) end end -- Обновление состояния всех полей боя for k, v in pairs(Poboishe_Battle) do local BattleObj = Poboishe_Battle[k] BattleObj:SetPlayerPoint_Poboishe() -- Начисляем очки BattleObj:ResetInSidePlayer_Poboishe() -- Обновляем списки игроков end end -- Окончание события -- Подводит итоги и очищает данные function Poboishe_OnEnd(actID) -- Подводим итоги для всех полей боя for k, v in pairs(Poboishe_Battle) do local BattleObj = Poboishe_Battle[k] BattleObj:SetPlayerFinalPoint_Poboishe() -- Начисляем очки за победу -- Получаем всех игроков в инстансе и выкидываем их перед удалением if S66_1_MapID ~= nil then local RoleTbl = map.GetMapAllRoleID(S66_1_MapID, k) if RoleTbl ~= nil then for i, playerID in pairs(RoleTbl) do if playerID ~= nil and playerID ~= 0 then -- Проверяем, что игрок действительно в этом инстансе local playerMap, playerInstance = role.GetRoleMapID(playerID) if playerMap == S66_1_MapID and playerInstance == k then -- Выкидываем на безопасную карту выхода if S66_1_ExitMapID ~= nil and S66_1_ExitPoint ~= nil then role.RoleGotoNewMap(S66_1_MapID, k, playerID, S66_1_ExitMapID, S66_1_ExitPoint.x, S66_1_ExitPoint.y, S66_1_ExitPoint.z) else -- Стандартные координаты выхода role.RoleGotoNewMap(S66_1_MapID, k, playerID, 3424073512, 610, 23094, 669) end end end end end end map.DeleteInstance(S66_1_MapID, k) -- Удаляем инстанс карты end -- Очищаем все глобальные данные события Poboishe_Battle = {} Poboishe_Side = {} Poboishe_Role = {} Poboishe_Area = {} Poboishe_Roletotal = 0 end -- ======================================== -- РЕГИСТРАЦИЯ СОБЫТИЙ АКТИВНОСТИ -- ======================================== aux.RegisterActEvent(1145, 8, "Poboishe_OnClick") -- Клик по окну aux.RegisterActEvent(1145, 3, "Poboishe_OnEnd") -- Окончание события aux.RegisterActEvent(1145, 2, "Poboishe_OnStart") -- Начало события aux.RegisterActEvent(1145, 4, "Poboishe_OnTimerMin") -- Таймер -- Дублируем регистрацию для альтернативного ID события aux.RegisterActEvent(1143, 8, "Poboishe_OnClick") aux.RegisterActEvent(1143, 3, "Poboishe_OnEnd") aux.RegisterActEvent(1143, 2, "Poboishe_OnStart") aux.RegisterActEvent(1143, 4, "Poboishe_OnTimerMin") -- ======================================== -- ДИАЛОГ С NPC -- ======================================== -- Разговор с NPC Королевой Снежного Пика -- Управляет регистрацией, входом и получением наград function x9010272_OnTalk(MapID, InstanceID, TargetID, TargetTypeID, RoleID, TalkIndex) local curmon = tonumber(os.date("%m")) -- Текущий месяц local curday = tonumber(os.date("%d")) -- Текущий день local curyear = tonumber(os.date("%Y")) -- Текущий год local curtime = curyear * 10000 + curmon * 100 + curday local curhour = tonumber(os.date("%H")) -- Текущий час local curmin = tonumber(os.date("%M")) -- Текущая минута local day = os.date("%A") -- День недели local rolelevel = role.GetRoleLevel(MapID, InstanceID, RoleID) if TalkIndex == -1 then -- Основное меню NPC local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 20, 950340) -- Описание события Ледовое побоище msg.AddMsgEvent(MsgID, 24, TargetID) -- Показываем кнопку регистрации во время регистрации if (day == "Tuesday" or day == "Thursday") and 20 == curhour and (curmin >= 50 or curmin <= 59) then msg.AddMsgEvent(MsgID, 21, 4) msg.AddMsgEvent(MsgID, 1, 950534) -- Принять участие в войне end -- Показываем кнопку входа во время события if act.GetActIsStart(1145) == true or act.GetActIsStart(1143) == true then msg.AddMsgEvent(MsgID, 21, 9) msg.AddMsgEvent(MsgID, 1, 206707) -- Войти на поле боя elseif (day == "Tuesday" or day == "Thursday") and 22 == curhour and (curmin >= 01 or curmin <= 59) then -- Показываем кнопку получения награды после события if role.GetRoleScriptData(RoleID, 1, RoleDataType["Poboishe_Point"]) ~= 0 then msg.AddMsgEvent(MsgID, 21, 5) msg.AddMsgEvent(MsgID, 1, 206708) -- Получить награду end end msg.AddMsgEvent(MsgID, 21, -1) msg.AddMsgEvent(MsgID, 1, 100002) -- OK msg.DispatchRoleMsgEvent(RoleID, MsgID) elseif TalkIndex == 4 then -- Регистрация на событие CreatPoboisheRoleObj(RoleID) if Poboishe_Role[RoleID] ~= nil then -- Игрок уже зарегистрирован local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 20, 950624) -- Ты уже зарегистрирован, герой! msg.AddMsgEvent(MsgID, 24, TargetID) msg.AddMsgEvent(MsgID, 21, -1) msg.AddMsgEvent(MsgID, 1, 100001) msg.DispatchRoleMsgEvent(RoleID, MsgID) else -- Проверяем уровень для участия if rolelevel < 60 then local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 20, 950909) -- Недостаточный уровень msg.AddMsgEvent(MsgID, 24, TargetID) msg.AddMsgEvent(MsgID, 9, 60) msg.AddMsgEvent(MsgID, 9, 120) msg.AddMsgEvent(MsgID, 21, -1) msg.AddMsgEvent(MsgID, 1, 100001) msg.DispatchRoleMsgEvent(RoleID, MsgID) else -- Регистрируем игрока CreatPoboisheRoleObj(RoleID) end end elseif TalkIndex == 5 then -- Получение награды if act.GetActIsStart(1145) ~= true or act.GetActIsStart(1143) ~= true then local point = role.GetRoleScriptData(RoleID, 1, RoleDataType["Poboishe_Point"]) local exp1 = math.floor(Poboishe_Exp[rolelevel] * 2 * point / 60) local exp2 = 8 * point local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 20, 206714) -- Награда за отвагу msg.AddMsgEvent(MsgID, 24, TargetID) msg.AddMsgEvent(MsgID, 9, exp1) msg.AddMsgEvent(MsgID, 9, exp2) msg.AddMsgEvent(MsgID, 21, 11) msg.AddMsgEvent(MsgID, 1, 100001) msg.DispatchRoleMsgEvent(RoleID, MsgID) end elseif TalkIndex == 9 then -- Вход на поле боя if GetPoboisheRoleObj(RoleID) == nil then -- Игрок не зарегистрирован local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 20, 206721) -- Без регистрации нельзя войти msg.AddMsgEvent(MsgID, 24, TargetID) msg.AddMsgEvent(MsgID, 21, -1) msg.AddMsgEvent(MsgID, 1, 100001) msg.DispatchRoleMsgEvent(RoleID, MsgID) else -- Телепортируем на поле боя local k = math.random(1, 9) role.RoleGotoNewMap(MapID, InstanceID, RoleID, S66_1_MapID, S66_1_Point[k].x, S66_1_Point[k].y, S66_1_Point[k].z) role.SetRoleScriptData(RoleID, 1, RoleDataType["Poboishe_win"], 2) end elseif TalkIndex == 11 then -- Выдача награды local FreeSize = role.GetBagFreeSize(RoleID) if FreeSize < 2 then -- Недостаточно места в инвентаре local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 20, 100003) -- Нужно минимум 2 пустых ячейки msg.AddMsgEvent(MsgID, 24, TargetID) msg.AddMsgEvent(MsgID, 9, 2) msg.AddMsgEvent(MsgID, 21, -1) msg.AddMsgEvent(MsgID, 1, 100001) msg.DispatchRoleMsgEvent(RoleID, MsgID) else -- Выдаем награду if act.GetActIsStart(1142) ~= true or act.GetActIsStart(1143) ~= true then local point = role.GetRoleScriptData(RoleID, 1, RoleDataType["Poboishe_Point"]) local exp1 = math.floor(Poboishe_Exp[rolelevel] * 2.5 * point / 60) local exp2 = 8 * point if role.GetRoleScriptData(RoleID, 1, RoleDataType["Poboishe_win"]) == 1 then role.AddRoleExp(MapID, InstanceID, RoleID, exp1) role.SetRoleScriptData(RoleID, 1, RoleDataType["Poboishe_Point"], 0) role.SetRoleScriptData(RoleID, 1, RoleDataType["Poboishe_win"], 3) elseif role.GetRoleScriptData(RoleID, 1, RoleDataType["Poboishe_win"]) == 2 then role.AddRoleExp(MapID, InstanceID, RoleID, exp1) role.SetRoleScriptData(RoleID, 1, RoleDataType["Poboishe_Point"], 0) role.SetRoleScriptData(RoleID, 1, RoleDataType["Poboishe_win"], 3) end end end end end -- Регистрация события разговора с NPC aux.RegisterCreatureEvent(9010272, 7, "x9010272_OnTalk")