-- ======================================== -- СИСТЕМА БРАКА -- ======================================== -- Функции управления браком между игроками -- ======================================== -- Глобальные константы системы брака local MARRIAGE_CONSTANTS = { -- Значение дружбы для брака FRIENDSHIP_VALUE = 720, -- Стоимость заключения брака (серебро) MARRIAGE_COST = 660000, -- Стоимость развода (серебро) DIVORCE_COST = 1000000, -- Стоимость свадьбы (серебро) WEDDING_COST = 1000000, -- Предметы для брака ENGAGEMENT_RING = 4800110, -- Обручальное кольцо для предложения WEDDING_RING = 4800111, -- Свадебное кольцо -- Навыки брака MARRIAGE_SKILL_1 = 90006, -- Навык брака 1 MARRIAGE_SKILL_2 = 90007, -- Навык брака 2 -- Типы существ для церемонии CREATURE_FIREWORK = 5600064, -- Фейерверк CREATURE_FLOWER_1 = 5600060, -- Цветы тип 1 CREATURE_FLOWER_2 = 5600061, -- Цветы тип 2 CREATURE_FLOWER_3 = 5600062, -- Цветы тип 3 CREATURE_BALLOON = 5610049, -- Воздушный шар -- Баффы для церемонии BUFFS = {6001401, 6001701, 6001801, 6001901} } -- Глобальная переменная для хранения списка существ церемонии local Marriage_Monster = Marriage_Monster or {} -- Экспорт констант для совместимости marriage_FriendShipVal = MARRIAGE_CONSTANTS.FRIENDSHIP_VALUE marriage_GetMarriageDecSilver = MARRIAGE_CONSTANTS.MARRIAGE_COST marriage_BreakMarriageDecSilver = MARRIAGE_CONSTANTS.DIVORCE_COST marriage_WeddingDecSilver = MARRIAGE_CONSTANTS.WEDDING_COST -- ======================================== -- СОБЫТИЕ ЗАКЛЮЧЕНИЯ БРАКА -- ======================================== -- Основная функция обработки заключения брака function Marriage_GetMarriageEvent(MapID, InstanceID, ApplicantRoleID, TargetRoleID) -- Проверяем входные параметры if MapID == nil or InstanceID == nil or ApplicantRoleID == nil or TargetRoleID == nil then return end -- Удаляем обручальные кольца для предложения у обоих игроков role.RemoveFromRole(MapID, InstanceID, ApplicantRoleID, MARRIAGE_CONSTANTS.ENGAGEMENT_RING, 1, 101) local TargetMapID, TargetInstanceID = role.GetRoleMapID(TargetRoleID) if TargetMapID ~= nil and TargetInstanceID ~= nil then role.RemoveFromRole(TargetMapID, TargetInstanceID, TargetRoleID, MARRIAGE_CONSTANTS.ENGAGEMENT_RING, 1, 101) end -- Добавляем свадебные кольца обоим игрокам if TargetMapID ~= nil and TargetInstanceID ~= nil then role.AddRoleItem(TargetMapID, TargetInstanceID, TargetRoleID, MARRIAGE_CONSTANTS.WEDDING_RING, 1, -1, 3, 104) end role.AddRoleItem(MapID, InstanceID, ApplicantRoleID, MARRIAGE_CONSTANTS.WEDDING_RING, 1, -1, 3, 104) -- Определяем роли по полу (избегаем глобальных переменных) local MaleRoleID, FeMaleRoleID if role.GetRoleSex(ApplicantRoleID) == 0 then MaleRoleID = TargetRoleID FeMaleRoleID = ApplicantRoleID else MaleRoleID = ApplicantRoleID FeMaleRoleID = TargetRoleID end -- Отправляем мировое сообщение о заключении брака local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 100, 500) -- "Поздравляем с заключением брака: ### (мужчина) и ### (женщина) теперь муж и жена, желаем счастья и любви до конца жизни!" msg.AddMsgEvent(MsgID, 2, MaleRoleID) -- ID мужчины msg.AddMsgEvent(MsgID, 2, FeMaleRoleID) -- ID женщины msg.DispatchWorldMsgEvent(MsgID) -- Запускаем свадебную церемонию Marriage_StartCeremony(TargetRoleID) end -- ======================================== -- ЗАПУСК СВАДЕБНОЙ ЦЕРЕМОНИИ -- ======================================== -- Создает декоративные существа для церемонии брака function Marriage_StartCeremony(TargetRoleID) -- Проверяем входные параметры if TargetRoleID == nil then return end -- Получаем текущую карту цели local CeremonyMapID, CeremonyInstanceID = role.GetRoleMapID(TargetRoleID) if CeremonyMapID == nil or CeremonyInstanceID == nil then return end -- Очищаем предыдущих существ церемонии Marriage_ClearCeremonyCreatures(CeremonyMapID, CeremonyInstanceID) -- Координаты для фейерверков (16 позиций) local fireworkPositions = { {14550, 3132, 20650}, {14300, 3132, 20850}, {14050, 3132, 21050}, {15950, 3480, 20700}, {15800, 3480, 21150}, {15400, 3480, 21650}, {15100, 3480, 21850}, {14750, 3480, 22100}, {11550, 3132, 20650}, {11800, 3132, 20850}, {12050, 3132, 21050}, {10150, 3480, 20700}, {10300, 3480, 21150}, {10700, 3480, 21650}, {11000, 3480, 21850}, {11350, 3480, 22100} } -- Координаты для цветов (11 позиций) local flowerPositions = { {x = 250, y = 3199, z = 374}, {x = 250, y = 3199, z = 364}, {x = 250, y = 3199, z = 351}, {x = 250, y = 3199, z = 343}, {x = 272, y = 3199, z = 374}, {x = 272, y = 3199, z = 364}, {x = 272, y = 3199, z = 351}, {x = 272, y = 3199, z = 343}, {x = 260, y = 3403, z = 426}, {x = 256, y = 3403, z = 426}, {x = 264, y = 3403, z = 426} } -- Координаты для воздушных шаров (10 позиций) local balloonPositions = { {x = 14616, y = 3080, z = 17946}, {x = 14464, y = 3082, z = 19760}, {x = 13796, y = 3403, z = 20842}, {x = 13797, y = 3403, z = 21348}, {x = 12298, y = 3403, z = 21350}, {x = 12295, y = 3403, z = 20836}, {x = 11517, y = 3089, z = 19524}, {x = 11320, y = 3093, z = 19085}, {x = 11596, y = 3115, z = 17906}, {x = 14681, y = 3093, z = 18795} } -- Создаем фейерверки (16 штук) for i = 1, #fireworkPositions do local creatureID = map.MapCreateColCreature( CeremonyMapID, CeremonyInstanceID, MARRIAGE_CONSTANTS.CREATURE_FIREWORK, math.floor(fireworkPositions[i][1] / 50), fireworkPositions[i][2], math.floor(fireworkPositions[i][3] / 50), true, "" ) if creatureID ~= nil then Marriage_Monster[#Marriage_Monster + 1] = creatureID -- Добавляем случайный бафф local randomBuff = MARRIAGE_CONSTANTS.BUFFS[math.random(#MARRIAGE_CONSTANTS.BUFFS)] unit.AddBuff(CeremonyMapID, CeremonyInstanceID, creatureID, randomBuff, creatureID) end end -- Создаем цветы (11 штук) for i = 1, #flowerPositions do local creatureType = MARRIAGE_CONSTANTS.CREATURE_FLOWER_1 if i >= 9 and i <= 10 then creatureType = MARRIAGE_CONSTANTS.CREATURE_FLOWER_2 elseif i == 11 then creatureType = MARRIAGE_CONSTANTS.CREATURE_FLOWER_3 end local creatureID = map.MapCreateColCreature( CeremonyMapID, CeremonyInstanceID, creatureType, flowerPositions[i].x, flowerPositions[i].y, flowerPositions[i].z, true, "" ) if creatureID ~= nil then Marriage_Monster[#Marriage_Monster + 1] = creatureID end end -- Создаем воздушные шары (10 штук) for i = 1, #balloonPositions do local creatureID = map.MapCreateColCreature( CeremonyMapID, CeremonyInstanceID, MARRIAGE_CONSTANTS.CREATURE_BALLOON, math.floor(balloonPositions[i].x / 50), balloonPositions[i].y, math.floor(balloonPositions[i].z / 50), true, "" ) if creatureID ~= nil then Marriage_Monster[#Marriage_Monster + 1] = creatureID end end end -- ======================================== -- ОЧИСТКА СУЩЕСТВ ЦЕРЕМОНИИ -- ======================================== -- Удаляет все существа свадебной церемонии function Marriage_ClearCeremonyCreatures(MapID, InstanceID) if Marriage_Monster == nil then Marriage_Monster = {} return end for i = 1, #Marriage_Monster do if Marriage_Monster[i] ~= nil then map.MapDeleteCreature(MapID, InstanceID, Marriage_Monster[i]) end end Marriage_Monster = {} end -- ======================================== -- ПРОВЕРКА УСЛОВИЙ ЗАКЛЮЧЕНИЯ БРАКА -- ======================================== -- Проверяет, можно ли заключить брак между игроками function Marriage_GetMarriageCheckEvent(MapID, InstanceID, ApplicantRoleID, TargetRoleID) -- Проверяем входные параметры if MapID == nil or InstanceID == nil or ApplicantRoleID == nil or TargetRoleID == nil then return 1 -- Общая ошибка end -- Проверяем, не состоит ли заявитель уже в браке if role.IsRoleMarried(ApplicantRoleID) == true then return 4 -- Заявитель уже состоит в браке end -- Проверяем, не состоит ли цель уже в браке if role.IsRoleMarried(TargetRoleID) == true then return 5 -- Цель уже состоит в браке end -- Проверяем свободное место в инвентаре local applicantFreeSlots = role.GetBagFreeSize(ApplicantRoleID) local targetFreeSlots = role.GetBagFreeSize(TargetRoleID) if applicantFreeSlots < 1 or targetFreeSlots < 1 then return 12 -- Недостаточно места в инвентаре у одного из игроков end -- Все проверки пройдены успешно return 0 -- Успешно end -- ======================================== -- УДАЛЕНИЕ КОЛЕЦ ПРИ РАЗВОДЕ -- ======================================== -- Удаляет свадебные кольца при разводе function Marriage_DelRing(MapID, InstanceID, ApplicantRoleID, TargetRoleID) -- Проверяем входные параметры if MapID == nil or InstanceID == nil or ApplicantRoleID == nil or TargetRoleID == nil then return end -- Удаляем свадебные кольца у заявителя local applicantRingCount = role.GetRoleItemNum(ApplicantRoleID, MARRIAGE_CONSTANTS.WEDDING_RING) if applicantRingCount > 0 then role.RemoveFromRole(MapID, InstanceID, ApplicantRoleID, MARRIAGE_CONSTANTS.WEDDING_RING, 1, 101) end -- Удаляем свадебные кольца у цели local targetMapID, targetInstanceID = role.GetRoleMapID(TargetRoleID) if targetMapID ~= nil and targetInstanceID ~= nil then local targetRingCount = role.GetRoleItemNum(TargetRoleID, MARRIAGE_CONSTANTS.WEDDING_RING) if targetRingCount > 0 then role.RemoveFromRole(targetMapID, targetInstanceID, TargetRoleID, MARRIAGE_CONSTANTS.WEDDING_RING, 1, 101) end end end -- ======================================== -- ОБЩАЯ ПРОВЕРКА РАЗВОДА -- ======================================== -- Проверяет общие условия для развода function Marriage_BreakMarriageCommonCheck(ApplicantRoleID, TargetRoleID) -- Проверяем входные параметры if ApplicantRoleID == nil or TargetRoleID == nil then return 1 -- Общая ошибка end -- Проверяем, что разводятся игроки разных полов (только для однополых браков в некоторых системах) if role.GetRoleSex(ApplicantRoleID) == role.GetRoleSex(TargetRoleID) then return 2 -- Однополый развод не разрешен end -- Проверяем, состоит ли заявитель в браке if role.IsRoleMarried(ApplicantRoleID) == false then return 11 -- Заявитель не состоит в браке end -- Все проверки пройдены return 0 -- Успешно end -- ======================================== -- СОБЫТИЕ РАЗВОДА -- ======================================== -- Обрабатывает процесс развода между игроками function Marriage_BreakMarriageEvent(MapID, InstanceID, ApplicantRoleID, TargetRoleID) -- Проверяем входные параметры if MapID == nil or InstanceID == nil or ApplicantRoleID == nil or TargetRoleID == nil then return end -- Удаляем свадебные кольца Marriage_DelRing(MapID, InstanceID, ApplicantRoleID, TargetRoleID) -- Снимаем стоимость развода role.DecRoleSilver(MapID, InstanceID, ApplicantRoleID, MARRIAGE_CONSTANTS.DIVORCE_COST, 101) -- Удаляем навыки брака у заявителя role.RemoveSkill(ApplicantRoleID, MARRIAGE_CONSTANTS.MARRIAGE_SKILL_1) role.RemoveSkill(ApplicantRoleID, MARRIAGE_CONSTANTS.MARRIAGE_SKILL_2) -- Удаляем навыки брака у цели, если она онлайн local TargetMapID, TargetInstanceID = role.GetRoleMapID(TargetRoleID) if TargetMapID ~= nil and TargetInstanceID ~= nil then if role.IsRoleOnLine(TargetMapID, TargetInstanceID, TargetRoleID) then role.RemoveSkill(TargetRoleID, MARRIAGE_CONSTANTS.MARRIAGE_SKILL_1) role.RemoveSkill(TargetRoleID, MARRIAGE_CONSTANTS.MARRIAGE_SKILL_2) end end end -- ======================================== -- ПРОВЕРКА УСЛОВИЙ РАЗВОДА -- ======================================== -- Проверяет, можно ли развестись function Marriage_BreakMarriageCheckEvent(MapID, InstanceID, ApplicantRoleID, TargetRoleID) -- Проверяем входные параметры if MapID == nil or InstanceID == nil or ApplicantRoleID == nil or TargetRoleID == nil then return 1 -- Общая ошибка end -- Выполняем общую проверку развода local CommonCheckResult = Marriage_BreakMarriageCommonCheck(ApplicantRoleID, TargetRoleID) if CommonCheckResult ~= 0 then return CommonCheckResult end -- Все проверки пройдены return 0 -- Успешно end -- ======================================== -- ПРИНУДИТЕЛЬНЫЙ РАЗВОД -- ======================================== -- Обрабатывает принудительный развод (административный) function Marriage_ForceBreakMarriageEvent(MapID, InstanceID, ApplicantRoleID, TargetRoleID) -- Проверяем входные параметры if MapID == nil or InstanceID == nil or ApplicantRoleID == nil or TargetRoleID == nil then return end -- Удаляем свадебные кольца Marriage_DelRing(MapID, InstanceID, ApplicantRoleID, TargetRoleID) -- Снимаем стоимость принудительного развода (выше обычной) local forceDivorceCost = MARRIAGE_CONSTANTS.DIVORCE_COST * 3 -- 3x от обычной стоимости role.DecRoleSilver(MapID, InstanceID, ApplicantRoleID, forceDivorceCost, 101) -- Удаляем навыки брака у заявителя role.RemoveSkill(ApplicantRoleID, MARRIAGE_CONSTANTS.MARRIAGE_SKILL_1) role.RemoveSkill(ApplicantRoleID, MARRIAGE_CONSTANTS.MARRIAGE_SKILL_2) -- Удаляем навыки брака у цели, если она онлайн local TargetMapID, TargetInstanceID = role.GetRoleMapID(TargetRoleID) if TargetMapID ~= nil and TargetInstanceID ~= nil then if role.IsRoleOnLine(TargetMapID, TargetInstanceID, TargetRoleID) then role.RemoveSkill(TargetRoleID, MARRIAGE_CONSTANTS.MARRIAGE_SKILL_1) role.RemoveSkill(TargetRoleID, MARRIAGE_CONSTANTS.MARRIAGE_SKILL_2) end end end -- ======================================== -- ПРОВЕРКА ПРИНУДИТЕЛЬНОГО РАЗВОДА -- ======================================== -- Проверяет условия для принудительного развода function Marriage_ForceBreakMarriageCheckEvent(MapID, InstanceID, ApplicantRoleID, TargetRoleID) -- Проверяем входные параметры if MapID == nil or InstanceID == nil or ApplicantRoleID == nil or TargetRoleID == nil then return 1 -- Общая ошибка end -- Выполняем общую проверку развода local CommonCheckResult = Marriage_BreakMarriageCommonCheck(ApplicantRoleID, TargetRoleID) if CommonCheckResult ~= 0 then return CommonCheckResult end -- Дополнительные проверки для принудительного развода могут быть здесь -- Все проверки пройдены return 0 -- Успешно end -- ======================================== -- ОБРАБОТЧИК ИСЧЕЗНОВЕНИЯ СУЩЕСТВ -- ======================================== -- Удаляет существо из списка церемонии при его исчезновении function Marriage_OnDisappear(MapID, InstanceID, TargetID, TargetTypeID) -- Проверяем входные параметры if TargetID == nil then return end -- Проверяем, есть ли существо в списке церемонии if Marriage_Monster == nil then Marriage_Monster = {} return end -- Ищем и удаляем существо из списка for i = #Marriage_Monster, 1, -1 do if Marriage_Monster[i] == TargetID then table.remove(Marriage_Monster, i) break -- Нашли и удалили, выходим из цикла end end end -- ======================================== -- РЕГИСТРАЦИЯ СОБЫТИЙ -- ======================================== -- Регистрируем обработчики событий для системы брака -- Регистрация обработчиков исчезновения существ церемонии aux.RegisterCreatureEvent(MARRIAGE_CONSTANTS.CREATURE_FLOWER_1, 13, "Marriage_OnDisappear") -- Исчезновение цветов тип 1 aux.RegisterCreatureEvent(MARRIAGE_CONSTANTS.CREATURE_FLOWER_2, 13, "Marriage_OnDisappear") -- Исчезновение цветов тип 2 aux.RegisterCreatureEvent(MARRIAGE_CONSTANTS.CREATURE_FLOWER_3, 13, "Marriage_OnDisappear") -- Исчезновение цветов тип 3 aux.RegisterCreatureEvent(MARRIAGE_CONSTANTS.CREATURE_FIREWORK, 13, "Marriage_OnDisappear") -- Исчезновение фейерверков -- Регистрация обработчиков событий брака aux.RegisterRoleEvent(11, "Marriage_GetMarriageEvent") -- Заключение брака aux.RegisterRoleEvent(12, "Marriage_GetMarriageCheckEvent") -- Проверка условий брака aux.RegisterRoleEvent(13, "Marriage_BreakMarriageEvent") -- Обычный развод aux.RegisterRoleEvent(14, "Marriage_BreakMarriageCheckEvent") -- Проверка условий развода aux.RegisterRoleEvent(42, "Marriage_ForceBreakMarriageEvent") -- Принудительный развод aux.RegisterRoleEvent(43, "Marriage_ForceBreakMarriageCheckEvent") -- Проверка принудительного развода -- ======================================== -- ИНФОРМАЦИЯ О СИСТЕМЕ БРАКА -- ======================================== -- -- Система брака позволяет игрокам заключать брак и управлять отношениями. -- -- ОСНОВНЫЕ ФУНКЦИИ: -- -- 1. ЗАКЛЮЧЕНИЕ БРАКА (Marriage_GetMarriageEvent) -- - Проверяет условия и заключает брак между игроками -- - Добавляет свадебные кольца обоим игрокам -- - Запускает свадебную церемонию с декоративными существами -- - Отправляет мировое сообщение о браке -- -- 2. СВАДЕБНАЯ ЦЕРЕМОНИЯ (Marriage_StartCeremony) -- - Создает фейерверки (16 позиций) -- - Создает цветы (11 позиций: 8 обычных + 3 специальных) -- - Создает воздушные шары (10 позиций) -- - Все существа добавляются в список Marriage_Monster -- -- 3. РАЗВОД (Marriage_BreakMarriageEvent) -- - Удаляет свадебные кольца -- - Снимает стоимость развода -- - Удаляет навыки брака у обоих игроков -- -- 4. ПРИНУДИТЕЛЬНЫЙ РАЗВОД (Marriage_ForceBreakMarriageEvent) -- - Аналогично обычному разводу, но с повышенной стоимостью -- - Стоимость = обычная стоимость развода × 3 -- -- КОНСТАНТЫ СИСТЕМЫ: -- -- - FRIENDSHIP_VALUE: Значение дружбы для брака (720) -- - MARRIAGE_COST: Стоимость заключения брака (660000 серебра) -- - DIVORCE_COST: Стоимость развода (1000000 серебра) -- - WEDDING_COST: Стоимость свадьбы (1000000 серебра) -- -- ПРЕДМЕТЫ: -- -- - ENGAGEMENT_RING (4800110): Обручальное кольцо для предложения -- - WEDDING_RING (4800111): Свадебное кольцо -- -- НАВЫКИ БРАКА: -- -- - MARRIAGE_SKILL_1 (90006): Навык брака 1 -- - MARRIAGE_SKILL_2 (90007): Навык брака 2 -- -- ТИПЫ СУЩЕСТВ ЦЕРЕМОНИИ: -- -- - CREATURE_FIREWORK (5600064): Фейерверк -- - CREATURE_FLOWER_1 (5600060): Цветы тип 1 -- - CREATURE_FLOWER_2 (5600061): Цветы тип 2 -- - CREATURE_FLOWER_3 (5600062): Цветы тип 3 -- - CREATURE_BALLOON (5610049): Воздушный шар -- -- КОДЫ ОШИБОК: -- -- - 0: Успешно -- - 1: Общая ошибка -- - 2: Однополый развод не разрешен -- - 4: Заявитель уже состоит в браке -- - 5: Цель уже состоит в браке -- - 11: Заявитель не состоит в браке -- - 12: Недостаточно места в инвентаре -- -- ЗАМЕЧАНИЯ: -- -- - Все функции проверяют входные параметры на nil -- - Глобальная переменная Marriage_Monster содержит список существ церемонии -- - При исчезновении существ они автоматически удаляются из списка -- - Система совместима с существующим кодом через экспорт констант --