-- Таймер на 15 минут - предупреждение о скором окончании -- Вызывается при исчезновении таймерного существа (TypeID 4 и 9) function c15_OnDisappear(MapID, InstanceID, TargetID, TargetTypeID) -- Проверяем входные параметры if MapID == nil or InstanceID == nil or TargetID == nil or TargetTypeID == nil then return end -- Проверяем существование данных арены if Arena[InstanceID] ~= nil and ArenaCreature_Timer[TargetID] ~= nil then local timerType = ArenaCreature_Timer[TargetID].TypeID if timerType == 4 then -- 15-минутное предупреждение об окончании for i = 1, 6 do local playerID = Arena[InstanceID].Player[i] if playerID ~= nil then local playerMap, playerInstance = role.GetRoleMapID(playerID) if playerMap ~= nil and playerInstance ~= nil and playerMap == MapID and playerInstance == InstanceID then local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 101, 206258) -- "Осталось времени: 15 минут" msg.DispatchRoleMsgEvent(playerID, MsgID) end end end elseif timerType == 9 then -- 45-минутное предупреждение for i = 1, 6 do local playerID = Arena[InstanceID].Player[i] if playerID ~= nil then local playerMap, playerInstance = role.GetRoleMapID(playerID) if playerMap ~= nil and playerInstance ~= nil and playerMap == MapID and playerInstance == InstanceID then local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 101, 206259) -- "Осталось времени: 45 минут" msg.DispatchRoleMsgEvent(playerID, MsgID) end end end end end -- Очищаем таймер ArenaCreature_Timer[TargetID] = nil end -- Таймер на 30 минут - предупреждение о начале боя -- Вызывается при исчезновении таймерного существа (TypeID 7) function c30_OnDisappear(MapID, InstanceID, TargetID, TargetTypeID) -- Проверяем входные параметры if MapID == nil or InstanceID == nil or TargetID == nil or TargetTypeID == nil then return end -- Проверяем существование данных арены и таймера if Arena[InstanceID] ~= nil and ArenaCreature_Timer[TargetID] ~= nil and ArenaCreature_Timer[TargetID].TypeID == 7 then -- Проверяем, что бой еще не начался (Battle == 1 - подготовка) if Arena[InstanceID].Battle == 1 then -- Отправляем предупреждение всем игрокам в арене for i = 1, 6 do local playerID = Arena[InstanceID].Player[i] if playerID ~= nil then local playerMap, playerInstance = role.GetRoleMapID(playerID) if playerMap ~= nil and playerInstance ~= nil and playerMap == MapID and playerInstance == InstanceID then local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 101, 206260) -- "До начала боя осталось 30 минут" msg.DispatchRoleMsgEvent(playerID, MsgID) end end end end end -- Очищаем таймер ArenaCreature_Timer[TargetID] = nil end -- Таймер на 60 минут - завершение арены или начало боя -- Вызывается при исчезновении таймерного существа (TypeID 6) function c60_OnDisappear(MapID, InstanceID, TargetID, TargetTypeID) -- Проверяем входные параметры if MapID == nil or InstanceID == nil or TargetID == nil or TargetTypeID == nil then return end -- Проверяем существование данных арены if Arena[InstanceID] == nil then ArenaCreature_Timer[TargetID] = nil return end local battleStatus = Arena[InstanceID].Battle if battleStatus == 2 then -- Бой завершен - финальная обработка for i = 1, 6 do local playerID = Arena[InstanceID].Player[i] if playerID ~= nil then local playerMap, playerInstance = role.GetRoleMapID(playerID) if playerMap ~= nil and playerInstance ~= nil and playerMap == MapID and playerInstance == InstanceID then -- Снимаем специальные состояния арены unit.UnsetState(MapID, InstanceID, playerID, 10) -- PvP защита unit.UnsetState(MapID, InstanceID, playerID, 11) -- PvP усиление -- Воскрешаем мертвых игроков if unit.IsDead(MapID, InstanceID, playerID) then role.ForcedToRevive(MapID, InstanceID, playerID) end -- Удаляем из таблицы арены role.DeletRoleFromArenaTable(playerID) end end end -- Удаляем инстанс карты map.DeleteInstance(MapID, InstanceID) -- Показываем комнату ожидания role.ShowArenaRoomFrame(Arena[InstanceID].Room, 0, 0, 0, 0, 0, 0) -- Очищаем данные арены RemoveValue_Arena(InstanceID) elseif battleStatus == 0 then -- Подготовка к бою - проверка готовности команд for i = 1, 6 do local playerID = Arena[InstanceID].Player[i] if playerID ~= nil then local playerMap, playerInstance = role.GetRoleMapID(playerID) if playerMap ~= nil and playerInstance ~= nil and playerMap == MapID and playerInstance == InstanceID then -- Игрок в арене - ничего не делаем else -- Игрок не в арене - очищаем его данные if ArenaPlayer[playerID] ~= nil and ArenaPlayer[playerID].Info[InstanceID] ~= nil and ArenaPlayer[playerID].Now == InstanceID then ArenaPlayer[playerID].Now = 0 role.DeletRoleFromArenaTable(playerID) end end end end -- Открываем двери для выхода на арену local mapIndex = InstanceID % 3 if ArenaMap[mapIndex] ~= nil then map.OpenCloseDoor(MapID, InstanceID, ArenaMap[mapIndex].Door1, 1) map.OpenCloseDoor(MapID, InstanceID, ArenaMap[mapIndex].Door2, 1) end -- Проверяем готовность команд if Arena[InstanceID].BlueNum == 0 or Arena[InstanceID].RedNum == 0 then -- Одна из команд отсутствует - завершаем матч Arena[InstanceID].Battle = 2 ShowArenaFinalFrame(MapID, InstanceID) -- Создаем таймер для финальной обработки local creature1 = map.MapCreateCreature(MapID, InstanceID, 1094003, 6, 1, 9) if creature1 ~= nil then ArenaCreature_Timer[creature1] = { TypeID = 6 } -- 60-минутный таймер финальной битвы end else -- Обе команды готовы - начинаем бой Arena[InstanceID].Battle = 1 -- Отправляем сообщение о начале боя local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 101, 206261) -- "Бой начинается!" for i = 1, 6 do local playerID = Arena[InstanceID].Player[i] if playerID ~= nil then local playerMap, playerInstance = role.GetRoleMapID(playerID) if playerMap ~= nil and playerInstance ~= nil and playerMap == MapID and playerInstance == InstanceID then msg.DispatchRoleMsgEvent(playerID, MsgID) end end end -- Создаем таймер на 10 минут до начала основного боя local creature1 = map.MapCreateCreature(MapID, InstanceID, 1094004, 6, 1, 9) if creature1 ~= nil then ArenaCreature_Timer[creature1] = { TypeID = 5 } -- 10-минутный таймер до начала боя end end end -- Очищаем таймер ArenaCreature_Timer[TargetID] = nil end -- Таймер на 10 минут - начало основного боя -- Вызывается при исчезновении таймерного существа (TypeID 2 и 5) function c600_OnDisappear(MapID, InstanceID, TargetID, TargetTypeID) -- Проверяем входные параметры if MapID == nil or InstanceID == nil or TargetID == nil or TargetTypeID == nil then return end -- Проверяем существование данных арены if Arena[InstanceID] == nil or ArenaCreature_Timer[TargetID] == nil then ArenaCreature_Timer[TargetID] = nil return end local timerType = ArenaCreature_Timer[TargetID].TypeID if timerType == 2 then -- Таймер типа 2 - предупреждение за 1 минуту до начала боя if Arena[InstanceID].Battle == 1 then -- Отправляем предупреждение всем игрокам for i = 1, 6 do local playerID = Arena[InstanceID].Player[i] if playerID ~= nil then local playerMap, playerInstance = role.GetRoleMapID(playerID) if playerMap ~= nil and playerInstance ~= nil and playerMap == MapID and playerInstance == InstanceID then local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 101, 206262) -- "До начала боя осталось 1 минута" msg.DispatchRoleMsgEvent(playerID, MsgID) end end end -- Создаем таймер на 30 минут для ожидания результатов local creature1 = map.MapCreateCreature(MapID, InstanceID, 1094002, 6, 1, 9) if creature1 ~= nil then ArenaCreature_Timer[creature1] = { TypeID = 7 } -- 30-минутный таймер ожидания результатов end end else -- Таймер типа 5 - начало основного боя через 10 минут if Arena[InstanceID].Battle == 1 then -- Начинаем основной бой Arena[InstanceID].Battle = 2 -- Показываем финальный экран ShowArenaFinalFrame(MapID, InstanceID) -- Создаем таймер для завершения боя через 30 минут local creature1 = map.MapCreateCreature(MapID, InstanceID, 1094003, 6, 1, 9) if creature1 ~= nil then ArenaCreature_Timer[creature1] = { TypeID = 6 } -- 30-минутный таймер финальной битвы end end end -- Очищаем текущий таймер ArenaCreature_Timer[TargetID] = nil end -- Регистрация таймеров существ арены -- Событие 13 - исчезновение существа (OnDisappear) -- CreatureID соответствуют разным типам таймеров: -- 1094001 - 15/45 минутное предупреждение (c15_OnDisappear) -- 1094002 - 30 минутное предупреждение (c30_OnDisappear) -- 1094003 - 60 минутный таймер завершения (c60_OnDisappear) -- 1094004 - 10 минутный таймер начала боя (c600_OnDisappear) aux.RegisterCreatureEvent(1094001, 13, "c15_OnDisappear") -- 15/45 мин предупреждение aux.RegisterCreatureEvent(1094002, 13, "c30_OnDisappear") -- 30 мин предупреждение aux.RegisterCreatureEvent(1094003, 13, "c60_OnDisappear") -- 60 мин завершение aux.RegisterCreatureEvent(1094004, 13, "c600_OnDisappear") -- 10 мин начало боя