-- -- Система Kerub - еженедельное событие с рейтингом -- -- Координаты спавна для разных карт -- KerubCord_s11 = {} -- Координаты для карты s11 -- KerubCord_s08 = {} -- Координаты для карты s08 -- KerubCord_s09 = {} -- Координаты для карты s09 -- KerubCord_s11[1] = {953, 2158, 692} -- KerubCord_s11[2] = {1299, 3012, 779} -- KerubCord_s11[3] = {1645, 4179, 1204} -- KerubCord_s11[4] = {1621, 4163, 1564} -- KerubCord_s11[5] = {1235, 4193, 1696} -- KerubCord_s11[6] = {763, 2992, 1501} -- KerubCord_s11[7] = {350, 3587, 980} -- KerubCord_s08[1] = {1910, 9634, 2114} -- KerubCord_s08[2] = {2724, 10293, 2523} -- KerubCord_s08[3] = {2752, 16723, 1466} -- KerubCord_s08[4] = {2533, 9236, 556} -- KerubCord_s08[5] = {1750, 12591, 470} -- KerubCord_s08[6] = {1222, 4461, 1028} -- KerubCord_s08[7] = {447, 12558, 445} -- KerubCord_s09[1] = {1207, 6255, 1093} -- KerubCord_s09[2] = {1132, 6362, 643} -- KerubCord_s09[3] = {1735, 7610, 829} -- KerubCord_s09[4] = {1454, 6697, 1571} -- KerubCord_s09[5] = {1324, 7404, 352} -- KerubCord_s09[6] = {974, 7129, 378} -- KerubCord_s09[7] = {1394, 6128, 1024} -- -- ID существ для системы Kerub -- KerubTeleportID = 9010688 -- ID NPC для телепортации -- -- ID мобов и боссов для разных карт -- Kerub_s11_MobID = 9010686 -- Обычный моб на карте s11 -- Kerub_s11_BOSSID = 9010687 -- Босс на карте s11 -- Kerub_s09_MobID = 9010684 -- Обычный моб на карте s09 -- Kerub_s09_BOSSID = 9010685 -- Босс на карте s09 -- Kerub_s08_MobID = 9010682 -- Обычный моб на карте s08 -- Kerub_s08_BOSSID = 9010683 -- Босс на карте s08 -- -- Таймер для системы рейтинга Kerub -- -- Запускается каждый час и обрабатывает события -- function KerubRating_Timer(actID) -- -- Получение текущего времени -- local curmon = tonumber(os.date("%m")) -- local curday = tonumber(os.date("%d")) -- local curyear = tonumber(os.date("%Y")) -- local curhour = tonumber(os.date("%H")) -- local curmin = tonumber(os.date("%M")) -- -- Спавн монстров за 5 минут до часа (в 55 минут) -- if curmin == 55 then -- SpawnKerubMonsters() -- end -- -- Обработка рейтинга в воскресенье в 23:59 -- local day = os.date("%A") -- if day == "Sunday" and (curhour == 23 and curmin == 59) then -- local rating_count, RoleID_rating, RoleID_point, _,_ = Kerub_getinfo(0,0,0) -- local rating_count = tonumber(rating_count) -- clear_Kerub_reiting2() -- -- Обновление данных для всех игроков в рейтинге -- for k = 1, rating_count do -- KerubUpdate(RoleID_rating[k], RoleID_point[k]) -- end -- -- Очистка рейтинга -- clear_Kerub_reiting() -- end -- end -- -- Регистрация таймера события -- aux.RegisterActEvent(1225, 4, "KerubRating_Timer") -- -- Функция спавна монстров Kerub на всех картах -- function SpawnKerubMonsters() -- -- Выбор случайных позиций для спавна (от 1 до 7) -- local a = math.random(7) -- Позиция для карты s11 -- local b = math.random(7) -- Позиция для карты s08 -- local c = math.random(7) -- Позиция для карты s09 -- -- Спавн обычных монстров (9 штук на каждой карте) -- for i = 1, 9 do -- map.MapCreateColCreature(3440849960, -1, Kerub_s11_MobID, KerubCord_s11[a][1], KerubCord_s11[a][2], KerubCord_s11[a][3], 1, "") -- map.MapCreateColCreature(3424075048, -1, Kerub_s08_MobID, KerubCord_s08[b][1], KerubCord_s08[b][2], KerubCord_s08[b][3], 1, "") -- map.MapCreateColCreature(3424074792, -1, Kerub_s09_MobID, KerubCord_s09[c][1], KerubCord_s09[c][2], KerubCord_s09[c][3], 1, "") -- end -- -- Спавн боссов на каждой карте -- map.MapCreateColCreature(3440849960, -1, Kerub_s11_BOSSID, KerubCord_s11[a][1], KerubCord_s11[a][2], KerubCord_s11[a][3], 1, "") -- map.MapCreateColCreature(3424075048, -1, Kerub_s08_BOSSID, KerubCord_s08[b][1], KerubCord_s08[b][2], KerubCord_s08[b][3], 1, "") -- map.MapCreateColCreature(3424074792, -1, Kerub_s09_BOSSID, KerubCord_s09[c][1], KerubCord_s09[c][2], KerubCord_s09[c][3], 1, "") -- -- Спавн NPC для телепортации на всех позициях (7 NPC на каждой карте) -- for d = 1, 7 do -- map.MapCreateColCreature(3440849960, -1, KerubTeleportID, KerubCord_s11[d][1], KerubCord_s11[d][2], KerubCord_s11[d][3], 1, "") -- map.MapCreateColCreature(3424075048, -1, KerubTeleportID, KerubCord_s08[d][1], KerubCord_s08[d][2], KerubCord_s08[d][3], 1, "") -- map.MapCreateColCreature(3424074792, -1, KerubTeleportID, KerubCord_s09[d][1], KerubCord_s09[d][2], KerubCord_s09[d][3], 1, "") -- end -- -- Сохранение выбранных позиций в данных карты -- map.SetMapScriptData(3440849960,-1,1,2,a) -- map.SetMapScriptData(3424075048,-1,1,2,b) -- map.SetMapScriptData(3424074792,-1,1,2,c) -- -- Отправка системных сообщений о начале события -- -- Сообщения для карты s08 -- for x1 = 900293,900294 do -- local MsgID = msg.BeginMsgEvent() -- msg.AddMsgEvent(MsgID, 102, x1) -- msg.DispatchMapMsgEvent(MsgID,3424075048,-1,-1) -- end -- -- Сообщения для карты s09 -- for x2 = 900295,900296 do -- local MsgID = msg.BeginMsgEvent() -- msg.AddMsgEvent(MsgID, 102, x2) -- msg.DispatchMapMsgEvent(MsgID,3424074792,-1,-1) -- end -- -- Сообщения для карты s11 -- for x3 = 900297,900298 do -- local MsgID = msg.BeginMsgEvent() -- msg.AddMsgEvent(MsgID, 102, x3) -- msg.DispatchMapMsgEvent(MsgID,3440849960,-1,-1) -- end -- end -- -- Функция обработки смерти монстров Kerub -- -- Выдает награды игрокам в зависимости от уровня и типа убитого существа -- function KerubMobs_OnDie(MapID, InstanceID, TargetID, TargetTypeID, RoleID) -- -- Получение уровня игрока -- local lev = role.GetRoleLevel(MapID, InstanceID, RoleID) -- -- Награды за убийство обычных мобов -- if TargetTypeID == 9010682 and lev >= 90 and lev <= 99 then -- -- Обычный моб на карте s08, уровень игрока 90-99 -- role.AddRoleItem(MapID, InstanceID, RoleID, 6601811, 1, -1, 8, 420) -- elseif TargetTypeID == 9010684 and lev >= 100 and lev <= 106 then -- -- Обычный моб на карте s09, уровень игрока 100-106 -- role.AddRoleItem(MapID, InstanceID, RoleID, 6601811, 1, -1, 8, 420) -- elseif TargetTypeID == 9010686 and lev > 106 then -- -- Обычный моб на карте s11, уровень игрока >106 -- role.AddRoleItem(MapID, InstanceID, RoleID, 6601811, 1, -1, 8, 420) -- -- Награды за убийство боссов (увеличенная награда) -- elseif TargetTypeID == 9010683 and lev >= 90 and lev <= 99 then -- -- Босс на карте s08, уровень игрока 90-99 -- role.AddRoleItem(MapID, InstanceID, RoleID, 6601811, 4, -1, 8, 420) -- elseif TargetTypeID == 9010685 and lev >= 100 and lev <= 106 then -- -- Босс на карте s09, уровень игрока 100-106 -- role.AddRoleItem(MapID, InstanceID, RoleID, 6601811, 4, -1, 8, 420) -- elseif TargetTypeID == 9010687 and lev > 106 then -- -- Босс на карте s11, уровень игрока >106 -- role.AddRoleItem(MapID, InstanceID, RoleID, 6601811, 4, -1, 8, 420) -- end -- end -- -- Регистрация обработчика смерти для всех типов монстров Kerub -- for m = 9010682, 9010687 do -- aux.RegisterCreatureEvent(m, 4, "KerubMobs_OnDie") -- end -- -- Функция обработки диалога с NPC телепортации Kerub -- -- Позволяет игрокам телепортироваться к месту спавна монстров -- function n9010688_OnTalk(MapID, InstanceID, TargetID, TargetTypeID, RoleID, TalkIndex) -- -- Получение сохраненной позиции спавна для текущей карты -- local n = map.GetMapScriptData(MapID,InstanceID,1,2) -- -- Определение координат в зависимости от карты -- if MapID == 3440849960 then -- KerubCord = KerubCord_s11 -- Карта s11 -- elseif MapID == 3424074792 then -- KerubCord = KerubCord_s09 -- Карта s09 -- else -- KerubCord = KerubCord_s08 -- Карта s08 -- end -- if TalkIndex == -1 then -- -- Показ начального диалога -- local MsgID = msg.BeginMsgEvent() -- msg.AddMsgEvent(MsgID, 20, 951123) -- msg.AddMsgEvent(MsgID, 24, TargetID) -- ID NPC -- msg.AddMsgEvent(MsgID, 21, 4) -- msg.AddMsgEvent(MsgID, 1, 100001) -- "Да" -- msg.AddMsgEvent(MsgID, 21, -1) -- msg.AddMsgEvent(MsgID, 1, 951135) -- "Отмена" -- msg.DispatchRoleMsgEvent(RoleID, MsgID) -- else -- -- Телепортация игрока к месту спавна монстров -- role.RoleGotoNewMap(MapID, InstanceID, RoleID, MapID, KerubCord[n][1],KerubCord[n][2],KerubCord[n][3]) -- end -- end -- -- Регистрация обработчика диалога для NPC телепортации -- aux.RegisterCreatureEvent(9010688, 7, "n9010688_OnTalk") -- -- Функция обработки диалога с NPC рейтинга Kerub -- -- Показывает рейтинг игроков и позволяет получить награды -- function n9010689_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 curhour = tonumber(os.date("%H")) -- local curmin = tonumber(os.date("%M")) -- local day = os.date("%A") -- -- Получение рейтинговых очков игрока -- local _, _, _, my_rating_point, _ = Kerub_getinfo(RoleID, 0, 0) -- -- Проверка на время окончания события (воскресенье 23:58-23:59) -- if day == "Sunday" and (curhour == 23 and (curmin == 58 or curmin == 59)) then -- local MsgID = msg.BeginMsgEvent() -- msg.AddMsgEvent(MsgID, 20, 930425) -- msg.AddMsgEvent(MsgID, 24, TargetID) -- ID NPC -- msg.AddMsgEvent(MsgID, 21, -1) -- msg.AddMsgEvent(MsgID, 1, 951137) -- "OK" -- msg.DispatchRoleMsgEvent(RoleID, MsgID) -- return 0 -- end -- if TalkIndex == -1 then -- -- Определение ранга игрока в рейтинге -- local Rank = 0 -- local index = 0 -- local rating_count, RoleID_rating, _, _, gift_flag = Kerub_getinfo2(RoleID,0,0) -- if tonumber(rating_count) == 0 then -- Rank = 0 -- Игрок не в рейтинге -- elseif tonumber(rating_count) > 0 then -- -- Поиск позиции игрока в рейтинге -- for d = 1, tonumber(rating_count) do -- if tonumber(RoleID_rating[d]) == RoleID then -- Rank = d -- break -- end -- end -- end -- -- Формирование диалогового окна в зависимости от ранга игрока -- local MsgID = msg.BeginMsgEvent() -- if Rank == 0 then -- -- Игрок не в рейтинге -- msg.AddMsgEvent(MsgID, 20, 951124) -- msg.AddMsgEvent(MsgID, 24, TargetID) -- msg.AddMsgEvent(MsgID, 2, RoleID) -- elseif Rank >= 1 then -- -- Игрок в рейтинге, показываем его позицию -- msg.AddMsgEvent(MsgID, 20, 951126) -- msg.AddMsgEvent(MsgID, 24, TargetID) -- msg.AddMsgEvent(MsgID, 2, RoleID) -- msg.AddMsgEvent(MsgID, 9, Rank) -- end -- -- Добавление опций меню -- msg.AddMsgEvent(MsgID, 21, 55) -- msg.AddMsgEvent(MsgID, 1, 951128) -- "Посмотреть рейтинг игроков" -- msg.AddMsgEvent(MsgID, 21, 56) -- msg.AddMsgEvent(MsgID, 1, 951129) -- "Посмотреть мои очки рейтинга" -- msg.AddMsgEvent(MsgID, 21, 51) -- "О рейтинге" -- msg.AddMsgEvent(MsgID, 1, 951130) -- ID MSG "О рейтинге" -- -- Опция получения награды доступна только для игроков в рейтинге -- if Rank >= 1 then -- msg.AddMsgEvent(MsgID, 21, 6) -- msg.AddMsgEvent(MsgID, 1, 930421) -- "Получить награду" -- end -- msg.AddMsgEvent(MsgID, 21, -1) -- msg.AddMsgEvent(MsgID, 1, 951135) -- "Отмена" -- msg.DispatchRoleMsgEvent(RoleID, MsgID) -- elseif TalkIndex == 51 then -- -- Показ информации о рейтинге -- local MsgID = msg.BeginMsgEvent() -- msg.AddMsgEvent(MsgID, 20, 951134) -- msg.AddMsgEvent(MsgID, 24, TargetID) -- ID NPC -- msg.AddMsgEvent(MsgID, 21, -1) -- msg.AddMsgEvent(MsgID, 1, 951137) -- "OK" -- msg.DispatchRoleMsgEvent(RoleID, MsgID) -- elseif TalkIndex == 56 then -- -- Показ очков рейтинга игрока -- local MsgID = msg.BeginMsgEvent() -- msg.AddMsgEvent(MsgID, 20, 951133) -- msg.AddMsgEvent(MsgID, 24, TargetID) -- ID NPC -- msg.AddMsgEvent(MsgID, 2, RoleID) -- msg.AddMsgEvent(MsgID, 9, tonumber(my_rating_point)) -- msg.AddMsgEvent(MsgID, 21, -1) -- msg.AddMsgEvent(MsgID, 1, 951137) -- "OK" -- msg.DispatchRoleMsgEvent(RoleID, MsgID) -- elseif TalkIndex == 55 then -- -- Показ топ-10 рейтинга игроков -- local rating_count, RoleID_rating, RoleID_point, _,_ = Kerub_getinfo(RoleID,0,0) -- local rating_count = tonumber(rating_count) -- local reitcount = KerubGetCountReiting(RoleID) -- local MsgID = msg.BeginMsgEvent() -- if reitcount < 1 then -- -- Рейтинг пустой -- msg.AddMsgEvent(MsgID, 20, 951132) -- Топ игроков рейтинга -- msg.AddMsgEvent(MsgID, 24, TargetID) -- ID NPC -- else -- -- Показ топ-10 игроков -- msg.AddMsgEvent(MsgID, 20, 951132) -- Топ игроков рейтинга -- msg.AddMsgEvent(MsgID, 24, TargetID) -- ID NPC -- for i = 1, reitcount do -- msg.AddMsgEvent(MsgID, 2, tonumber(RoleID_rating[i])) -- msg.AddMsgEvent(MsgID, 9, tonumber(RoleID_point[i])) -- end -- end -- msg.AddMsgEvent(MsgID, 21, -1) -- msg.AddMsgEvent(MsgID, 1, 951137) -- "OK" -- msg.DispatchRoleMsgEvent(RoleID, MsgID) -- elseif TalkIndex == 6 then -- -- Получение награды за позицию в рейтинге -- local Rank = 0 -- local index = 0 -- local rating_count, RoleID_rating, _, _, gift_flag = Kerub_getinfo2(RoleID,0,0) -- -- Определение ранга игрока -- if tonumber(rating_count) == 0 then -- Rank = 0 -- elseif tonumber(rating_count) > 0 then -- for d = 1, tonumber(rating_count) do -- if tonumber(RoleID_rating[d]) == RoleID then -- Rank = d -- break -- end -- end -- end -- local MsgID = msg.BeginMsgEvent() -- if Rank == 0 then -- -- Игрок не в рейтинге -- msg.AddMsgEvent(MsgID, 20, 951125) -- Вы не участвовали в событии Kerub, поэтому не можете получить награду. -- msg.AddMsgEvent(MsgID, 24, TargetID) -- ID NPC -- msg.AddMsgEvent(MsgID, 2, RoleID) -- else -- if tonumber(gift_flag) == 1 then -- -- Награда уже получена -- msg.AddMsgEvent(MsgID, 20, 951127) -- Вы уже получили награду за участие в рейтинге. -- msg.AddMsgEvent(MsgID, 24, TargetID) -- ID NPC -- msg.AddMsgEvent(MsgID, 2, RoleID) -- msg.AddMsgEvent(MsgID, 9, Rank) -- else -- -- Проверка свободного места в инвентаре -- if role.GetBagFreeSize(RoleID) < 2 then -- msg.AddMsgEvent(MsgID, 20, 950167) -- Недостаточно места в инвентаре. Необходимо 2 свободных слота для получения награды. -- msg.AddMsgEvent(MsgID, 24, TargetID) -- ID NPC -- else -- -- Выдача награды в зависимости от ранга -- if Rank == 1 then -- -- 1 место - специальная награда -- role.AddRoleItem(MapID, InstanceID, RoleID, 3020148, 20, 6, 8, 420) -- Kerub_getinfo2(RoleID,0,2) -- Отметка о получении награды -- elseif Rank == 2 then -- -- 2 место -- role.AddRoleItem(MapID, InstanceID, RoleID, 3020144, 20, 6, 8, 420) -- Kerub_getinfo2(RoleID,0,2) -- elseif Rank == 3 then -- -- 3 место -- role.AddRoleItem(MapID, InstanceID, RoleID, 3020142, 20, 6, 8, 420) -- Kerub_getinfo2(RoleID,0,2) -- elseif Rank >= 4 and Rank <= 10 then -- -- 4-10 места -- role.AddRoleItem(MapID, InstanceID, RoleID, 3020140, 20, 6, 8, 420) -- Kerub_getinfo2(RoleID,0,2) -- end -- end -- end -- end -- msg.AddMsgEvent(MsgID, 21, -1) -- msg.AddMsgEvent(MsgID, 1, 951137) -- "OK" -- msg.DispatchRoleMsgEvent(RoleID, MsgID) -- end -- end -- aux.RegisterCreatureEvent(9010689, 7, "n9010689_OnTalk") -- -- Функция проверки возможности использования предмета награды Kerub -- function I6601811_CanUse(MapID, InstanceID, ItemID, TargetID) -- -- Получение текущего времени -- local curmon = tonumber(os.date("%m")) -- local curday = tonumber(os.date("%d")) -- local curyear = tonumber(os.date("%Y")) -- local curhour = tonumber(os.date("%H")) -- local curmin = tonumber(os.date("%M")) -- local day = os.date("%A") -- local bRet, bIgnore = 0, false -- -- Предмет можно использовать только в воскресенье в 23:58-23:59 -- if day == "Sunday" and (curhour == 23 and (curmin == 58 or curmin == 59)) then -- local MsgID = msg.BeginMsgEvent() -- msg.AddMsgEvent(MsgID, 26, 951139) -- Сообщение о том, что предмет нельзя использовать в это время -- msg.DispatchRoleMsgEvent(TargetID, MsgID) -- bRet = 102 -- Код ошибки: предмет нельзя использовать -- end -- return bRet, bIgnore -- end -- -- Регистрация проверки использования предмета -- aux.RegisterItemEvent(6601811, 0, "I6601811_CanUse") -- -- Функция обработки открытия подарка Kerub -- function I6601811_GiftBag(MapID, InstanceID, ItemID, TargetID) -- -- Добавление очков рейтинга игроку -- Kerub_getinfo(TargetID, 1, 1) -- end -- -- Регистрация обработки использования предмета -- aux.RegisterItemEvent(6601811, 1, "I6601811_GiftBag") -- -- Функция подсчета количества игроков в топ-10 рейтинга Kerub -- function KerubGetCountReiting(RoleID) -- local count = 0 -- local rating_count2, RoleID_rating2, RoleID_point2, my_rating_point2, gift_flag2 = Kerub_getinfo(RoleID, 0, 0) -- -- Подсчет валидных записей в топ-10 -- for i = 1, 10 do -- if RoleID_rating2[i] and tonumber(RoleID_rating2[i]) and tonumber(RoleID_rating2[i]) > 0 then -- count = count + 1 -- end -- end -- return count -- end