-- ======================================== -- СИСТЕМА ШТРАФОВ ЗА СМЕРТЬ -- ======================================== -- Функции управления штрафами при смерти игрока -- ======================================== -- Вспомогательная функция для проверки карт с базовыми штрафами local function IsBasicPenaltyMap(MapID) local penaltyMaps = { [3618849499] = true, -- test02 [3424073512] = true, -- s02 [3424073256] = true, -- s03 [3424071976] = true, -- s04 [3424071720] = true, -- s05 [3424072488] = true, -- s06 [3424072232] = true, -- s07 [3424075048] = true -- s08 } return penaltyMaps[MapID] or false end -- ======================================== -- ПРОВЕРКА ШТРАФА ЗА ЛУТ ЭКИПИРОВКИ -- ======================================== -- Возвращает: false - штраф отключен, true - штраф активен function r_RoleIsEquipLootPenalty(MapID, InstanceID, RoleID) -- Проверяем входные параметры if MapID == nil or InstanceID == nil or RoleID == nil then return false end -- Если игрок держит сундук - штрафы отключены if role.IsRoleInStatus(ERS_HoldChest) then return false end -- Проверяем, находится ли карта в списке с базовыми штрафами return IsBasicPenaltyMap(MapID) end -- ======================================== -- ПРОВЕРКА ШТРАФА ЗА ОПЫТ -- ======================================== -- Возвращает: false - штраф отключен, true - штраф активен function r_RoleIsExpPenalty(MapID, InstanceID, RoleID) -- Проверяем входные параметры if MapID == nil or InstanceID == nil or RoleID == nil then return false end -- Если игрок держит сундук - штрафы отключены if role.IsRoleInStatus(ERS_HoldChest) then return false end -- Проверяем, находится ли карта в списке с базовыми штрафами return IsBasicPenaltyMap(MapID) end -- ======================================== -- ПРОВЕРКА ШТРАФА ЗА РАНЫ -- ======================================== -- Возвращает: false - штраф отключен, true - штраф активен -- Вспомогательная функция для проверки исключений ран local function IsInjuryExceptionMap(MapID) -- Проверяем специальные карты, где штрафы за раны отключены if MapID == MapID_FX or MapID == MapID_ZL or MapID == MapID_WS then return true end -- Проверяем тестовые и специальные карты local exceptionMaps = { [3618849499] = true, -- test02 [3772027712] = true, -- Специальная карта [965742749] = true, -- Специальная карта [965743517] = true, -- Специальная карта [965743261] = true, -- Специальная карта [965744029] = true, -- Специальная карта [2092183860] = true, -- Арена 1 [2092184116] = true, -- Арена 2 [2092184372] = true, -- Арена 3 [S59_MapID] = true -- S59 карта } return exceptionMaps[MapID] or false end function r_RoleIsInjuryPenalty(MapID, InstanceID, RoleID) -- Проверяем входные параметры if MapID == nil or InstanceID == nil or RoleID == nil then return false end -- Если игрок держит сундук - штрафы отключены if role.IsRoleInStatus(ERS_HoldChest) then return false end -- Проверяем исключения для ран if IsInjuryExceptionMap(MapID) then return false end -- По умолчанию штрафы за раны активны return true end -- ======================================== -- ПРОВЕРКА ШТРАФА ЗА МОРАЛЬ -- ======================================== -- Возвращает: false - штраф отключен, true - штраф активен -- Вспомогательная функция для проверки исключений морали local function IsMoralityExceptionMap(MapID) -- Проверяем специальные карты, где штрафы за мораль отключены if MapID == MapID_FX or MapID == MapID_ZL or MapID == MapID_WS or MapID == S59_MapID then return true end -- Проверяем карты с исключениями для морали local exceptionMaps = { [2766543506] = true, -- Специальная карта 1 [2766543250] = true, -- Специальная карта 2 [3772027712] = true, -- Специальная карта 3 [965742749] = true, -- Специальная карта 4 [965743517] = true, -- Специальная карта 5 [965743261] = true, -- Специальная карта 6 [965744029] = true, -- Специальная карта 7 [2766542994] = true, -- Специальная карта 8 [2092183860] = true, -- Арена 1 [2092184116] = true, -- Арена 2 [2092184372] = true -- Арена 3 } return exceptionMaps[MapID] or false end function r_RoleIsMoralityPenalty(MapID, InstanceID, RoleID) -- Проверяем входные параметры if MapID == nil or InstanceID == nil or RoleID == nil then return false end -- Если игрок держит сундук - штрафы отключены if role.IsRoleInStatus(ERS_HoldChest) then return false end -- Специальный случай для тестовой карты if MapID == 3618849499 then -- test02 return true end -- Проверяем исключения для морали if IsMoralityExceptionMap(MapID) then return false end -- По умолчанию штрафы за мораль активны return true end -- ======================================== -- ПРОВЕРКА ШТРАФА ЗА ВРАЖДЕБНОСТЬ -- ======================================== -- Проверяет штрафы за враждебность в специальных зонах function IsMinusHostilityPenalty(MapID, RoleID) -- Проверяем входные параметры if MapID == nil or RoleID == nil then return true -- По умолчанию штрафы активны при ошибке end -- Проверяем, находится ли игрок в специальной зоне захвата if map.IsInArea(MapID, InstanceID, RoleID, GetAreaID(MapID)) ~= 0 then local GuildID = guild.GetRoleGuildID(RoleID) if GuildID ~= 4294967295 then -- Проверяем, является ли гильдия захватывающей if IsInGodCaptureGuild(GuildID) == 1 then return false -- Штрафы отключены для захватывающих гильдий end end end -- По умолчанию штрафы за враждебность активны return true end -- ======================================== -- ПРОВЕРКА ШТРАФА ЗА ВРАЖДЕБНОСТЬ -- ======================================== -- Возвращает: false - штраф отключен, true - штраф активен function r_RoleIsHostilityPenalty(MapID, InstanceID, RoleID) -- Проверяем входные параметры if MapID == nil or InstanceID == nil or RoleID == nil then return false end -- В текущей реализации штрафы за враждебность всегда отключены return false end -- ======================================== -- ПРОВЕРКА ШТРАФА ЗА ТОРГОВЛЮ -- ======================================== -- Возвращает: false - штраф отключен, true - штраф активен function r_RoleIsCommercePenalty(MapID, InstanceID, RoleID) -- Проверяем входные параметры if MapID == nil or InstanceID == nil or RoleID == nil then return false end -- В текущей реализации штрафы за торговлю всегда отключены return false end -- ======================================== -- ОТМЕНА ШТРАФОВ -- ======================================== -- Позволяет игроку отменить штрафы при определенных условиях -- Возвращает: 5 значений (1-отмена всех штрафов, 2-отмена опыта, 3-отмена ран, 4-отмена морали, 5-отмена торговли) function r_RoleCanCancelPenalty(MapID, InstanceID, RoleID, KillerID) -- Проверяем входные параметры if MapID == nil or InstanceID == nil or RoleID == nil then return false, false, false, false, false end -- Если игрок держит сундук - все штрафы отменяются if role.IsRoleInStatus(ERS_HoldChest) then return true, true, true, true, true end -- Получаем уровень морали игрока local morality = role.GetRoleAttValue(MapID, InstanceID, RoleID, 74) -- Если мораль очень низкая (<= -30), проверяем возможность использования предметов отмены if morality <= -30 then -- Проверяем наличие связанного камня отмены (3070020) local boundStoneCount = role.GetRoleItemNum(RoleID, 3070020) if boundStoneCount > 0 then -- Используем связанный камень role.RemoveFromRole(MapID, InstanceID, RoleID, 3070020, 1, 300) local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 26, 11001) -- Сообщение об использовании камня msg.DispatchRoleMsgEvent(RoleID, MsgID) return true, false, false, false, false else -- Проверяем наличие несвязанного камня отмены (3070021) local unboundStoneCount = role.GetRoleItemNum(RoleID, 3070021) if unboundStoneCount > 0 then -- Используем несвязанный камень role.RemoveFromRole(MapID, InstanceID, RoleID, 3070021, 1, 300) local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 26, 11001) -- Сообщение об использовании камня msg.DispatchRoleMsgEvent(RoleID, MsgID) return true, false, false, false, false end end end -- По умолчанию отмена штрафов невозможна return false, false, false, false, false end -- ======================================== -- ПОТЕРЯ ПОЛЯ ЗРЕНИЯ -- ======================================== -- Определяет, потеряет ли игрок поле зрения при смерти -- Возвращает: false - поле зрения сохранится, true - поле зрения будет потеряно function r_RoleWillLoseField(MapID, InstanceID, RoleID) -- Проверяем входные параметры if MapID == nil or InstanceID == nil or RoleID == nil then return false end -- Если игрок держит сундук - поле зрения сохраняется if role.IsRoleInStatus(ERS_HoldChest) then return false end -- Проверяем специальные карты, где поле зрения не теряется if MapID == MapID_FX or MapID == MapID_ZL or MapID == MapID_WS or MapID == S59_MapID then return false end -- Проверяем тестовые и специальные карты local safeMaps = { [3618849499] = true, -- test02 [3772027712] = true, -- Специальная карта [965742749] = true, -- Специальная карта [965743517] = true, -- Специальная карта [965743261] = true, -- Специальная карта [965744029] = true, -- Специальная карта [2092183860] = true, -- Арена 1 [2092184116] = true, -- Арена 2 [2092184372] = true -- Арена 3 } if safeMaps[MapID] then return false end -- По умолчанию поле зрения теряется return true end -- ======================================== -- РЕГИСТРАЦИЯ СОБЫТИЙ -- ======================================== -- Регистрируем обработчики событий для системы штрафов aux.RegisterRoleEvent(15, "r_RoleIsEquipLootPenalty") -- Штраф за лут экипировки aux.RegisterRoleEvent(16, "r_RoleIsExpPenalty") -- Штраф за опыт aux.RegisterRoleEvent(17, "r_RoleIsInjuryPenalty") -- Штраф за раны aux.RegisterRoleEvent(18, "r_RoleIsMoralityPenalty") -- Штраф за мораль aux.RegisterRoleEvent(22, "r_RoleCanCancelPenalty") -- Возможность отмены штрафов aux.RegisterRoleEvent(66, "r_RoleWillLoseField") -- Потеря поля зрения -- ======================================== -- ИНФОРМАЦИЯ О СИСТЕМЕ -- ======================================== -- -- Система штрафов за смерть управляет следующими аспектами: -- -- 1. ШТРАФЫ ЗА ЛУТ ЭКИПИРОВКИ (r_RoleIsEquipLootPenalty) -- - Определяет, может ли игрок терять экипировку при смерти -- - Активен на основных картах (s02-s08, test02) -- - Отключается при удержании сундука -- -- 2. ШТРАФЫ ЗА ОПЫТ (r_RoleIsExpPenalty) -- - Определяет потерю опыта при смерти -- - Активен на тех же картах, что и штрафы за лут -- -- 3. ШТРАФЫ ЗА РАНЫ (r_RoleIsInjuryPenalty) -- - Определяет получение ран при смерти -- - Отключается на специальных картах и аренах -- -- 4. ШТРАФЫ ЗА МОРАЛЬ (r_RoleIsMoralityPenalty) -- - Определяет влияние на мораль игрока -- - Специальная логика для тестовой карты -- -- 5. ШТРАФЫ ЗА ВРАЖДЕБНОСТЬ (r_RoleIsHostilityPenalty) -- - В текущей версии отключены -- -- 6. ШТРАФЫ ЗА ТОРГОВЛЮ (r_RoleIsCommercePenalty) -- - В текущей версии отключены -- -- 7. ОТМЕНА ШТРАФОВ (r_RoleCanCancelPenalty) -- - Позволяет отменить штрафы при низкой морали -- - Использует специальные предметы (камни отмены) -- -- 8. ПОТЕРЯ ПОЛЯ ЗРЕНИЯ (r_RoleWillLoseField) -- - Определяет, потеряет ли игрок поле зрения -- - Отключается на специальных картах -- -- СПЕЦИАЛЬНЫЕ КАРТЫ: -- - MapID_FX, MapID_ZL, MapID_WS: Основные безопасные зоны -- - S59_MapID: Специальная карта S59 -- - Арены (2092183860, 2092184116, 2092184372): Без штрафов -- - Тестовые карты: Ограниченные штрафы -- -- ПРЕДМЕТЫ ОТМЕНЫ ШТРАФОВ: -- - 3070020: Связанный камень отмены -- - 3070021: Несвязанный камень отмены --