-- ======================================== -- СОБЫТИЕ СНЕЖНОГО ПИКА (Snow_pik) -- Управление активностью события и боевыми механиками -- ======================================== -- ======================================== -- КОНФИГУРАЦИЯ СИСТЕМЫ -- ======================================== -- Константы для конфигурации local CONFIG = {} CONFIG.MAP_IDS = { FIRST = 940889436, -- Карта для игроков 80-94 уровня SECOND = 940889692, -- Карта для игроков 95+ уровня TELEPORT = 3424073512 -- Карта телепорта } CONFIG.CREATURE_IDS = { BOSS_1 = 9010321, -- Босс первой карты BOSS_2 = 9010325, -- Босс второй карты MOB_1 = 9010322, -- Моб первого типа MOB_2 = 9010326, -- Моб второго типа MOB_3 = 9010323, -- Моб третьего типа MOB_4 = 9010327, -- Моб четвертого типа TELEPORT = 9010319 -- NPC телепорта } CONFIG.POSITIONS = { BOSS = {330, 3401, 410}, -- Позиция босса TELEPORT = {616, 22902, 538} -- Позиция телепорта } CONFIG.BUFFS = { SNOW_BUFFS = { 9807001, 9807101, 9807201, 9807301, 9807401, 9807501, 9807601, 9807701, 9807801, 9807901 }, BOSS_BUFF = 6105801, -- Бафф босса REWARD_BUFF = 9916901 -- Бафф награды } CONFIG.SPAWN_POINTS = { {270, 3239, 469}, {375, 3439, 479}, {424, 3401, 426}, {368, 3401, 397}, {362, 3401, 353}, {396, 3401, 334}, {357, 3403, 290}, {300, 3401, 355}, {292, 3306, 476}, {456, 3401, 382} } -- ======================================== -- ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ -- ======================================== -- Создание мобов на картах -- Создает мобов с случайным смещением позиции local function CreateMobs(MapID, InstanceID) local offset_x = math.random(200) local offset_z = math.random(200) local base_x = 286 local base_y = 3401 local base_z = 298 local mobs = { {CONFIG.CREATURE_IDS.MOB_1, CONFIG.CREATURE_IDS.MOB_2}, {CONFIG.CREATURE_IDS.MOB_3, CONFIG.CREATURE_IDS.MOB_4} } for i = 1, 8 do for j = 1, #mobs do local success1 = map.MapCreateCreature(CONFIG.MAP_IDS.FIRST, InstanceID, mobs[j][1], base_x + offset_x, base_y, base_z + offset_z) local success2 = map.MapCreateCreature(CONFIG.MAP_IDS.SECOND, InstanceID, mobs[j][2], base_x + offset_x, base_y, base_z + offset_z) if not success1 or not success2 then aux.LogError("Failed to create mobs in Snow_OnStart") end end end end -- ======================================== -- УПРАВЛЕНИЕ СОБЫТИЕМ -- ======================================== -- Начало события -- Создает инстансы карт, боссов и мобов function Snow_OnStart(actID) -- Отправляем объявление о начале события local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 102, 900250) msg.DispatchBroadcast(MsgID, -1, -1, -1) -- Создаем инстансы карт map.CreateInstance(CONFIG.MAP_IDS.FIRST, 1) map.CreateInstance(CONFIG.MAP_IDS.SECOND, 1) -- Создаем боссов на обеих картах local oleg1 = map.MapCreateColCreature(CONFIG.MAP_IDS.FIRST, 1, CONFIG.CREATURE_IDS.BOSS_1, CONFIG.POSITIONS.BOSS[1], CONFIG.POSITIONS.BOSS[2], CONFIG.POSITIONS.BOSS[3], 1, "") local oleg2 = map.MapCreateColCreature(CONFIG.MAP_IDS.SECOND, 1, CONFIG.CREATURE_IDS.BOSS_2, CONFIG.POSITIONS.BOSS[1], CONFIG.POSITIONS.BOSS[2], CONFIG.POSITIONS.BOSS[3], 1, "") -- Создаем начальных мобов local c = math.random(200) local d = math.random(200) -- Создаем мобов на обеих картах map.MapCreateCreature(CONFIG.MAP_IDS.FIRST, 1, CONFIG.CREATURE_IDS.MOB_1, 286 + c, 3401, 298 + d) map.MapCreateCreature(CONFIG.MAP_IDS.SECOND, 1, CONFIG.CREATURE_IDS.MOB_2, 286 + c, 3401, 298 + d) map.MapCreateCreature(CONFIG.MAP_IDS.FIRST, 1, CONFIG.CREATURE_IDS.MOB_3, 286 + c, 3401, 298 + d) map.MapCreateCreature(CONFIG.MAP_IDS.SECOND, 1, CONFIG.CREATURE_IDS.MOB_4, 286 + c, 3401, 298 + d) map.MapCreateCreature(CONFIG.MAP_IDS.FIRST, 1, CONFIG.CREATURE_IDS.MOB_1, 286 + c, 3401, 298 + d) map.MapCreateCreature(CONFIG.MAP_IDS.SECOND, 1, CONFIG.CREATURE_IDS.MOB_2, 286 + c, 3401, 298 + d) map.MapCreateCreature(CONFIG.MAP_IDS.FIRST, 1, CONFIG.CREATURE_IDS.MOB_3, 286 + c, 3401, 298 + d) map.MapCreateCreature(CONFIG.MAP_IDS.SECOND, 1, CONFIG.CREATURE_IDS.MOB_4, 286 + c, 3401, 298 + d) map.MapCreateCreature(CONFIG.MAP_IDS.FIRST, 1, CONFIG.CREATURE_IDS.MOB_1, 286 + c, 3401, 298 + d) map.MapCreateCreature(CONFIG.MAP_IDS.SECOND, 1, CONFIG.CREATURE_IDS.MOB_2, 286 + c, 3401, 298 + d) map.MapCreateCreature(CONFIG.MAP_IDS.FIRST, 1, CONFIG.CREATURE_IDS.MOB_3, 286 + c, 3401, 298 + d) map.MapCreateCreature(CONFIG.MAP_IDS.SECOND, 1, CONFIG.CREATURE_IDS.MOB_4, 286 + c, 3401, 298 + d) map.MapCreateCreature(CONFIG.MAP_IDS.FIRST, 1, CONFIG.CREATURE_IDS.MOB_1, 286 + c, 3401, 298 + d) map.MapCreateCreature(CONFIG.MAP_IDS.SECOND, 1, CONFIG.CREATURE_IDS.MOB_2, 286 + c, 3401, 298 + d) map.MapCreateCreature(CONFIG.MAP_IDS.FIRST, 1, CONFIG.CREATURE_IDS.MOB_3, 286 + c, 3401, 298 + d) map.MapCreateCreature(CONFIG.MAP_IDS.SECOND, 1, CONFIG.CREATURE_IDS.MOB_4, 286 + c, 3401, 298 + d) -- Сохраняем ID боссов map.SetMapScriptData(CONFIG.MAP_IDS.FIRST, 1, 1, 2, oleg1) map.SetMapScriptData(CONFIG.MAP_IDS.SECOND, 1, 1, 1, oleg2) -- Создаем телепорт local teleport_create = map.MapCreateColCreature(CONFIG.MAP_IDS.TELEPORT, -1, CONFIG.CREATURE_IDS.TELEPORT, CONFIG.POSITIONS.TELEPORT[1], CONFIG.POSITIONS.TELEPORT[2], CONFIG.POSITIONS.TELEPORT[3], 1, "") map.SetMapScriptData(CONFIG.MAP_IDS.TELEPORT, -1, 1, 3, teleport_create) end -- Окончание события -- Очищает все созданные объекты function Snow_OnEnd(actID) -- Удаляем инстансы карт -- Сначала выкидываем всех игроков из каждого инстанса local instances = { {mapID = CONFIG.MAP_IDS.FIRST, instanceID = 1}, {mapID = CONFIG.MAP_IDS.SECOND, instanceID = 1} } for _, inst in ipairs(instances) do local RoleTbl = map.GetMapAllRoleID(inst.mapID, inst.instanceID) if RoleTbl ~= nil then for k, v in pairs(RoleTbl) do if v ~= nil and v ~= 0 then -- Проверяем, что игрок действительно в этом инстансе local playerMap, playerInstance = role.GetRoleMapID(v) if playerMap == inst.mapID and playerInstance == inst.instanceID then -- Выкидываем на безопасную карту выхода role.RoleGotoNewMap(inst.mapID, inst.instanceID, v, 3424073512, 610, 23094, 669) end end end end map.DeleteInstance(inst.mapID, inst.instanceID) end -- Удаляем телепорт local teleport = map.GetMapScriptData(CONFIG.MAP_IDS.TELEPORT, -1, 1, 3) if teleport then map.MapDeleteCreature(CONFIG.MAP_IDS.TELEPORT, -1, teleport) end end -- ======================================== -- ОБРАБОТКА СМЕРТИ БОССА -- ======================================== -- Обработка смерти босса -- Выдает награды команде, убившей босса function c9010325_Die(MapID, InstanceID, CreatureID, CreatureTypeID, KillerID) -- Отправляем сообщение о смерти босса local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 101, 950371) msg.DispatchMapMsgEvent(MsgID, MapID, InstanceID) -- Получаем всех игроков на карте local players = map.GetMapAllRoleID(MapID, InstanceID) if not players then return end -- Выдаем награду за убийство босса if CreatureTypeID == CONFIG.CREATURE_IDS.BOSS_1 or CreatureTypeID == CONFIG.CREATURE_IDS.BOSS_2 then aux.MultiRateReward(1, 300, 46800) -- Добавляем баффы команде local TeamID = role.IsRoleHaveTeam(MapID, InstanceID, KillerID) if not TeamID or TeamID == 4294967295 then -- Одиночный игрок unit.AddBuff(MapID, InstanceID, KillerID, CONFIG.BUFFS.REWARD_BUFF, KillerID) else -- Команда local Role = {} Role[1], Role[2], Role[3], Role[4], Role[5], Role[6] = role.GetRoleTeamMemID(TeamID) for i = 1, 6 do if Role[i] and Role[i] ~= 4294967295 then unit.AddBuff(MapID, InstanceID, Role[i], CONFIG.BUFFS.REWARD_BUFF, Role[i]) end end end end end -- Регистрация событий активности aux.RegisterActEvent(1170, 2, "Snow_OnStart") aux.RegisterActEvent(1170, 3, "Snow_OnEnd") aux.RegisterCreatureEvent(CONFIG.CREATURE_IDS.BOSS_2, 4, "c9010325_Die") aux.RegisterCreatureEvent(CONFIG.CREATURE_IDS.BOSS_1, 4, "c9010325_Die") -- ======================================== -- ДИАЛОГ С СНЕЖНЫМ МОБОМ -- ======================================== -- Диалог со снежным мобом -- Выдает случайные баффы и создает новых мобов function c9010330_On_Talk(MapID, InstanceID, TargetID, TargetTypeID, RoleID, TalkIndex) -- Проверяем существование необходимых параметров if not MapID or not InstanceID or not TargetID or not RoleID then return end local x, y, z = unit.GetPosition(MapID, InstanceID, RoleID) local rolelevel = role.GetRoleLevel(MapID, InstanceID, RoleID) if TalkIndex == -1 then -- Основное меню снежного моба local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 20, 950351) -- Описание снежного моба msg.AddMsgEvent(MsgID, 24, TargetID) msg.AddMsgEvent(MsgID, 21, 4) msg.AddMsgEvent(MsgID, 1, 950352) -- OK msg.DispatchRoleMsgEvent(RoleID, MsgID) elseif TalkIndex == 4 then -- Обработка взаимодействия со снежным мобом local buff_oleg = { 9807001, 9807101, 9807201, 9807301, 9807401, 9807501, 9807601, 9807701, 9807801, 9807901 } local b_r = math.random(10) -- Случайный бафф local oleg1 = map.GetMapScriptData(CONFIG.MAP_IDS.FIRST, 1, 1, 2) local oleg2 = map.GetMapScriptData(CONFIG.MAP_IDS.SECOND, 1, 1, 1) local all = map.GetMapAllRoleID(MapID, InstanceID) local players_map = {RoleID, all} local p_r = math.random(2) if MapID == CONFIG.MAP_IDS.FIRST then -- Обработка для первой карты if math.random(10) == 1 then -- 10% шанс удаления моба и отмены баффа босса if TargetID and TargetID > 0 then map.MapDeleteCreature(CONFIG.MAP_IDS.FIRST, InstanceID, TargetID) end if oleg1 and oleg1 > 0 then unit.CancelBuff(CONFIG.MAP_IDS.FIRST, 1, oleg1, CONFIG.BUFFS.BOSS_BUFF) end elseif math.random(10) > 1 then -- 90% шанс обычной обработки if TargetID and TargetID > 0 then map.MapDeleteCreature(CONFIG.MAP_IDS.FIRST, InstanceID, TargetID) end if b_r == 9 or b_r == 8 then -- Командные баффы if all and all > 0 then unit.AddBuff(CONFIG.MAP_IDS.FIRST, InstanceID, all, buff_oleg[b_r]) end unit.AddBuff(CONFIG.MAP_IDS.FIRST, InstanceID, RoleID, buff_oleg[b_r]) local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 101, 950362) msg.DispatchMapMsgEvent(MsgID, CONFIG.MAP_IDS.FIRST, InstanceID) -- Создаем нового снежного моба local ran = math.random(10) local sneg = map.MapCreateColCreature(CONFIG.MAP_IDS.FIRST, 1, 9010330, CONFIG.SPAWN_POINTS[ran][1], CONFIG.SPAWN_POINTS[ran][2], CONFIG.SPAWN_POINTS[ran][3], 1, "") elseif b_r == 1 or b_r == 2 or b_r == 3 or b_r == 4 or b_r == 5 or b_r == 6 or b_r == 7 or b_r == 10 then -- Индивидуальные баффы unit.AddBuff(CONFIG.MAP_IDS.FIRST, InstanceID, RoleID, buff_oleg[b_r]) local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 101, 950362) msg.DispatchMapMsgEvent(MsgID, CONFIG.MAP_IDS.FIRST, InstanceID) -- Создаем нового снежного моба local ran = math.random(10) local sneg = map.MapCreateColCreature(CONFIG.MAP_IDS.FIRST, 1, 9010330, CONFIG.SPAWN_POINTS[ran][1], CONFIG.SPAWN_POINTS[ran][2], CONFIG.SPAWN_POINTS[ran][3], 1, "") end end elseif MapID == CONFIG.MAP_IDS.SECOND then -- Обработка для второй карты if math.random(10) == 1 then -- 10% шанс удаления моба и отмены баффа босса if oleg2 and oleg2 > 0 then unit.CancelBuff(CONFIG.MAP_IDS.SECOND, 1, oleg2, CONFIG.BUFFS.BOSS_BUFF) end if TargetID and TargetID > 0 then map.MapDeleteCreature(CONFIG.MAP_IDS.SECOND, InstanceID, TargetID) end elseif math.random(10) > 1 then -- 90% шанс обычной обработки if TargetID and TargetID > 0 then map.MapDeleteCreature(CONFIG.MAP_IDS.SECOND, InstanceID, TargetID) end if b_r == 9 or b_r == 8 then -- Командные баффы if all and all > 0 then unit.AddBuff(CONFIG.MAP_IDS.SECOND, InstanceID, all, buff_oleg[b_r]) end unit.AddBuff(CONFIG.MAP_IDS.SECOND, InstanceID, RoleID, buff_oleg[b_r]) local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 101, 950362) msg.DispatchMapMsgEvent(MsgID, CONFIG.MAP_IDS.SECOND, InstanceID) -- Создаем нового снежного моба local ran = math.random(10) map.MapCreateColCreature(CONFIG.MAP_IDS.SECOND, 1, 9010330, CONFIG.SPAWN_POINTS[ran][1], CONFIG.SPAWN_POINTS[ran][2], CONFIG.SPAWN_POINTS[ran][3], 1, "") elseif b_r == 1 or b_r == 2 or b_r == 3 or b_r == 4 or b_r == 5 or b_r == 6 or b_r == 7 or b_r == 10 then -- Индивидуальные баффы unit.AddBuff(CONFIG.MAP_IDS.SECOND, InstanceID, RoleID, buff_oleg[b_r]) -- Создаем нового снежного моба local ran = math.random(10) map.MapCreateColCreature(CONFIG.MAP_IDS.SECOND, 1, 9010330, CONFIG.SPAWN_POINTS[ran][1], CONFIG.SPAWN_POINTS[ran][2], CONFIG.SPAWN_POINTS[ran][3], 1, "") local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 101, 950362) msg.DispatchMapMsgEvent(MsgID, CONFIG.MAP_IDS.SECOND, InstanceID) end end end end end -- Регистрация события диалога со снежным мобом aux.RegisterCreatureEvent(9010330, 7, "c9010330_On_Talk") -- ======================================== -- ПОКАЗ ВРЕМЕНИ СОБЫТИЯ -- ======================================== -- Показ оставшегося времени события игроку -- Рассчитывает время на основе текущей минуты function Show_pik_PlayerEnter(MapID, InstanceID, RoleID) local Min = tonumber(os.date("%M")) local leftSec = 0 -- Таблица соответствия минут и оставшегося времени (в секундах) local timeTable = { [0] = 3600, [1] = 3540, [2] = 3480, [3] = 3420, [4] = 3360, [5] = 3300, [6] = 3240, [7] = 3180, [8] = 3120, [9] = 3060, [10] = 3000, [11] = 2940, [12] = 2880, [13] = 2820, [14] = 2760, [15] = 2700, [16] = 2640, [17] = 2580, [18] = 2520, [19] = 2460, [20] = 2400, [21] = 2340, [22] = 2280, [23] = 2220, [24] = 2160, [25] = 2100, [26] = 2040, [27] = 1980, [28] = 1920, [29] = 1860, [30] = 1800, [31] = 1740, [32] = 1680, [33] = 1620, [34] = 1560, [35] = 1500, [36] = 1440, [37] = 1380, [38] = 1320, [39] = 1260, [40] = 1200, [41] = 1140, [42] = 1080, [43] = 1020, [44] = 960, [45] = 900, [46] = 840, [47] = 780, [48] = 720, [49] = 660, [50] = 600, [51] = 540, [52] = 480, [53] = 420, [54] = 360, [55] = 300, [56] = 240, [57] = 180, [58] = 120, [59] = 60 } -- Получаем оставшееся время из таблицы leftSec = timeTable[Min] or 0 -- Отправляем время игроку local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 16, 28) msg.AddMsgEvent(MsgID, 16, leftSec) msg.DispatchRoleMsgEvent(RoleID, MsgID) end -- Регистрация событий входа на карты aux.RegisterMapEvent("sn_01", 2, "Show_pik_PlayerEnter") aux.RegisterMapEvent("sn_02", 2, "Show_pik_PlayerEnter")