--[[ ======================================== ПИК ОТВАЖНЫХ - СИСТЕМА МОНСТРОВ ======================================== Файл: monsters.lua Описание: Система управления монстрами и событиями карты pd01 Автор: Система Версия: 1.0 Функциональность: - Обработка входа игроков на карту - Создание и управление монстрами - Система возрождения персонажей - Система наград и опыта - Проверка уровня для входа Карта: pd01 (Пик отважных) Монстры: 1100300-1100320 (21 тип монстров) ]] --[[ ======================================== КОНСТАНТЫ И НАСТРОЙКИ ======================================== ]] -- ID карты Пик отважных local MAP_ID = 3772027712 -- ID карты возрождения local REVIVE_MAP_ID = 3424073512 -- Координаты возрождения local REVIVE_X = 610 local REVIVE_Y = 23094 local REVIVE_Z = 669 -- Минимальный уровень для входа local MIN_LEVEL = 80 -- ID баффа для входа на карту local ENTRY_BUFF_ID = 9999801 -- ID баффа для удаления при выходе local EXIT_BUFF_ID = 99998 -- ID баффа для зоны 1 local ZONE1_BUFF_ID = 9836901 -- ID предмета награды local REWARD_ITEM_ID = 6601239 -- Базовый опыт за монстра local BASE_EXP = 57500 -- Базовый ID монстров local BASE_MONSTER_ID = 1100299 -- Количество монстров для создания новой волны local MONSTERS_PER_WAVE = 5 -- Максимальное количество убитых монстров local MAX_MONSTER_KILLS = 105 -- Координаты создания монстров local MONSTER_SPAWNS = { {x = 461, y = 4209, z = 442}, {x = 459, y = 4209, z = 459}, {x = 437, y = 4209, z = 459}, {x = 436, y = 4209, z = 446}, {x = 448, y = 4209, z = 445} } --[[ ======================================== ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ======================================== ]] --[[ Функция: Создание монстров в указанных точках Параметры: - MapID: ID карты - InstanceID: ID инстанса - MonsterTypeID: ID типа монстра Возвращает: - true: Успешно созданы - false: Ошибка создания ]] local function CreateMonstersAtSpawns(MapID, InstanceID, MonsterTypeID) for _, spawn in ipairs(MONSTER_SPAWNS) do local success = map.MapCreateColCreature(MapID, InstanceID, MonsterTypeID, spawn.x, spawn.y, spawn.z, 1) if not success then -- Ошибка создания монстра - обработка в коде выше end end return true end --[[ Функция: Получение количества убитых монстров Параметры: - MapID: ID карты - InstanceID: ID инстанса Возвращает: - Количество убитых монстров ]] local function GetMonsterKillCount(MapID, InstanceID) return map.GetMapScriptData(MapID, InstanceID, 1, 1) or 0 end --[[ Функция: Увеличение счетчика убитых монстров Параметры: - MapID: ID карты - InstanceID: ID инстанса Возвращает: - Новое количество убитых монстров ]] local function IncrementMonsterKillCount(MapID, InstanceID) local currentCount = GetMonsterKillCount(MapID, InstanceID) local newCount = currentCount + 1 map.SetMapScriptData(MapID, InstanceID, 1, 1, newCount) return newCount end --[[ ======================================== ОБРАБОТЧИКИ СОБЫТИЙ КАРТЫ ======================================== ]] --[[ Обработчик входа игрока на карту pd01 - Добавляет бафф для входа - Создает начальную волну монстров ]] function pd01_OnPlayerEnter(MapID, InstanceID, RoleID) -- Добавление баффа для входа на карту unit.AddBuff(MapID, InstanceID, RoleID, ENTRY_BUFF_ID, RoleID) -- Создание начальной волны монстров (тип 1100300) CreateMonstersAtSpawns(MapID, InstanceID, 1100300) end -- Регистрация обработчика входа игрока aux.RegisterMapEvent("pd01", 2, "pd01_OnPlayerEnter") --[[ Обработчик выхода игрока с карты pd01 - Удаляет бафф при выходе - Удаляет инстанс карты ]] function pd01_DeleteBuff(MapID, InstanceID, RoleID) -- Проверка наличия баффа для удаления local hasBuff = role.IsRoleHaveBuff(MapID, InstanceID, RoleID, ENTRY_BUFF_ID) if hasBuff == true then unit.CancelBuff(MapID, InstanceID, RoleID, ENTRY_BUFF_ID) end -- Удаление инстанса карты при выходе -- Проверяем, что это действительно карта pd01 if MapID == MAP_ID then map.DeleteInstance(MapID, InstanceID) end end -- Регистрация обработчика выхода игрока aux.RegisterMapEvent("pd01", 3, "pd01_DeleteBuff") --[[ Обработчик входа игрока в зону 1 - Добавляет специальный бафф для зоны ]] function pd01_OnRoleEnterArea1(MapID, InstanceID, RoleID, ObjAreaID) if ObjAreaID == 816 then unit.AddBuff(MapID, InstanceID, RoleID, ZONE1_BUFF_ID, RoleID) end end -- Регистрация обработчика входа в зону aux.RegisterMapEvent("pd01", 7, "pd01_OnRoleEnterArea1") --[[ Обработчик возрождения персонажа - Устанавливает координаты возрождения на карту возрождения - НЕ удаляет инстанс здесь (удаление происходит при выходе с карты) ]] function pd01_RoleRevive(MapID, InstanceID, RoleID, Type, ReviveHP, ReviveMP, x, y, z, RebornMapID) -- Проверяем входные параметры if MapID == nil or InstanceID == nil or RoleID == nil then return ReviveHP, ReviveMP, x, y, z, RebornMapID end -- Получение максимального HP и MP персонажа ReviveHP = role.GetRoleAttValue(MapID, InstanceID, RoleID, 8) -- Максимальное HP ReviveMP = role.GetRoleAttValue(MapID, InstanceID, RoleID, 10) -- Максимальное MP -- Установка координат возрождения на карту возрождения x = REVIVE_X y = REVIVE_Y z = REVIVE_Z -- Возврат параметров возрождения -- НЕ удаляем инстанс здесь - это может вызвать проблемы с системой возрождения return ReviveHP, ReviveMP, x, y, z, REVIVE_MAP_ID end -- Регистрация обработчика возрождения aux.RegisterMapEvent("pd01", 11, "pd01_RoleRevive") --[[ Обработчик проверки возможности входа при онлайн статусе - Возвращает координаты для входа ]] function pd01_CanTakeOverWhenOnline(MapID, RoleID) return REVIVE_MAP_ID, REVIVE_X, REVIVE_Y, REVIVE_Z end -- Регистрация обработчика проверки входа aux.RegisterMapEvent("pd01", 12, "pd01_CanTakeOverWhenOnline") --[[ Обработчик получения координат экспорта - Возвращает координаты для выхода с карты ]] function pd01_GetExporMapAndCoord(MapID, InstanceID, RoleID) return 1, REVIVE_MAP_ID, REVIVE_X, REVIVE_Y, REVIVE_Z end -- Регистрация обработчика экспорта aux.RegisterMapEvent("pd01", 13, "pd01_GetExporMapAndCoord") --[[ Обработчик получения идеальной карты - Возвращает ID персонажа ]] function pd01_GetOnePerfectMap(MapID, InstanceID, RoleID) return RoleID end -- Регистрация обработчика идеальной карты aux.RegisterMapEvent("pd01", 14, "pd01_GetOnePerfectMap") --[[ Обработчик проверки возможности входа на карту - Проверяет минимальный уровень персонажа ]] function pd01_CanEnter(MapID, InstanceID, RoleID) local playerLevel = role.GetRoleLevel(MapID, InstanceID, RoleID) if playerLevel >= MIN_LEVEL then return 1 -- Разрешено войти else return 0 -- Запрещено войти end end -- Регистрация обработчика проверки входа aux.RegisterMapEvent("pd01", 15, "pd01_CanEnter") --[[ ======================================== ОБРАБОТЧИКИ СОБЫТИЙ МОНСТРОВ ======================================== ]] --[[ Обработчик смерти монстра - Увеличивает счетчик убитых монстров - Создает новую волну монстров каждые 5 убийств - Выдает награды и опыт - Переводит игрока на другую карту при достижении лимита ]] function bravePeakMonster_OnDie(MapID, InstanceID, CreatureID, CreatureTypeID, KillerID) -- Увеличение счетчика убитых монстров local currMonsterNum = IncrementMonsterKillCount(MapID, InstanceID) -- Проверка необходимости создания новой волны монстров local num = currMonsterNum % MONSTERS_PER_WAVE if num == 0 then -- Создание новой волны монстров (следующий тип) CreateMonstersAtSpawns(MapID, InstanceID, CreatureTypeID + 1) end -- Определение количества наградных предметов local numi = 1 -- Базовое количество if role.IsRoleHaveBuff(MapID, InstanceID, KillerID, 90034) == true then numi = 2 -- Двойная награда с баффом end -- Выдача наград role.AddRoleItem(MapID, InstanceID, KillerID, REWARD_ITEM_ID, numi, -1, 8, 420) -- Выдача опыта (зависит от типа монстра) local expGain = BASE_EXP * (CreatureTypeID - BASE_MONSTER_ID) role.AddRoleExp(MapID, InstanceID, KillerID, expGain) -- Проверка достижения лимита убийств if currMonsterNum >= MAX_MONSTER_KILLS then -- Перевод игрока на карту возрождения role.RoleGotoNewMap(MapID, InstanceID, KillerID, REVIVE_MAP_ID, REVIVE_X, REVIVE_Y, REVIVE_Z) -- Удаление инстанса карты (используем InstanceID, а не KillerID) map.DeleteInstance(MapID, InstanceID) end end --[[ ======================================== РЕГИСТРАЦИЯ ОБРАБОТЧИКОВ МОНСТРОВ ======================================== Регистрируем обработчики смерти для всех типов монстров (1100300-1100320) Каждый монстр использует один и тот же обработчик bravePeakMonster_OnDie ]] -- Регистрация обработчиков для всех типов монстров for i = 0, 20 do local monsterID = 1100300 + i aux.RegisterCreatureEvent(monsterID, 4, "bravePeakMonster_OnDie") end --[[ ======================================== ИНФОРМАЦИЯ О СИСТЕМЕ ======================================== Система "Пик отважных" представляет собой карту с монстрами: 1. Вход на карту: - Минимальный уровень: 80 - Добавляется бафф входа - Создается начальная волна монстров 2. Система монстров: - 21 тип монстров (1100300-1100320) - Каждые 5 убийств создается новая волна - Максимум 105 убийств для завершения 3. Система наград: - Базовое количество предметов: 1 - С баффом 90034: 2 предмета - Опыт зависит от типа монстра 4. Система возрождения: - Координаты: 610, 23094, 669 - Карта возрождения: 3424073512 5. Специальные зоны: - Зона 816: добавляет бафф 9836901 Система автоматически управляет созданием монстров, выдачей наград и переводом игроков между картами. ]]