-- Система активности "Истина или Ложь" - управление BOSS в 7 областях -- Записывает данные активности, контролирует спавн BOSS и систему прогресса -- Глобальные переменные (закомментированные) -- emozhizi_alive = 0 -- Флаг активности специального NPC "Магический посланник" -- RoleDataType["zhenjiaVIP"] - хранит дату последней VIP награды игрока --[[ ======================================== КОНСТАНТЫ И НАСТРОЙКИ ======================================== ]] -- ID активности local ACTIVITY_ID = 28 local ACTIVITY_ID_ALT = 1180 -- ID карт и инстансов local MAP_IDS = { INSTANCE_1 = 2766543506, INSTANCE_2 = 2766543250, INSTANCE_3 = 2766542994, MAIN_MAP = 3424073512 } -- ID NPC local NPC_IDS = { BOSS_NPC = 6010067, EXIT_NPC = 6010069, DOOR_NPC = 6010070 } -- ID монстров local MONSTER_IDS = { SMALL_MONSTER_BASE = 2055003, BOSS_BASE = 2055018, SPECIAL_BOSS = 2055025 } -- ID предметов local ITEM_IDS = { QUEST_ITEM = 6600883, REWARD_ITEM_1 = 4090015, REWARD_ITEM_2 = 4090016, BOSS_REWARD = 4800232 } -- ID баффов local BUFF_IDS = { FIRE_BUFF = 5935401, WATER_BUFF = 5935501, SPECIAL_BUFF = 5935601, BOSS_BUFF = 5935001, SPECIAL_BOSS_BUFF = 5935201 } -- ID сообщений local MESSAGE_IDS = { ACTIVITY_START = 100118, BOSS_SPAWN = 700106, BOSS_KILLED = 206114, ALL_BOSSES_KILLED = 206115, WORLD_ANNOUNCEMENT = 206156 } -- Настройки времени local TIME_SETTINGS = { MAX_TIMER = 54, BOSS_SPAWN_TIME = 90, MONSTER_SPAWN_INTERVALS = {18, 15, 12, 9, 6, 3} } -- Настройки уровней local LEVEL_SETTINGS = { MIN_LEVEL = 55, MAX_LEVEL_1 = 80, MAX_LEVEL_2 = 104, MAX_LEVEL_3 = 121 } --[[ ======================================== ОСНОВНЫЕ ФУНКЦИИ СОБЫТИЙ ======================================== ]] --[[ Функция: Начало события Параметры: - actID: ID активности Действия: - Инициализирует все системы события - Создает инстансы карт - Устанавливает начальные параметры - Отправляет уведомление о начале события ]] -- Начало активности "Истина или Ложь" -- Инициализирует все системы и создает инстансы карт function BOSS_TrueOrFalse_OnStart(actID) -- Проверяем входные параметры if actID == nil then return end -- Уменьшаем счетчики активности (система предотвращения багов) if act.GetActScriptData(ACTIVITY_ID, 1, 1) > 0 then act.SetActScriptData(ACTIVITY_ID, 1, 1, act.GetActScriptData(ACTIVITY_ID, 1, 1) - 1) end if act.GetActScriptData(ACTIVITY_ID, 1, 2) > 0 then act.SetActScriptData(ACTIVITY_ID, 1, 2, act.GetActScriptData(ACTIVITY_ID, 1, 2) - 1) end -- Сохраняем изменения данных активности act.SaveActScriptData(ACTIVITY_ID) -- Сбрасываем таймер активности BOSS_TrueOrFalse_TimerMin = 0 B_T_CreaturePoint = {} B_T_CreaturePoint[1] = {{x=249,y=1067,z=883},{x=252,y=1067,z=810},{x=425,y=1067,z=820},{x=432,y=1067,z=887},{x=337,y=1067,z=801}} B_T_CreaturePoint[2] = {{x=648,y=1821,z=866},{x=710,y=1208,z=717},{x=591,y=1208,z=707},{x=650,y=1208,z=714},{x=646,y=1208,z=827}} B_T_CreaturePoint[3] = {{x=856,y=124,z=896},{x=856,y=124,z=842},{x=857,y=124,z=633},{x=857,y=124,z=737},{x=856,y=124,z=684}} B_T_CreaturePoint[4] = {{x=198,y=1013,z=610},{x=192,y=1013,z=503},{x=100,y=1013,z=505},{x=97,y=1013,z=615},{x=141,y=1013,z=605}} B_T_CreaturePoint[5] = {{x=451,y=1123,z=652},{x=487,y=1123,z=567},{x=487,y=1123,z=495},{x=415,y=1123,z=514},{x=420,y=1123,z=586}} B_T_CreaturePoint[6] = {{x=232,y=1212,z=234},{x=236,y=1212,z=136},{x=357,y=1213,z=153},{x=359,y=1213,z=223},{x=237,y=1214,z=188}} B_T_CreaturePoint[7] = {{x=723,y=851,z=242},{x=741,y=849,z=181},{x=715,y=851,z=107},{x=873,y=851,z=136},{x=884,y=851,z=226}} B_T_Entrance = {} B_T_Entrance[1] = {{x=339,y=41,z=972},{x=321,y=21,z=744},{x=470,y=21,z=783}} B_T_Entrance[2] = {{x=732,y=43,z=924},{x=563,y=43,z=917},{x=734,y=36,z=868}} B_T_Entrance[3] = {{x=856,y=13,z=971},{x=899,y=10,z=955},{x=813,y=10,z=954}} B_T_Entrance[4] = {{x=70,y=20,z=558},{x=219,y=20,z=560},{x=146,y=20,z=489}} B_T_Entrance[5] = {{x=508,y=22,z=664},{x=393,y=22,z=660},{x=388,y=22,z=471}} B_T_Entrance[6] = {{x=303,y=24,z=128},{x=270,y=24,z=242},{x=198,y=24,z=132}} B_T_Entrance[7] = {{x=652,y=21,z=300},{x=650,y=21,z=71},{x=966,y=21,z=304}} B_T_BOSSPoint = {} B_T_BOSSPoint[1] = {x=339,y=1067,z=887} B_T_BOSSPoint[2] = {x=648,y=1208,z=771} B_T_BOSSPoint[3] = {x=856,y=124,z=790} B_T_BOSSPoint[4] = {x=148,y=1013,z=566} B_T_BOSSPoint[5] = {x=448,y=1123,z=547} B_T_BOSSPoint[6] = {x=386,y=1213,z=193} B_T_BOSSPoint[7] = {x=803,y=966,z=184} --[[B_T_NPCPoint = {} -- Точки спавна NPC в зонах (закомментировано) B_T_NPCPoint[1] = {x=339,y=1147,z=898} B_T_NPCPoint[2] = {x=212,y=1154,z=524} B_T_NPCPoint[3] = {x=500,y=1148,z=541} B_T_NPCPoint[4] = {x=179,y=802,z=214} B_T_NPCPoint[5] = {x=617,y=601,z=178} B_T_NPCPoint[6] = {x=812,y=123,z=540} B_T_NPCPoint[7] = {x=777,y=519,z=878}]] B_T_Trigger = {} B_T_Trigger[1487] = {4,6} B_T_Trigger[1488] = {3,7} B_T_Trigger[1489] = {1,6} B_T_Trigger[1490] = {2,3} B_T_Trigger[1491] = {1,2} B_T_Trigger[1649] = {5,7} B_T_Trigger[1492] = {4,5} B_T_BOSSDie = {} -- Статусы BOSS: 0=не создан, 1=создан, 2=убит B_T_BOSSDie[1] = {0,0,0,0,0,0} B_T_BOSSDie[2] = {0,0,0,0,0,0} B_T_BOSSDie[3] = {0,0,0,0,0,0} B_T_Door = 0 B_T_YaoJing = {0,0,0} B_T_ZhuangBei = {} -- Создание инстансов карт map.CreateInstance(MAP_IDS.INSTANCE_1, 1) map.CreateInstance(MAP_IDS.INSTANCE_2, 2) map.CreateInstance(MAP_IDS.INSTANCE_3, 3) -- Отправка уведомления о начале события local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 102, MESSAGE_IDS.ACTIVITY_START) msg.DispatchBroadcast(MsgID, -1, -1, -1) --if emozhizi_alive == 0 then --map.MapCreateColCreature(3424073512, -1, 6010067, 955, 23692, 727, 1) -- Спавн специального NPC "Магический посланник" -- emozhizi_alive = 1 --end map.MapCreateColCreature(2766543506, 1, 6010070, 1, 1, 1, 1) end --[[ Функция: Таймер события (каждую минуту) Параметры: - actID: ID активности Действия: - Управляет созданием монстров по времени - Отправляет уведомления о боссах - Контролирует течение события ]] -- Таймер активности (ежеминутный) -- Управляет спавном монстров и событиями по времени function BOSS_TrueOrFalse_OnTimerMin(actID) -- Проверяем входные параметры if actID == nil then return end -- Проверяем инициализацию таймера if BOSS_TrueOrFalse_TimerMin ~= nil then BOSS_TrueOrFalse_TimerMin = BOSS_TrueOrFalse_TimerMin + 1 -- Создание монстров в течение первых 54 минут активности if BOSS_TrueOrFalse_TimerMin <= TIME_SETTINGS.MAX_TIMER then -- Генерируем случайные координаты для спавна local randomZone = math.random(7) -- Выбор зоны (1-7) local randomPoint = math.random(5) -- Выбор точки в зоне (1-5) -- Проверяем корректность данных спавна if B_T_CreaturePoint[randomZone] ~= nil and B_T_CreaturePoint[randomZone][randomPoint] ~= nil then local spawnPoint = B_T_CreaturePoint[randomZone][randomPoint] -- Создание монстров по интервалам времени if BOSS_TrueOrFalse_TimerMin % TIME_SETTINGS.MONSTER_SPAWN_INTERVALS[1] == 0 then -- Спавн 1-го типа монстров (каждые 18 минут) map.MapCreateColCreature(MAP_IDS.INSTANCE_1, 1, MONSTER_IDS.SMALL_MONSTER_BASE, spawnPoint.x, spawnPoint.y, spawnPoint.z, 1) map.MapCreateColCreature(MAP_IDS.INSTANCE_2, 2, MONSTER_IDS.SMALL_MONSTER_BASE + 27, spawnPoint.x, spawnPoint.y, spawnPoint.z, 1) map.MapCreateColCreature(MAP_IDS.INSTANCE_3, 3, MONSTER_IDS.SMALL_MONSTER_BASE + 54, spawnPoint.x, spawnPoint.y, spawnPoint.z, 1) elseif BOSS_TrueOrFalse_TimerMin % TIME_SETTINGS.MONSTER_SPAWN_INTERVALS[2] == 0 then -- Спавн 2-го типа монстров (каждые 15 минут) map.MapCreateColCreature(MAP_IDS.INSTANCE_1, 1, MONSTER_IDS.SMALL_MONSTER_BASE + 3, spawnPoint.x, spawnPoint.y, spawnPoint.z, 1) map.MapCreateColCreature(MAP_IDS.INSTANCE_2, 2, MONSTER_IDS.SMALL_MONSTER_BASE + 30, spawnPoint.x, spawnPoint.y, spawnPoint.z, 1) map.MapCreateColCreature(MAP_IDS.INSTANCE_3, 3, MONSTER_IDS.SMALL_MONSTER_BASE + 57, spawnPoint.x, spawnPoint.y, spawnPoint.z, 1) elseif BOSS_TrueOrFalse_TimerMin % TIME_SETTINGS.MONSTER_SPAWN_INTERVALS[3] == 0 then -- Спавн 3-го типа монстров (каждые 12 минут) map.MapCreateColCreature(MAP_IDS.INSTANCE_1, 1, MONSTER_IDS.SMALL_MONSTER_BASE + 6, spawnPoint.x, spawnPoint.y, spawnPoint.z, 1) map.MapCreateColCreature(MAP_IDS.INSTANCE_2, 2, MONSTER_IDS.SMALL_MONSTER_BASE + 33, spawnPoint.x, spawnPoint.y, spawnPoint.z, 1) map.MapCreateColCreature(MAP_IDS.INSTANCE_3, 3, MONSTER_IDS.SMALL_MONSTER_BASE + 60, spawnPoint.x, spawnPoint.y, spawnPoint.z, 1) elseif BOSS_TrueOrFalse_TimerMin % TIME_SETTINGS.MONSTER_SPAWN_INTERVALS[4] == 0 then -- Спавн 4-го типа монстров (каждые 9 минут) map.MapCreateColCreature(MAP_IDS.INSTANCE_1, 1, MONSTER_IDS.SMALL_MONSTER_BASE + 9, spawnPoint.x, spawnPoint.y, spawnPoint.z, 1) map.MapCreateColCreature(MAP_IDS.INSTANCE_2, 2, MONSTER_IDS.SMALL_MONSTER_BASE + 36, spawnPoint.x, spawnPoint.y, spawnPoint.z, 1) map.MapCreateColCreature(MAP_IDS.INSTANCE_3, 3, MONSTER_IDS.SMALL_MONSTER_BASE + 63, spawnPoint.x, spawnPoint.y, spawnPoint.z, 1) elseif BOSS_TrueOrFalse_TimerMin % TIME_SETTINGS.MONSTER_SPAWN_INTERVALS[5] == 0 then -- Спавн 5-го типа монстров (каждые 6 минут) map.MapCreateColCreature(MAP_IDS.INSTANCE_1, 1, MONSTER_IDS.SMALL_MONSTER_BASE + 12, spawnPoint.x, spawnPoint.y, spawnPoint.z, 1) map.MapCreateColCreature(MAP_IDS.INSTANCE_2, 2, MONSTER_IDS.SMALL_MONSTER_BASE + 39, spawnPoint.x, spawnPoint.y, spawnPoint.z, 1) map.MapCreateColCreature(MAP_IDS.INSTANCE_3, 3, MONSTER_IDS.SMALL_MONSTER_BASE + 66, spawnPoint.x, spawnPoint.y, spawnPoint.z, 1) elseif BOSS_TrueOrFalse_TimerMin % TIME_SETTINGS.MONSTER_SPAWN_INTERVALS[6] == 0 then -- Спавн 6-го типа монстров (каждые 3 минуты) map.MapCreateColCreature(MAP_IDS.INSTANCE_1, 1, MONSTER_IDS.SMALL_MONSTER_BASE + 15, spawnPoint.x, spawnPoint.y, spawnPoint.z, 1) map.MapCreateColCreature(MAP_IDS.INSTANCE_2, 2, MONSTER_IDS.SMALL_MONSTER_BASE + 42, spawnPoint.x, spawnPoint.y, spawnPoint.z, 1) map.MapCreateColCreature(MAP_IDS.INSTANCE_3, 3, MONSTER_IDS.SMALL_MONSTER_BASE + 69, spawnPoint.x, spawnPoint.y, spawnPoint.z, 1) end end end -- Уведомление о появлении финальных BOSS через 90 минут if BOSS_TrueOrFalse_TimerMin == TIME_SETTINGS.BOSS_SPAWN_TIME then -- Отправляем уведомления во все три инстанса активности for instanceIndex = 1, 3 do local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 101, MESSAGE_IDS.BOSS_SPAWN) -- "Внимание! Финальные BOSS скоро появятся!" msg.DispatchMapMsgEvent(MsgID, MAP_IDS["INSTANCE_" .. instanceIndex], instanceIndex) end end end end -- Завершение активности "Истина или Ложь" -- Очищает все данные и удаляет инстансы карт function BOSS_TrueOrFalse_OnEnd(actID) -- Проверяем входные параметры if actID == nil then return end -- Очищаем все глобальные таблицы активности B_T_CreaturePoint = {} -- Точки спавна монстров B_T_Entrance = {} -- Точки входа игроков B_T_BOSSPoint = {} -- Точки спавна BOSS B_T_Trigger = {} -- Триггеры зон B_T_BOSSDie = {} -- Статусы BOSS (жив/мертв) B_T_RoleMap = {} -- Карты игроков B_T_YaoJing = {} -- Статусы яоцзинов (духов) B_T_ZhuangBei = {} -- Инвентарь игроков B_T_Door = nil -- Статус дверей BOSS_TrueOrFalse_TimerMin = nil -- Таймер активности -- Удаляем все инстансы карт активности -- Сначала выкидываем всех игроков из каждого инстанса local instances = { {mapID = MAP_IDS.INSTANCE_1, instanceID = 1}, {mapID = MAP_IDS.INSTANCE_2, instanceID = 2}, {mapID = MAP_IDS.INSTANCE_3, instanceID = 3} } 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, 954, 23094, 537) end end end end map.DeleteInstance(inst.mapID, inst.instanceID) end end -- Регистрация основных событий активности aux.RegisterActEvent(ACTIVITY_ID, 2, "BOSS_TrueOrFalse_OnStart") -- Начало активности aux.RegisterActEvent(ACTIVITY_ID, 4, "BOSS_TrueOrFalse_OnTimerMin") -- Ежеминутный таймер aux.RegisterActEvent(ACTIVITY_ID, 3, "BOSS_TrueOrFalse_OnEnd") -- Завершение активности -- Регистрация альтернативных событий активности aux.RegisterActEvent(ACTIVITY_ID_ALT, 2, "BOSS_TrueOrFalse_OnStart") -- Начало активности (альт) aux.RegisterActEvent(ACTIVITY_ID_ALT, 4, "BOSS_TrueOrFalse_OnTimerMin") -- Ежеминутный таймер (альт) aux.RegisterActEvent(ACTIVITY_ID_ALT, 3, "BOSS_TrueOrFalse_OnEnd") -- Завершение активности (альт) --[[ Функция диалога с NPC "Магический посланник" (вход в активность) Параметры: - MapID: ID карты - InstanceID: ID инстанса - TargetID: ID NPC - TargetTypeID: Тип NPC - RoleID: ID игрока - TalkIndex: Индекс диалога ]] -- Диалог с NPC "Магический посланник" (вход в активность) -- Управляет входом игроков в инстансы активности function x6010067_OnTalk(MapID, InstanceID, TargetID, TargetTypeID, RoleID, TalkIndex) -- Проверяем входные параметры if MapID == nil or InstanceID == nil or TargetID == nil or RoleID == nil then return end -- Получаем уровень игрока local roleLevel = role.GetRoleLevel(MapID, InstanceID, RoleID) if roleLevel == nil then return end -- Начальный диалог (TalkIndex == -1) if TalkIndex == -1 then -- Проверяем, активна ли активность if BOSS_TrueOrFalse_TimerMin ~= nil then -- Активность открыта - показываем меню выбора инстанса local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 20, 206101) -- "Магический посланник: Добро пожаловать в активность 'Истина или Ложь'!" msg.AddMsgEvent(MsgID, 24, TargetID) -- ID NPC -- Показываем кнопки в зависимости от уровня игрока if roleLevel >= LEVEL_SETTINGS.MIN_LEVEL and roleLevel < LEVEL_SETTINGS.MAX_LEVEL_1 then msg.AddMsgEvent(MsgID, 21, 4) -- Кнопка "ОК" msg.AddMsgEvent(MsgID, 1, 206102) -- "Войти в первый инстанс (уровень 55-79)" end if roleLevel >= LEVEL_SETTINGS.MIN_LEVEL and roleLevel < LEVEL_SETTINGS.MAX_LEVEL_2 then msg.AddMsgEvent(MsgID, 21, 5) -- Кнопка "ОК" msg.AddMsgEvent(MsgID, 1, 206103) -- "Войти во второй инстанс (уровень 55-103)" end if roleLevel >= LEVEL_SETTINGS.MIN_LEVEL and roleLevel < LEVEL_SETTINGS.MAX_LEVEL_3 then msg.AddMsgEvent(MsgID, 21, 6) -- Кнопка "ОК" msg.AddMsgEvent(MsgID, 1, 206104) -- "Войти в третий инстанс (уровень 55-120)" end msg.AddMsgEvent(MsgID, 21, 10) -- Кнопка "Отмена" msg.AddMsgEvent(MsgID, 1, 100002) -- "Отмена" msg.DispatchRoleMsgEvent(RoleID, MsgID) else -- Активность закрыта - показываем сообщение о закрытии local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 20, 206105) -- "Магический посланник: Активность в данный момент недоступна." msg.AddMsgEvent(MsgID, 24, TargetID) -- ID NPC msg.AddMsgEvent(MsgID, 21, 10) -- Кнопка "Отмена" msg.AddMsgEvent(MsgID, 1, 100002) -- "Отмена" msg.DispatchRoleMsgEvent(RoleID, MsgID) end -- Обработка выбора инстанса (TalkIndex 4-6) elseif TalkIndex >= 4 and TalkIndex <= 6 then -- Проверяем, активна ли активность if BOSS_TrueOrFalse_TimerMin ~= nil then -- Проверяем корректность данных телепортации if B_T_Entrance == nil then return end -- Генерируем случайные числа для выбора зоны и точки телепортации local randomZone = math.random(7) -- Выбор зоны (1-7) local randomPoint = math.random(3) -- Выбор точки телепортации (1-3) -- Проверяем корректность выбранной зоны и точки if B_T_Entrance[randomZone] == nil or B_T_Entrance[randomZone][randomPoint] == nil then return end local teleportPoint = B_T_Entrance[randomZone][randomPoint] -- Обработка входа в первый инстанс (TalkIndex == 4) if TalkIndex == 4 then -- Добавляем соответствующий бафф зоны if randomZone == 4 then unit.AddBuff(MapID, InstanceID, RoleID, BUFF_IDS.FIRE_BUFF, RoleID) -- Бафф огня elseif randomZone == 5 then unit.AddBuff(MapID, InstanceID, RoleID, BUFF_IDS.WATER_BUFF, RoleID) -- Бафф воды end -- Телепортируем в первый инстанс role.RoleGotoNewMap(MapID, InstanceID, RoleID, MAP_IDS.INSTANCE_1, teleportPoint.x, teleportPoint.y, teleportPoint.z) -- Обработка входа во второй инстанс (TalkIndex == 5) elseif TalkIndex == 5 then -- Добавляем соответствующий бафф зоны if randomZone == 4 then unit.AddBuff(MapID, InstanceID, RoleID, BUFF_IDS.FIRE_BUFF, RoleID) -- Бафф огня elseif randomZone == 5 then unit.AddBuff(MapID, InstanceID, RoleID, BUFF_IDS.WATER_BUFF, RoleID) -- Бафф воды end -- Телепортируем во второй инстанс role.RoleGotoNewMap(MapID, InstanceID, RoleID, MAP_IDS.INSTANCE_2, teleportPoint.x, teleportPoint.y, teleportPoint.z) -- Обработка входа в третий инстанс (TalkIndex == 6) elseif TalkIndex == 6 then -- Добавляем соответствующий бафф зоны if randomZone == 4 then unit.AddBuff(MapID, InstanceID, RoleID, BUFF_IDS.FIRE_BUFF, RoleID) -- Бафф огня elseif randomZone == 5 then unit.AddBuff(MapID, InstanceID, RoleID, BUFF_IDS.WATER_BUFF, RoleID) -- Бафф воды end -- Телепортируем в третий инстанс role.RoleGotoNewMap(MapID, InstanceID, RoleID, MAP_IDS.INSTANCE_3, teleportPoint.x, teleportPoint.y, teleportPoint.z) end end end end -- Регистрация диалога с NPC "Магический посланник" aux.RegisterCreatureEvent(NPC_IDS.BOSS_NPC, 7, "x6010067_OnTalk") -- Диалог с NPC "Выход" (выход из активности) -- Позволяет игрокам покинуть инстанс активности function x6010069_OnTalk(MapID, InstanceID, TargetID, TargetTypeID, RoleID, TalkIndex) -- Проверяем входные параметры if MapID == nil or InstanceID == nil or TargetID == nil or RoleID == nil then return end -- Начальный диалог (TalkIndex == -1) if TalkIndex == -1 then local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 20, 206106) -- "Страж выхода: Хотите покинуть башню?" msg.AddMsgEvent(MsgID, 24, TargetID) -- ID NPC msg.AddMsgEvent(MsgID, 21, 4) -- Кнопка "ОК" msg.AddMsgEvent(MsgID, 1, 206107) -- "Покинуть магическую башню" msg.AddMsgEvent(MsgID, 21, 10) -- Кнопка "Отмена" msg.AddMsgEvent(MsgID, 1, 100002) -- "Отмена" msg.DispatchRoleMsgEvent(RoleID, MsgID) -- Обработка выбора выхода (TalkIndex == 4) elseif TalkIndex == 4 then -- Определяем точки выхода из активности local exitPoints = { {x=639, y=22902, z=543}, -- Точка выхода 1 {x=639, y=22902, z=543}, -- Точка выхода 2 {x=639, y=22902, z=543} -- Точка выхода 3 } -- Случайно выбираем точку выхода local randomExit = math.random(3) local exitPoint = exitPoints[randomExit] -- Телепортируем игрока на основную карту role.RoleGotoNewMap(MapID, InstanceID, RoleID, MAP_IDS.MAIN_MAP, exitPoint.x, exitPoint.y, exitPoint.z) end end -- Регистрация диалога с NPC выхода aux.RegisterCreatureEvent(NPC_IDS.EXIT_NPC, 7, "x6010069_OnTalk") --[[ Функция обработки смерти монстров и создания BOSS Параметры: - MapID: ID карты - InstanceID: ID инстанса - TargetID: ID монстра - TargetTypeID: Тип монстра - RoleID: ID игрока ]] function BOSS_TrueOrFalse_OnDie(MapID, InstanceID, TargetID, TargetTypeID, RoleID) -- Обработка первой группы монстров (ID: 2055000-2055018) if TargetTypeID <= 2055018 then -- Вычисляем индекс BOSS в группе local k = TargetTypeID - 2055000 k = k / 3 -- Проверяем, не создан ли уже BOSS для этой группы if B_T_BOSSDie[InstanceID][k] == 0 then -- 100% шанс создания BOSS if math.random(100) <= 100 then -- Случайно выбираем точку появления BOSS local Index = math.random(7) -- Создаем BOSS map.MapCreateColCreature(MapID, InstanceID, 2055018 + k, B_T_BOSSPoint[Index].x, B_T_BOSSPoint[Index].y, B_T_BOSSPoint[Index].z, 1) -- Отправляем сообщение о появлении BOSS local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 101, 206107+k) -- Сообщение о появлении BOSS msg.DispatchMapMsgEvent(MsgID, MapID, InstanceID) -- Отмечаем, что BOSS создан B_T_BOSSDie[InstanceID][k] = 1 end end -- Обработка второй группы монстров (ID: 2055027-2055045) elseif TargetTypeID <= 2055045 then -- Вычисляем индекс BOSS в группе local k = TargetTypeID - 2055027 k = k / 3 -- Проверяем, не создан ли уже BOSS для этой группы if B_T_BOSSDie[InstanceID][k] == 0 then -- 100% шанс создания BOSS if math.random(100) <= 100 then -- Случайно выбираем точку появления BOSS local Index = math.random(7) -- Создаем BOSS map.MapCreateColCreature(MapID, InstanceID, 2055045 + k, B_T_BOSSPoint[Index].x, B_T_BOSSPoint[Index].y, B_T_BOSSPoint[Index].z, 1) -- Отправляем сообщение о появлении BOSS local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 101, 206107+k) -- Сообщение о появлении BOSS msg.DispatchMapMsgEvent(MsgID, MapID, InstanceID) -- Отмечаем, что BOSS создан B_T_BOSSDie[InstanceID][k] = 1 end end -- Обработка третьей группы монстров (ID: 2055054-2055072) elseif TargetTypeID <= 2055072 then -- Вычисляем индекс BOSS в группе local k = TargetTypeID - 2055054 k = k / 3 -- Проверяем, не создан ли уже BOSS для этой группы if B_T_BOSSDie[InstanceID][k] == 0 then -- 100% шанс создания BOSS if math.random(100) <= 100 then -- Случайно выбираем точку появления BOSS local Index = math.random(7) -- Создаем BOSS map.MapCreateColCreature(MapID, InstanceID, 2055072 + k, B_T_BOSSPoint[Index].x, B_T_BOSSPoint[Index].y, B_T_BOSSPoint[Index].z, 1) -- Отправляем сообщение о появлении BOSS local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 101, 206107+k) -- Сообщение о появлении BOSS msg.DispatchMapMsgEvent(MsgID, MapID, InstanceID) -- Отмечаем, что BOSS создан B_T_BOSSDie[InstanceID][k] = 1 end end end end -- Регистрация событий смерти для монстров первой группы (создание BOSS первой группы) aux.RegisterCreatureEvent(2055003, 4, "BOSS_TrueOrFalse_OnDie") aux.RegisterCreatureEvent(2055006, 4, "BOSS_TrueOrFalse_OnDie") aux.RegisterCreatureEvent(2055009, 4, "BOSS_TrueOrFalse_OnDie") aux.RegisterCreatureEvent(2055012, 4, "BOSS_TrueOrFalse_OnDie") aux.RegisterCreatureEvent(2055015, 4, "BOSS_TrueOrFalse_OnDie") aux.RegisterCreatureEvent(2055018, 4, "BOSS_TrueOrFalse_OnDie") -- Регистрация событий смерти для монстров второй группы (создание BOSS второй группы) aux.RegisterCreatureEvent(2055030, 4, "BOSS_TrueOrFalse_OnDie") aux.RegisterCreatureEvent(2055033, 4, "BOSS_TrueOrFalse_OnDie") aux.RegisterCreatureEvent(2055036, 4, "BOSS_TrueOrFalse_OnDie") aux.RegisterCreatureEvent(2055039, 4, "BOSS_TrueOrFalse_OnDie") aux.RegisterCreatureEvent(2055042, 4, "BOSS_TrueOrFalse_OnDie") aux.RegisterCreatureEvent(2055045, 4, "BOSS_TrueOrFalse_OnDie") -- Регистрация событий смерти для монстров третьей группы (создание BOSS третьей группы) aux.RegisterCreatureEvent(2055057, 4, "BOSS_TrueOrFalse_OnDie") aux.RegisterCreatureEvent(2055060, 4, "BOSS_TrueOrFalse_OnDie") aux.RegisterCreatureEvent(2055063, 4, "BOSS_TrueOrFalse_OnDie") aux.RegisterCreatureEvent(2055066, 4, "BOSS_TrueOrFalse_OnDie") aux.RegisterCreatureEvent(2055069, 4, "BOSS_TrueOrFalse_OnDie") aux.RegisterCreatureEvent(2055072, 4, "BOSS_TrueOrFalse_OnDie") --[[ Функция обработки смерти BOSS монстров в системе "Истина или Ложь" Параметры: - MapID: ID карты - InstanceID: ID инстанса - TargetID: ID цели (BOSS) - TargetTypeID: Тип цели (ID типа BOSS) - RoleID: ID игрока ]] function BOSS_TrueOrFalse_BOSSOnDie(MapID, InstanceID, TargetID, TargetTypeID, RoleID) -- Таблица наград для финальных BOSS (предметы и их количество) local bossItemTable = { [2055025] = {itemID = 4800232, count = 1}, -- Первый финальный BOSS -> 1 предмет [2055052] = {itemID = 4800232, count = 2}, -- Второй финальный BOSS -> 2 предмета [2055079] = {itemID = 4800232, count = 3}, -- Третий финальный BOSS -> 3 предмета -- Можно добавить дополнительные награды для других BOSS } -- Обработка первой группы BOSS (ID: 2055019-2055024) if TargetTypeID <= 2055024 then -- Вычисляем индекс BOSS в массиве (смещение от базового ID) local k = TargetTypeID - 2055018 -- Отмечаем BOSS как убитого (статус 2) B_T_BOSSDie[InstanceID][k] = 2 -- Подсчитываем количество убитых BOSS в группе local num = 0 for i = 1, 6 do if B_T_BOSSDie[InstanceID][i] ~= nil and B_T_BOSSDie[InstanceID][i] == 2 then num = num + 1 end end -- Отправляем сообщение о прогрессе убийства BOSS local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 101, 206114) -- "XXX убил BOSS, прогресс: X/6" msg.AddMsgEvent(MsgID, 5, TargetTypeID) msg.AddMsgEvent(MsgID, 9, num) msg.DispatchMapMsgEvent(MsgID, MapID, InstanceID) -- Если все 6 BOSS убиты, создаем финального BOSS if num == 6 then local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 101, 206115) -- "Все BOSS убиты! Появляется финальный BOSS!" msg.DispatchMapMsgEvent(MsgID, MapID, InstanceID) -- Случайно выбираем точку появления финального BOSS local Index = math.random(7) map.MapCreateColCreature(MapID, InstanceID, 2055025, B_T_BOSSPoint[Index].x, B_T_BOSSPoint[Index].y, B_T_BOSSPoint[Index].z, 1) end -- Логика появления яоцзина (духа/демона) -- 5% шанс появления (math.random(20) == 15) или если яоцзин еще не появлялся if B_T_YaoJing[InstanceID] == 0 or math.random(20) == 15 then B_T_YaoJing[InstanceID] = 1 -- Отмечаем, что яоцзин появился local q = math.random(100) local x, y, z = unit.GetPosition(MapID, InstanceID, TargetID) local ID = 0 local yaojing = 0 -- 50% шанс появления яоцзина типа 1092002 if q <= 25 then yaojing = 1092002 ID = map.MapCreateCreature(MapID, InstanceID, 1092002, x, y, z) -- 50% шанс появления яоцзина типа 1092007 elseif q > 25 then yaojing = 1092007 ID = map.MapCreateCreature(MapID, InstanceID, 1092007, x, y, z) end -- Добавляем бафф яоцзину unit.AddBuff(MapID, InstanceID, ID, 5932801, ID) -- Отправляем сообщение о появлении яоцзина local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 101, 302002) msg.AddMsgEvent(MsgID, 5, yaojing) msg.AddMsgEvent(MsgID, 9, x) msg.AddMsgEvent(MsgID, 9, z) msg.DispatchMapMsgEvent(MsgID, MapID, InstanceID) -- Дополнительное сообщение о появлении яоцзина local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 13, 1) msg.AddMsgEvent(MsgID, 1, 302002) msg.AddMsgEvent(MsgID, 5, yaojing) msg.AddMsgEvent(MsgID, 9, x) msg.AddMsgEvent(MsgID, 9, z) msg.DispatchMapMsgEvent(MsgID, MapID, InstanceID) end -- Обработка второй группы BOSS (ID: 2055046-2055051, исключая 2055025) elseif TargetTypeID ~= 2055025 and TargetTypeID <= 2055051 then -- Вычисляем индекс BOSS в массиве (смещение от базового ID) local k = TargetTypeID - 2055045 -- Отмечаем BOSS как убитого (статус 2) B_T_BOSSDie[InstanceID][k] = 2 -- Подсчитываем количество убитых BOSS в группе local num = 0 for i = 1, 6 do if B_T_BOSSDie[InstanceID][i] ~= nil and B_T_BOSSDie[InstanceID][i] == 2 then num = num + 1 end end -- Отправляем сообщение о прогрессе убийства BOSS local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 101, 206114) -- "XXX убил BOSS, прогресс: X/6" msg.AddMsgEvent(MsgID, 5, TargetTypeID) msg.AddMsgEvent(MsgID, 9, num) msg.DispatchMapMsgEvent(MsgID, MapID, InstanceID) -- Если все 6 BOSS убиты, создаем финального BOSS if num == 6 then local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 101, 206115) -- "Все BOSS убиты! Появляется финальный BOSS!" msg.DispatchMapMsgEvent(MsgID, MapID, InstanceID) -- Случайно выбираем точку появления финального BOSS local Index = math.random(7) map.MapCreateColCreature(MapID, InstanceID, 2055052, B_T_BOSSPoint[Index].x, B_T_BOSSPoint[Index].y, B_T_BOSSPoint[Index].z, 1) end -- Логика появления яоцзина (духа/демона) -- 5% шанс появления (math.random(20) == 15) или если яоцзин еще не появлялся if B_T_YaoJing[InstanceID] == 0 or math.random(20) == 15 then B_T_YaoJing[InstanceID] = 1 -- Отмечаем, что яоцзин появился local q = math.random(100) local x, y, z = unit.GetPosition(MapID, InstanceID, TargetID) local ID = 0 local yaojing = 0 -- 50% шанс появления яоцзина типа 1092003 if q <= 50 then yaojing = 1092003 ID = map.MapCreateCreature(MapID, InstanceID, 1092003, x, y, z) -- 50% шанс появления яоцзина типа 1092008 elseif q > 50 then yaojing = 1092008 ID = map.MapCreateCreature(MapID, InstanceID, 1092008, x, y, z) end -- Добавляем бафф яоцзину unit.AddBuff(MapID, InstanceID, ID, 5932801, ID) -- Отправляем сообщение о появлении яоцзина local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 101, 302002) msg.AddMsgEvent(MsgID, 5, yaojing) msg.AddMsgEvent(MsgID, 9, x) msg.AddMsgEvent(MsgID, 9, z) msg.DispatchMapMsgEvent(MsgID, MapID, InstanceID) -- Дополнительное сообщение о появлении яоцзина local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 13, 1) msg.AddMsgEvent(MsgID, 1, 302002) msg.AddMsgEvent(MsgID, 5, yaojing) msg.AddMsgEvent(MsgID, 9, x) msg.AddMsgEvent(MsgID, 9, z) msg.DispatchMapMsgEvent(MsgID, MapID, InstanceID) end -- Обработка третьей группы BOSS (ID: 2055073-2055078, исключая 2055052 и 2055025) elseif TargetTypeID ~= 2055052 and TargetTypeID ~= 2055025 and TargetTypeID <= 2055078 then -- Вычисляем индекс BOSS в массиве (смещение от базового ID) local k = TargetTypeID - 2055072 -- Отмечаем BOSS как убитого (статус 2) B_T_BOSSDie[InstanceID][k] = 2 -- Подсчитываем количество убитых BOSS в группе local num = 0 for i = 1, 6 do if B_T_BOSSDie[InstanceID][i] ~= nil and B_T_BOSSDie[InstanceID][i] == 2 then num = num + 1 end end -- Отправляем сообщение о прогрессе убийства BOSS local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 101, 206114) -- "XXX убил BOSS, прогресс: X/6" msg.AddMsgEvent(MsgID, 5, TargetTypeID) msg.AddMsgEvent(MsgID, 9, num) msg.DispatchMapMsgEvent(MsgID, MapID, InstanceID) -- Если все 6 BOSS убиты, создаем финального BOSS if num == 6 then local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 101, 206115) -- "Все BOSS убиты! Появляется финальный BOSS!" msg.DispatchMapMsgEvent(MsgID, MapID, InstanceID) -- Случайно выбираем точку появления финального BOSS local Index = math.random(7) map.MapCreateColCreature(MapID, InstanceID, 2055079, B_T_BOSSPoint[Index].x, B_T_BOSSPoint[Index].y, B_T_BOSSPoint[Index].z, 1) end -- Логика появления яоцзина (духа/демона) -- 5% шанс появления (math.random(20) == 15) или если яоцзин еще не появлялся if B_T_YaoJing[InstanceID] == 0 or math.random(20) == 15 then B_T_YaoJing[InstanceID] = 1 -- Отмечаем, что яоцзин появился local q = math.random(100) local x, y, z = unit.GetPosition(MapID, InstanceID, TargetID) local ID = 0 local yaojing = 0 -- 50% шанс появления яоцзина типа 1092005 if q <= 50 then yaojing = 1092005 ID = map.MapCreateCreature(MapID, InstanceID, 1092005, x, y, z) -- 50% шанс появления яоцзина типа 1092010 elseif q > 50 then yaojing = 1092010 ID = map.MapCreateCreature(MapID, InstanceID, 1092010, x, y, z) end -- Добавляем бафф яоцзину unit.AddBuff(MapID, InstanceID, ID, 5932801, ID) -- Отправляем сообщение о появлении яоцзина local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 101, 302002) msg.AddMsgEvent(MsgID, 5, yaojing) msg.AddMsgEvent(MsgID, 9, x) msg.AddMsgEvent(MsgID, 9, z) msg.DispatchMapMsgEvent(MsgID, MapID, InstanceID) -- Дополнительное сообщение о появлении яоцзина local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 13, 1) msg.AddMsgEvent(MsgID, 1, 302002) msg.AddMsgEvent(MsgID, 5, yaojing) msg.AddMsgEvent(MsgID, 9, x) msg.AddMsgEvent(MsgID, 9, z) msg.DispatchMapMsgEvent(MsgID, MapID, InstanceID) end -- Обработка финальных BOSS (ID: 2055025, 2055052, 2055079) elseif TargetTypeID == 2055025 or TargetTypeID == 2055052 or TargetTypeID == 2055079 then -- Выдаем награды игроку за убийство финального BOSS local itemData = bossItemTable[TargetTypeID] if itemData then role.AddRoleItem(MapID, InstanceID, RoleID, itemData.itemID, itemData.count, -1, 8, 420) end -- Боевой пропуск: начисление опыта за убийство финального босса local Bo_Have = role.GetRoleScriptData(RoleID, 1, RoleDataType["Bo_Have"]) or 0 if Bo_Have == 1 then local addExp = 200 local Bo_EXP = role.GetRoleScriptData(RoleID, 1, RoleDataType["Bo_EXP"]) or 0 local Bo_Level = role.GetRoleScriptData(RoleID, 1, RoleDataType["Bo_Level"]) or 0 Bo_EXP = Bo_EXP + addExp -- 2480 exp на уровень, максимум 100 while Bo_Level < 100 and Bo_EXP >= 2480 do Bo_Level = Bo_Level + 1 Bo_EXP = Bo_EXP - 2480 end role.SetRoleScriptData(RoleID, 1, RoleDataType["Bo_Level"], Bo_Level) role.SetRoleScriptData(RoleID, 1, RoleDataType["Bo_EXP"], Bo_EXP) end -- Отправляем мировое сообщение о победе над финальным BOSS local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 13, 1) msg.AddMsgEvent(MsgID, 1, 206156) -- "Поздравляем! XXX победил финального BOSS!" msg.AddMsgEvent(MsgID, 2, RoleID) msg.DispatchWorldMsgEvent(MsgID) end end -- Регистрация событий смерти для всех типов BOSS -- Первая группа BOSS (ID: 2055019-2055025) aux.RegisterCreatureEvent(2055019, 4, "BOSS_TrueOrFalse_BOSSOnDie") aux.RegisterCreatureEvent(2055020, 4, "BOSS_TrueOrFalse_BOSSOnDie") aux.RegisterCreatureEvent(2055021, 4, "BOSS_TrueOrFalse_BOSSOnDie") aux.RegisterCreatureEvent(2055022, 4, "BOSS_TrueOrFalse_BOSSOnDie") aux.RegisterCreatureEvent(2055023, 4, "BOSS_TrueOrFalse_BOSSOnDie") aux.RegisterCreatureEvent(2055024, 4, "BOSS_TrueOrFalse_BOSSOnDie") aux.RegisterCreatureEvent(2055025, 4, "BOSS_TrueOrFalse_BOSSOnDie") -- Финальный BOSS первой группы -- Вторая группа BOSS (ID: 2055046-2055052) aux.RegisterCreatureEvent(2055046, 4, "BOSS_TrueOrFalse_BOSSOnDie") aux.RegisterCreatureEvent(2055047, 4, "BOSS_TrueOrFalse_BOSSOnDie") aux.RegisterCreatureEvent(2055048, 4, "BOSS_TrueOrFalse_BOSSOnDie") aux.RegisterCreatureEvent(2055049, 4, "BOSS_TrueOrFalse_BOSSOnDie") aux.RegisterCreatureEvent(2055050, 4, "BOSS_TrueOrFalse_BOSSOnDie") aux.RegisterCreatureEvent(2055051, 4, "BOSS_TrueOrFalse_BOSSOnDie") aux.RegisterCreatureEvent(2055052, 4, "BOSS_TrueOrFalse_BOSSOnDie") -- Финальный BOSS второй группы -- Третья группа BOSS (ID: 2055073-2055079) aux.RegisterCreatureEvent(2055073, 4, "BOSS_TrueOrFalse_BOSSOnDie") aux.RegisterCreatureEvent(2055074, 4, "BOSS_TrueOrFalse_BOSSOnDie") aux.RegisterCreatureEvent(2055075, 4, "BOSS_TrueOrFalse_BOSSOnDie") aux.RegisterCreatureEvent(2055076, 4, "BOSS_TrueOrFalse_BOSSOnDie") aux.RegisterCreatureEvent(2055077, 4, "BOSS_TrueOrFalse_BOSSOnDie") aux.RegisterCreatureEvent(2055078, 4, "BOSS_TrueOrFalse_BOSSOnDie") aux.RegisterCreatureEvent(2055079, 4, "BOSS_TrueOrFalse_BOSSOnDie") -- Финальный BOSS третьей группы function BOSS_TOF_OnEnterCombat(MapID, InstanceID, CreatureID) unit.AddBuff(MapID, InstanceID, CreatureID, 5935001, CreatureID) end aux.RegisterCreatureEvent(2055019, 2, "BOSS_TOF_OnEnterCombat") aux.RegisterCreatureEvent(2055020, 2, "BOSS_TOF_OnEnterCombat") aux.RegisterCreatureEvent(2055021, 2, "BOSS_TOF_OnEnterCombat") aux.RegisterCreatureEvent(2055022, 2, "BOSS_TOF_OnEnterCombat") aux.RegisterCreatureEvent(2055023, 2, "BOSS_TOF_OnEnterCombat") aux.RegisterCreatureEvent(2055024, 2, "BOSS_TOF_OnEnterCombat") aux.RegisterCreatureEvent(2055025, 2, "BOSS_TOF_OnEnterCombat") aux.RegisterCreatureEvent(2055046, 2, "BOSS_TOF_OnEnterCombat") aux.RegisterCreatureEvent(2055047, 2, "BOSS_TOF_OnEnterCombat") aux.RegisterCreatureEvent(2055048, 2, "BOSS_TOF_OnEnterCombat") aux.RegisterCreatureEvent(2055049, 2, "BOSS_TOF_OnEnterCombat") aux.RegisterCreatureEvent(2055050, 2, "BOSS_TOF_OnEnterCombat") aux.RegisterCreatureEvent(2055051, 2, "BOSS_TOF_OnEnterCombat") aux.RegisterCreatureEvent(2055052, 2, "BOSS_TOF_OnEnterCombat") aux.RegisterCreatureEvent(2055073, 2, "BOSS_TOF_OnEnterCombat") aux.RegisterCreatureEvent(2055074, 2, "BOSS_TOF_OnEnterCombat") aux.RegisterCreatureEvent(2055075, 2, "BOSS_TOF_OnEnterCombat") aux.RegisterCreatureEvent(2055076, 2, "BOSS_TOF_OnEnterCombat") aux.RegisterCreatureEvent(2055077, 2, "BOSS_TOF_OnEnterCombat") aux.RegisterCreatureEvent(2055078, 2, "BOSS_TOF_OnEnterCombat") aux.RegisterCreatureEvent(2055079, 2, "BOSS_TOF_OnEnterCombat") function C2055081_OnEnterCombat(MapID, InstanceID, CreatureID) unit.AddBuff(MapID, InstanceID, CreatureID, 5935201, CreatureID) end aux.RegisterCreatureEvent(2055081, 2, "C2055081_OnEnterCombat") aux.RegisterCreatureEvent(2055054, 2, "C2055081_OnEnterCombat") aux.RegisterCreatureEvent(2055027, 2, "C2055081_OnEnterCombat") --[[ Функция обработки входа в триггер на карте Параметры: - MapID: ID карты - InstanceID: ID инстанса - RoleID: ID игрока - ObjID: ID объекта триггера ]] function h03_OnEnterTrigger(MapID, InstanceID, RoleID, ObjID) -- Обработка обычных триггеров (не 2631) if ObjID ~= 2631 then -- Проверяем, существует ли триггер в таблице if B_T_Trigger[ObjID] ~= nil then -- Генерируем случайные числа для выбора действия и точки телепортации local k = math.random(2) -- Выбор действия (1 или 2) local k2 = math.random(3) -- Выбор точки телепортации (1, 2 или 3) -- Добавляем соответствующий бафф в зависимости от выбранного действия if B_T_Trigger[ObjID][k] == 4 then unit.AddBuff(MapID, InstanceID, RoleID, 5935401, RoleID) -- Бафф типа 4 elseif B_T_Trigger[ObjID][k] == 5 then unit.AddBuff(MapID, InstanceID, RoleID, 5935501, RoleID) -- Бафф типа 5 end -- Телепортируем игрока в случайную точку входа role.RoleGotoNewMap(MapID, InstanceID, RoleID, MapID, B_T_Entrance[B_T_Trigger[ObjID][k]][k2].x, B_T_Entrance[B_T_Trigger[ObjID][k]][k2].y, B_T_Entrance[B_T_Trigger[ObjID][k]][k2].z) -- Убираем бафф типа 4, если игрок не телепортировался в зону 4 if role.IsRoleHaveBuff(MapID, InstanceID, RoleID, 59354) and B_T_Trigger[ObjID][k] ~= 4 then unit.CancelBuff(MapID, InstanceID, RoleID, 5935401) end -- Убираем бафф типа 5, если игрок не телепортировался в зону 5 if role.IsRoleHaveBuff(MapID, InstanceID, RoleID, 59355) and B_T_Trigger[ObjID][k] ~= 5 then unit.CancelBuff(MapID, InstanceID, RoleID, 5935501) end end -- Обработка специального триггера 2631 elseif ObjID == 2631 then -- Добавляем специальный бафф для триггера 2631 unit.AddBuff(MapID, InstanceID, RoleID, 5935601, RoleID) end end -- Регистрация события входа в триггер для всех карт h03 aux.RegisterMapEvent("h03_1", 6, "h03_OnEnterTrigger") aux.RegisterMapEvent("h03_2", 6, "h03_OnEnterTrigger") aux.RegisterMapEvent("h03_3", 6, "h03_OnEnterTrigger") -- Закомментированный код для создания существа при входе на карту --[[function _PlayerEnter(MapID, InstanceID, RoleID) map.MapCreateColCreature(MapID, InstanceID, 6010061, 6372/50, 32, 8191/50, 1) end -- Регистрация события входа на карту aux.RegisterMapEvent("", 2, "_PlayerEnter")]] --[[ Функция получения идеального инстанса для карты h03_1 Возвращает ID инстанса для балансировки нагрузки ]] function h03_1GetOnePerfectMap(MapID, InstanceID, RoleID) return 1 -- Всегда возвращаем инстанс 1 end aux.RegisterMapEvent("h03_1", 14, "h03_1GetOnePerfectMap") --[[ Функция получения идеального инстанса для карты h03_2 Возвращает ID инстанса для балансировки нагрузки ]] function h03_2GetOnePerfectMap(MapID, InstanceID, RoleID) return 2 -- Всегда возвращаем инстанс 2 end aux.RegisterMapEvent("h03_2", 14, "h03_2GetOnePerfectMap") --[[ Функция получения идеального инстанса для карты h03_3 Возвращает ID инстанса для балансировки нагрузки ]] function h03_3GetOnePerfectMap(MapID, InstanceID, RoleID) return 3 -- Всегда возвращаем инстанс 3 end aux.RegisterMapEvent("h03_3", 14, "h03_3GetOnePerfectMap") --[[ Функция определения дружественности игроков (система PK) Параметры: - MapID: ID карты - InstanceID: ID инстанса - SrcID: ID атакующего - TargetID: ID цели Возвращает: (isFriend, isEnemy, isNeutral, canAttack) ]] function h03_1_FriendEnemy(MapID, InstanceID, SrcID, TargetID) -- Если прошло больше 90 минут и оба объекта - игроки, разрешаем PK if BOSS_TrueOrFalse_TimerMin ~= nil and BOSS_TrueOrFalse_TimerMin > 90 and unit.IsPlayer(SrcID) and unit.IsPlayer(TargetID) then return true, false, false, true -- Друзья, но могут атаковать друг друга end return false, false, false, false -- По умолчанию - нейтральные отношения end aux.RegisterMapEvent("h03_1", 16, "h03_1_FriendEnemy") aux.RegisterMapEvent("h03_2", 16, "h03_1_FriendEnemy") aux.RegisterMapEvent("h03_3", 16, "h03_1_FriendEnemy") --[[ Функция обработки исчезновения существа (таймер дверей) Параметры: - MapID: ID карты - InstanceID: ID инстанса - TargetID: ID существа - TargetTypeID: Тип существа ]] function c6010070_OnDisappear(MapID, InstanceID, TargetID, TargetTypeID) -- Если двери закрыты, открываем их if B_T_Door ~= nil and B_T_Door == 0 then B_T_Door = 1 -- Открываем двери во всех трех инстансах map.OpenCloseDoor(2766543506, 1, 1515, 1) map.OpenCloseDoor(2766543250, 2, 1515, 1) map.OpenCloseDoor(2766542994, 3, 1515, 1) -- Создаем существо-таймер map.MapCreateColCreature(MapID, 1, 6010070, 1, 1, 1, 1) -- Если двери открыты, закрываем их elseif B_T_Door ~= nil and B_T_Door == 1 then B_T_Door = 0 -- Закрываем двери во всех трех инстансах map.OpenCloseDoor(2766543506, 1, 1515, 1) map.OpenCloseDoor(2766543250, 2, 1515, 1) map.OpenCloseDoor(2766542994, 3, 1515, 1) -- Создаем существо-таймер в первом инстансе map.MapCreateColCreature(2766543506, 1, 6010070, 1, 1, 1, 1) end end aux.RegisterCreatureEvent(6010070, 13, "c6010070_OnDisappear") --[[ Функция определения точки возрождения при входе в игру Параметры: - MapID: ID карты - RoleID: ID игрока Возвращает: (MapID, x, y, z) - координаты точки возрождения ]] function h03_CanTakeOverWhenOnline(MapID, RoleID) -- Случайно выбираем одну из трех точек возрождения local k = math.random(3) local point = {} point[1] = {x=954, y=458, z=537} point[2] = {x=330, y=458, z=527} point[3] = {x=582, y=459, z=298} -- Возвращаем ID карты и координаты точки возрождения return 3424073512, point[k].x, point[k].y*51, point[k].z end aux.RegisterMapEvent("h03_1", 12, "h03_CanTakeOverWhenOnline") aux.RegisterMapEvent("h03_2", 12, "h03_CanTakeOverWhenOnline") aux.RegisterMapEvent("h03_3", 12, "h03_CanTakeOverWhenOnline") --[[ Функция получения карты выхода и координат Параметры: - MapID: ID карты - InstanceID: ID инстанса - RoleID: ID игрока Возвращает: (MapID, x, y, z) - координаты точки выхода ]] function h03_GetExporMapAndCoord(MapID, InstanceID, RoleID) -- Случайно выбираем одну из трех точек выхода local k = math.random(3) local point = {} point[1] = {x=954, y=458, z=537} point[2] = {x=330, y=458, z=527} point[3] = {x=582, y=459, z=298} -- Возвращаем ID карты выхода и координаты return 1, 3424073512, point[k].x, point[k].y, point[k].z end aux.RegisterMapEvent("h03_1", 13, "h03_GetExporMapAndCoord") aux.RegisterMapEvent("h03_2", 13, "h03_GetExporMapAndCoord") aux.RegisterMapEvent("h03_3", 13, "h03_GetExporMapAndCoord") --[[ Функция проверки возможности входа на карту Параметры: - MapID: ID карты - InstanceID: ID инстанса - RoleID: ID игрока Возвращает: 1 - разрешено, 0 - запрещено ]] function h03_CanEnter(MapID, InstanceID, RoleID) return 1 -- Всегда разрешаем вход end aux.RegisterMapEvent("h03_1", 15, "h03_CanEnter") aux.RegisterMapEvent("h03_2", 15, "h03_CanEnter") aux.RegisterMapEvent("h03_3", 15, "h03_CanEnter") --[[ Функция обработки смерти монстров в зоне BOSS (выдача фрагментов) Параметры: - MapID: ID карты - InstanceID: ID инстанса - TargetID: ID монстра - TargetTypeID: Тип монстра - RoleID: ID игрока ]] function BOSS_7Area_OnDie(MapID, InstanceID, TargetID, TargetTypeID, RoleID) -- Проверяем, инициализирован ли таймер if(BOSS_TrueOrFalse_TimerMin == nil) then return end -- Проверяем количество фрагментов у игрока local a = role.GetRoleItemNum(RoleID, 6600883) -- Выдаем фрагменты в зависимости от активного квеста if role.IsRoleHaveQuest(MapID, InstanceID, RoleID, 30010) == true and a < 90 then role.QuestAddRoleItem(MapID, InstanceID, RoleID, 30010, 6600883, 1, -1, 420) elseif role.IsRoleHaveQuest(MapID, InstanceID, RoleID, 30009) == true and a < 90 then role.QuestAddRoleItem(MapID, InstanceID, RoleID, 30009, 6600883, 1, -1, 420) elseif role.IsRoleHaveQuest(MapID, InstanceID, RoleID, 30008) == true and a < 90 then role.QuestAddRoleItem(MapID, InstanceID, RoleID, 30008, 6600883, 1, -1, 420) end -- 0.14% шанс (1/700) создания существа 6011022 if math.random(700) == 350 then local x, y, z = unit.GetPosition(MapID, InstanceID, TargetID) map.MapCreateCreature(MapID, InstanceID, 6011022, x, y, z) end -- Инициализируем таблицу экипировки игрока, если не существует if B_T_ZhuangBei[RoleID] == nil then B_T_ZhuangBei[RoleID] = {moguang=0, shenguang=0} -- Мощный свет и священный свет end -- Система выдачи предмета 4090016 (священный свет) в зависимости от типа монстра if TargetTypeID < 2055018 and math.random(100) >= 99 and role.GetBagFreeSize(RoleID) >= 1 then -- 1% шанс для монстров первой группы if B_T_ZhuangBei[RoleID].shenguang < math.floor(BOSS_TrueOrFalse_TimerMin / 15) + 1 then role.AddRoleItem(MapID, InstanceID, RoleID, 4090016, 1, -1, 8, 420) B_T_ZhuangBei[RoleID].shenguang = B_T_ZhuangBei[RoleID].shenguang + 1 end elseif TargetTypeID < 2055045 and math.random(100) >= 99 and role.GetBagFreeSize(RoleID) >= 1 then -- 1% шанс для монстров второй группы if B_T_ZhuangBei[RoleID].shenguang < math.floor(BOSS_TrueOrFalse_TimerMin / 8) + 1 then role.AddRoleItem(MapID, InstanceID, RoleID, 4090016, 1, -1, 8, 420) B_T_ZhuangBei[RoleID].shenguang = B_T_ZhuangBei[RoleID].shenguang + 1 end elseif TargetTypeID < 2055072 and math.random(100) >= 98 and role.GetBagFreeSize(RoleID) >= 1 then -- 2% шанс для монстров третьей группы if B_T_ZhuangBei[RoleID].shenguang < math.floor(BOSS_TrueOrFalse_TimerMin / 5) + 1 then role.AddRoleItem(MapID, InstanceID, RoleID, 4090016, 1, -1, 8, 420) B_T_ZhuangBei[RoleID].shenguang = B_T_ZhuangBei[RoleID].shenguang + 1 end end -- Система выдачи предмета 4090015 (мощный свет) в зависимости от типа монстра if TargetTypeID < 2055018 and math.random(150) >= 149 and role.GetBagFreeSize(RoleID) >= 1 then -- 0.67% шанс для монстров первой группы if B_T_ZhuangBei[RoleID].moguang < math.floor(BOSS_TrueOrFalse_TimerMin / 30) + 1 then role.AddRoleItem(MapID, InstanceID, RoleID, 4090015, 1, -1, 8, 420) B_T_ZhuangBei[RoleID].moguang = B_T_ZhuangBei[RoleID].moguang + 1 end elseif TargetTypeID < 2055045 and math.random(100) >= 99 and role.GetBagFreeSize(RoleID) >= 1 then -- 1% шанс для монстров второй группы if B_T_ZhuangBei[RoleID].moguang < math.floor(BOSS_TrueOrFalse_TimerMin / 15) + 1 then role.AddRoleItem(MapID, InstanceID, RoleID, 4090015, 1, -1, 8, 420) B_T_ZhuangBei[RoleID].moguang = B_T_ZhuangBei[RoleID].moguang + 1 end elseif TargetTypeID < 2055072 and math.random(150) >= 149 and role.GetBagFreeSize(RoleID) >= 1 then -- 0.67% шанс для монстров третьей группы if B_T_ZhuangBei[RoleID].moguang < math.floor(BOSS_TrueOrFalse_TimerMin / 10) + 1 then role.AddRoleItem(MapID, InstanceID, RoleID, 4090015, 1, -1, 8, 420) B_T_ZhuangBei[RoleID].moguang = B_T_ZhuangBei[RoleID].moguang + 1 end end end -- Регистрация событий смерти для всех монстров в зоне BOSS -- Первая группа монстров (ID: 2055001-2055017) aux.RegisterCreatureEvent(2055001, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055002, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055004, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055005, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055007, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055008, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055010, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055011, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055013, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055014, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055016, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055017, 4, "BOSS_7Area_OnDie") -- Вторая группа монстров (ID: 2055028-2055044) aux.RegisterCreatureEvent(2055028, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055029, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055031, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055032, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055034, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055035, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055037, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055038, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055040, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055041, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055043, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055044, 4, "BOSS_7Area_OnDie") -- Третья группа монстров (ID: 2055055-2055071) aux.RegisterCreatureEvent(2055055, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055056, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055058, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055059, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055061, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055062, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055064, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055065, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055067, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055068, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055070, 4, "BOSS_7Area_OnDie") aux.RegisterCreatureEvent(2055071, 4, "BOSS_7Area_OnDie") --[[ Функция обработки проверки существа (событие взаимодействия) Параметры: - MapID: ID карты - InstanceID: ID инстанса - TargetID: ID цели (существа) - TargetTypeID: Тип цели (ID типа существа) - RoleID: ID игрока ]] function c6011022_OnCheck(MapID, InstanceID, TargetID, TargetTypeID, RoleID) -- Генерируем случайное число от 1 до 100 local k = math.random(100) -- 20% шанс (k >= 80) - создание специального существа if k >= 80 then -- Получаем позицию существа local x, y ,z = unit.GetPosition(MapID, InstanceID, TargetID) -- Создаем разные существа в зависимости от инстанса if InstanceID == 1 then map.MapCreateCreature(MapID, InstanceID, 2055082, x, y, z) elseif InstanceID == 2 then map.MapCreateCreature(MapID, InstanceID, 2055083, x, y, z) elseif InstanceID == 3 then map.MapCreateCreature(MapID, InstanceID, 2055084, x, y, z) end -- 24% шанс (k >= 56) - выдача предмета 4090015, если есть место в сумке elseif k >= 56 and role.GetBagFreeSize(RoleID) >= 1 then -- Выдаем разное количество предметов в зависимости от инстанса if InstanceID == 1 then role.AddRoleItem(MapID, InstanceID, RoleID, 4090015, 1, -1, 8, 420) elseif InstanceID == 2 then role.AddRoleItem(MapID, InstanceID, RoleID, 4090015, 2, -1, 8, 420) elseif InstanceID == 3 then role.AddRoleItem(MapID, InstanceID, RoleID, 4090015, 2, -1, 8, 420) end -- 56% шанс (k < 56) - выдача предмета 4090016, если есть место в сумке elseif role.GetBagFreeSize(RoleID) >= 1 then -- Выдаем разное количество предметов в зависимости от инстанса if InstanceID == 1 then role.AddRoleItem(MapID, InstanceID, RoleID, 4090016, 1, -1, 8, 420) elseif InstanceID == 2 then role.AddRoleItem(MapID, InstanceID, RoleID, 4090016, 2, -1, 8, 420) elseif InstanceID == 3 then role.AddRoleItem(MapID, InstanceID, RoleID, 4090016, 2, -1, 8, 420) end end end -- Регистрация события взаимодействия с существом aux.RegisterCreatureEvent(6011022, 6, "c6011022_OnCheck") --[[ Функция обработки входа игрока на карту Параметры: - MapID: ID карты - InstanceID: ID инстанса - RoleID: ID игрока ]] function h03_PlayerEnter(MapID, InstanceID, RoleID) -- Получаем текущее время local Hour = tonumber(os.date("%H")) local Min = tonumber(os.date("%M")) local Second = tonumber(os.date("%S")) -- Вычисляем оставшееся время до следующего часа local leftSec = (59 - Min) * 60 + 59 - Second -- Если сейчас 17:00 или 21:00, добавляем час if Hour == 17 or Hour == 21 then leftSec = leftSec + 3600 end -- Синхронизируем время с клиентом local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 16, 28) -- Тип сообщения msg.AddMsgEvent(MsgID, 16, leftSec) -- Оставшееся время msg.DispatchRoleMsgEvent(RoleID, MsgID) end -- Регистрация события входа на карты aux.RegisterMapEvent("h03_1", 2, "h03_PlayerEnter") aux.RegisterMapEvent("h03_2", 2, "h03_PlayerEnter") aux.RegisterMapEvent("h03_3", 2, "h03_PlayerEnter") --[[ Функция завершения квеста 30501 (51 уровень - магическая башня 1) Параметры: - MapID: ID карты - InstanceID: ID инстанса - QuestID: ID квеста - RoleID: ID игрока - NPCID: ID NPC ]] function q30501_Complete(MapID, InstanceID, QuestID, RoleID, NPCID) -- Обновляем серверную статистику UpdateSeverData(50, 1) -- Обновляем статистику игрока UpdateRoleData(RoleID, 11, 1) -- VIP дополнительная награда (если у игрока есть VIP бафф) if role.IsRoleHaveBuff(MapID, InstanceID, RoleID, 90034) == true then -- Если VIP награда еще не выдавалась сегодня или не установлена if role.GetRoleScriptData(RoleID, 1, RoleDataType["zhenjiaVIP"]) == 0 or role.GetRoleScriptData(RoleID, 1, RoleDataType["zhenjiaVIP"]) == nil then role.SetRoleScriptData(RoleID, 1, RoleDataType["zhenjiaVIP"], tonumber(os.date("%j"))) end -- Если VIP награда выдавалась не сегодня if role.GetRoleScriptData(RoleID, 1, RoleDataType["zhenjiaVIP"]) ~= tonumber(os.date("%j")) then -- Вычисляем количество пропущенных дней local theDays = tonumber(os.date("%j")) - role.GetRoleScriptData(RoleID, 1, RoleDataType["zhenjiaVIP"]) - 1 -- Выдаем награду в зависимости от количества пропущенных дней if theDays >= 4 or theDays >= -361 and theDays < 0 then role.AddRoleExp(MapID, InstanceID, RoleID, 1050000*4) -- 4 дня или больше elseif theDays == 3 or theDays == -362 then role.AddRoleExp(MapID, InstanceID, RoleID, 1050000*3) -- 3 дня elseif theDays == 2 or theDays == -363 then role.AddRoleExp(MapID, InstanceID, RoleID, 1050000*2) -- 2 дня elseif theDays == 1 or theDays == -364 then role.AddRoleExp(MapID, InstanceID, RoleID, 1050000) -- 1 день end end end -- Устанавливаем дату выдачи VIP награды role.SetRoleScriptData(RoleID, 1, RoleDataType["zhenjiaVIP"], tonumber(os.date("%j"))) end -- Регистрация события завершения квеста aux.RegisterQuestEvent(30501, 1, "q30501_Complete") --[[ Функция завершения квеста 30502 (51 уровень - магическая башня 2) Параметры: - MapID: ID карты - InstanceID: ID инстанса - QuestID: ID квеста - RoleID: ID игрока - NPCID: ID NPC ]] function q30502_Complete(MapID, InstanceID, QuestID, RoleID, NPCID) -- Получаем данные о системе "Бо" (специальная система прогресса) local Bo_EXP = role.GetRoleScriptData(RoleID, 1, RoleDataType["Bo_EXP"]) -- Опыт "Бо" local Bo_Have = role.GetRoleScriptData(RoleID, 1, RoleDataType["Bo_Have"]) -- Наличие "Бо" local Bo_Rew = role.GetRoleScriptData(RoleID, 1, RoleDataType["Bo_Rew"]) -- Награда "Бо" local Bo_Level = role.GetRoleScriptData(RoleID, 1, RoleDataType["Bo_Level"]) -- Уровень "Бо" -- Если у игрока есть "Бо", добавляем опыт if Bo_Have == 1 then Bo_EXP = Bo_EXP + 20 role.SetRoleScriptData(RoleID, 1, RoleDataType["Bo_EXP"], Bo_EXP) -- Отправляем сообщение о получении опыта local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 13, 0) msg.AddMsgEvent(MsgID, 1, 931009) msg.AddMsgEvent(MsgID, 9, 20) -- Полученный опыт msg.AddMsgEvent(MsgID, 9, 2480-role.GetRoleScriptData(RoleID, 1, RoleDataType["Bo_EXP"])) -- Оставшийся опыт msg.DispatchRoleMsgEvent(RoleID, MsgID) end -- Если опыт превышает лимит и уровень меньше 100, повышаем уровень if Bo_EXP > 2479 and Bo_Level < 100 then Bo_Level = Bo_Level + 1 role.SetRoleScriptData(RoleID, 1, RoleDataType["Bo_Level"], Bo_Level) role.SetRoleScriptData(RoleID, 1, RoleDataType["Bo_EXP"], 0) -- Сбрасываем опыт end -- Обновляем серверную статистику UpdateSeverData(51, 1) -- Обновляем статистику игрока UpdateRoleData(RoleID, 11, 1) -- VIP дополнительная награда (если у игрока есть VIP бафф) if role.IsRoleHaveBuff(MapID, InstanceID, RoleID, 90034) == true then -- Если VIP награда еще не выдавалась сегодня или не установлена if role.GetRoleScriptData(RoleID, 1, RoleDataType["zhenjiaVIP"]) == 0 or role.GetRoleScriptData(RoleID, 1, RoleDataType["zhenjiaVIP"]) == nil then role.SetRoleScriptData(RoleID, 1, RoleDataType["zhenjiaVIP"], tonumber(os.date("%j"))) end -- Если VIP награда выдавалась не сегодня if role.GetRoleScriptData(RoleID, 1, RoleDataType["zhenjiaVIP"]) ~= tonumber(os.date("%j")) then -- Вычисляем количество пропущенных дней local theDays = tonumber(os.date("%j")) - role.GetRoleScriptData(RoleID, 1, RoleDataType["zhenjiaVIP"]) - 1 -- Выдаем награду в зависимости от количества пропущенных дней if theDays >= 4 or theDays >= -361 and theDays < 0 then role.AddRoleExp(MapID, InstanceID, RoleID, 4500000*4) -- 4 дня или больше elseif theDays == 3 or theDays == -362 then role.AddRoleExp(MapID, InstanceID, RoleID, 4500000*3) -- 3 дня elseif theDays == 2 or theDays == -363 then role.AddRoleExp(MapID, InstanceID, RoleID, 4500000*2) -- 2 дня elseif theDays == 1 or theDays == -364 then role.AddRoleExp(MapID, InstanceID, RoleID, 4500000) -- 1 день end end end -- Устанавливаем дату выдачи VIP награды role.SetRoleScriptData(RoleID, 1, RoleDataType["zhenjiaVIP"], tonumber(os.date("%j"))) end -- Регистрация события завершения квеста aux.RegisterQuestEvent(30502, 1, "q30502_Complete") --[[ Функция завершения квеста 30503 (52 уровень - магическая башня 3) Параметры: - MapID: ID карты - InstanceID: ID инстанса - QuestID: ID квеста - RoleID: ID игрока - NPCID: ID NPC ]] function q30503_Complete(MapID, InstanceID, QuestID, RoleID, NPCID) -- Обновляем серверную статистику UpdateSeverData(52, 1) -- Обновляем статистику игрока UpdateRoleData(RoleID, 11, 1) -- VIP дополнительная награда (если у игрока есть VIP бафф) if role.IsRoleHaveBuff(MapID, InstanceID, RoleID, 90034) == true then -- Если VIP награда еще не выдавалась сегодня или не установлена if role.GetRoleScriptData(RoleID, 1, RoleDataType["zhenjiaVIP"]) == 0 or role.GetRoleScriptData(RoleID, 1, RoleDataType["zhenjiaVIP"]) == nil then role.SetRoleScriptData(RoleID, 1, RoleDataType["zhenjiaVIP"], tonumber(os.date("%j"))) end -- Если VIP награда выдавалась не сегодня if role.GetRoleScriptData(RoleID, 1, RoleDataType["zhenjiaVIP"]) ~= tonumber(os.date("%j")) then -- Вычисляем количество пропущенных дней local theDays = tonumber(os.date("%j")) - role.GetRoleScriptData(RoleID, 1, RoleDataType["zhenjiaVIP"]) - 1 -- Выдаем награду в зависимости от количества пропущенных дней if theDays >= 4 or theDays >= -361 and theDays < 0 then role.AddRoleExp(MapID, InstanceID, RoleID, 12000000*4) -- 4 дня или больше elseif theDays == 3 or theDays == -362 then role.AddRoleExp(MapID, InstanceID, RoleID, 12000000*3) -- 3 дня elseif theDays == 2 or theDays == -363 then role.AddRoleExp(MapID, InstanceID, RoleID, 12000000*2) -- 2 дня elseif theDays == 1 or theDays == -364 then role.AddRoleExp(MapID, InstanceID, RoleID, 12000000) -- 1 день end end end -- Устанавливаем дату выдачи VIP награды role.SetRoleScriptData(RoleID, 1, RoleDataType["zhenjiaVIP"], tonumber(os.date("%j"))) end -- Регистрация события завершения квеста aux.RegisterQuestEvent(30503, 1, "q30503_Complete")