-- ======================================== -- КАРТА СНЕЖНОГО ПИКА (Snow_pik) -- Настройки карты и обработка событий -- ======================================== -- ======================================== -- ТЕЛЕПОРТ НА СОБЫТИЕ -- ======================================== -- Диалог с NPC телепорта -- Управляет входом игроков на карты события по уровням function c9010319_On_Talk(MapID, InstanceID, TargetID, TargetTypeID, RoleID, TalkIndex) local rolelevel = role.GetRoleLevel(MapID, InstanceID, RoleID) if TalkIndex == -1 then -- Основное меню NPC local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 20, 950350) -- Описание события Снежный пик msg.AddMsgEvent(MsgID, 24, TargetID) -- Показываем кнопку входа только игрокам 80+ уровня if rolelevel > 79 then msg.AddMsgEvent(MsgID, 21, 4) msg.AddMsgEvent(MsgID, 1, 100001) -- OK end msg.AddMsgEvent(MsgID, 21, 5) msg.AddMsgEvent(MsgID, 1, 100002) -- Отмена msg.DispatchRoleMsgEvent(RoleID, MsgID) elseif TalkIndex == 4 then -- Телепортация на карту события if rolelevel > 79 and rolelevel < 95 then -- Игроки 80-94 уровня идут на первую карту role.RoleGotoNewMap(MapID, 1, RoleID, 940889436, 530, 1000, 230) elseif rolelevel > 94 then -- Игроки 95+ уровня идут на вторую карту role.RoleGotoNewMap(MapID, 1, RoleID, 940889692, 530, 1000, 230) end end end -- Регистрация события диалога с телепортом aux.RegisterCreatureEvent(9010319, 7, "c9010319_On_Talk") -- ======================================== -- ФУНКЦИИ КАРТЫ -- ======================================== -- Получение инстанса карты для игрока -- Возвращает ID инстанса (всегда 1 для этого события) function sn_GetOnePerfectMap(MapID, InstanceID, RoleID) return 1 end -- Регистрация событий получения инстанса aux.RegisterMapEvent("sn_01", 14, "sn_GetOnePerfectMap") aux.RegisterMapEvent("sn_02", 14, "sn_GetOnePerfectMap") -- Обработка отключения игрока во время онлайн -- Возвращает координаты выхода с карты function sn_CanEnterWhenOnline(MapID, RoleID) return 3424073512, 610, 23094, 669 end -- Регистрация событий отключения aux.RegisterMapEvent("sn_01", 12, "sn_CanEnterWhenOnline") aux.RegisterMapEvent("sn_02", 12, "sn_CanEnterWhenOnline") -- Получение карты и координат для экспорта -- Используется при принудительном выходе с карты function sn_GetExporMapAndCoord(MapID, InstanceID, RoleID) return 1, 3424073512, 610, 23094, 669 end -- Регистрация событий экспорта aux.RegisterMapEvent("sn_01", 13, "sn_GetExporMapAndCoord") aux.RegisterMapEvent("sn_02", 13, "sn_GetExporMapAndCoord") -- Проверка возможности входа на карту -- Разрешает вход всем игрокам function sn_CanEnter(MapID, InstanceID, RoleID) return 1 end -- Регистрация событий проверки входа aux.RegisterMapEvent("sn_01", 15, "sn_CanEnter") aux.RegisterMapEvent("sn_02", 15, "sn_CanEnter") -- Обработка выхода игрока с карты -- В данный момент пустая функция function sn_OnPlayerLeave(MapID, InstanceID, RoleID) -- Здесь можно добавить логику очистки данных игрока end -- Регистрация событий выхода с карты aux.RegisterMapEvent("sn_01", 3, "sn_OnPlayerLeave") aux.RegisterMapEvent("sn_02", 3, "sn_OnPlayerLeave") -- ======================================== -- ТАЙМЕР СОБЫТИЯ -- ======================================== -- Таймер события (вызывается каждую минуту) -- Управляет временными событиями и созданием мобов function Snow_Timer(actID) local curmin = tonumber(os.date("%M")) -- Текущая минута -- Случайные сообщения каждые 2 минуты if curmin % 2 == 0 then local d = math.random(950353, 950361) local f = math.random(950363, 950369) local MsgID = msg.BeginMsgEvent() if math.random(2) == 1 then msg.AddMsgEvent(MsgID, 101, d) else msg.AddMsgEvent(MsgID, 101, f) end msg.DispatchMapMsgEvent(MsgID, MapID, InstanceID) end -- Создание снежных мобов каждые 10 минут if curmin % 10 == 0 then -- Массив точек появления снежных мобов local sygrob = {} sygrob[1] = {270, 3239, 469} sygrob[2] = {375, 3439, 479} sygrob[3] = {424, 3401, 426} sygrob[4] = {368, 3401, 397} sygrob[5] = {362, 3401, 353} sygrob[6] = {396, 3401, 334} sygrob[7] = {357, 3403, 290} sygrob[8] = {300, 3401, 355} sygrob[9] = {292, 3306, 476} sygrob[10] = {456, 3401, 382} local x = math.random(9) -- Случайная точка появления -- Применяем баффы боссам с проверкой существования local oleg1 = map.GetMapScriptData(940889436, 1, 1, 2) if oleg1 and oleg1 > 0 then unit.AddBuff(940889436, 1, oleg1, 6105801, oleg1) end local oleg2 = map.GetMapScriptData(940889436, 1, 1, 1) if oleg2 and oleg2 > 0 then unit.AddBuff(940889436, 1, oleg2, 6105801, oleg2) end -- Создаем снежных мобов на обеих картах map.MapCreateColCreature(940889436, 1, 9010330, sygrob[x][1], sygrob[x][2], sygrob[x][3], 1, "") map.MapCreateColCreature(940889692, 1, 9010330, sygrob[x][1], sygrob[x][2], sygrob[x][3], 1, "") end -- Создание обычных мобов каждые 7 минут if curmin % 7 == 0 then local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 101, 950370) -- Сообщение о появлении мобов msg.DispatchMapMsgEvent(MsgID, MapID, InstanceID) local c = math.random(200) -- Случайное смещение по X local d = math.random(200) -- Случайное смещение по Z -- Создаем мобов на обеих картах map.MapCreateCreature(940889436, 1, 9010322, 286 + c, 3401, 298 + d) map.MapCreateCreature(940889692, 1, 9010326, 286 + c, 3401, 298 + d) map.MapCreateCreature(940889436, 1, 9010323, 286 + c, 3401, 298 + d) map.MapCreateCreature(940889692, 1, 9010327, 286 + c, 3401, 298 + d) map.MapCreateCreature(940889436, 1, 9010322, 286 + c, 3401, 298 + d) map.MapCreateCreature(940889692, 1, 9010326, 286 + c, 3401, 298 + d) map.MapCreateCreature(940889436, 1, 9010323, 286 + c, 3401, 298 + d) map.MapCreateCreature(940889692, 1, 9010327, 286 + c, 3401, 298 + d) map.MapCreateCreature(940889436, 1, 9010322, 286 + c, 3401, 298 + d) map.MapCreateCreature(940889692, 1, 9010326, 286 + c, 3401, 298 + d) map.MapCreateCreature(940889436, 1, 9010323, 286 + c, 3401, 298 + d) map.MapCreateCreature(940889692, 1, 9010327, 286 + c, 3401, 298 + d) map.MapCreateCreature(940889436, 1, 9010322, 286 + c, 3401, 298 + d) map.MapCreateCreature(940889692, 1, 9010326, 286 + c, 3401, 298 + d) map.MapCreateCreature(940889436, 1, 9010323, 286 + c, 3401, 298 + d) map.MapCreateCreature(940889692, 1, 9010327, 286 + c, 3401, 298 + d) end end -- Регистрация таймера события aux.RegisterActEvent(1170, 4, "Snow_Timer") -- ======================================== -- АТАКА БОССА -- ======================================== -- Обработка атаки босса -- Создает дополнительных мобов при атаке босса function m9010321_Atak(MapID, InstanceID, CreatureID, GetID) -- Проверяем существование CreatureID if not CreatureID or CreatureID <= 0 then return end local a = math.random(2) -- Случайный тип моба local b = math.random(1000) -- Случайная вероятность local x, y, z = unit.GetPosition(MapID, InstanceID, CreatureID) -- Проверяем корректность координат if not x or not y or not z then return end -- 20% шанс создания дополнительных мобов if b <= 200 then if a == 1 then -- Создаем мобов первого типа for i = 1, 40 do local c = math.random(200) local d = math.random(200) map.MapCreateCreature(MapID, InstanceID, 9010328, 286 + c, y, 298 + d) end else -- Создаем мобов второго типа for i = 1, 40 do local c = math.random(200) local d = math.random(200) map.MapCreateCreature(MapID, InstanceID, 9010329, 286 + c, y, 298 + d) end end end end -- Регистрация событий атаки боссов aux.RegisterCreatureEvent(9010321, 14, "m9010321_Atak") aux.RegisterCreatureEvent(9010325, 14, "m9010321_Atak")