-- ============================================================================= -- СКРИПТ СИСТЕМЫ РЫБАЛКИ ДЛЯ ИГРОВОГО СЕРВЕРА -- Версия: 2.0 -- Дата создания: $(date) -- Описание: Полная система рыбалки включающая навыки, предметы и подарки -- ============================================================================= -- ============================================================================= -- Функция проверки возможности использования навыка рыбалки (Skill ID: 9100601) -- Проверяет наличие необходимых предметов, места в инвентаре и расположение игрока -- ============================================================================= function s9100601_canuse(MapID, InstanceID, SkillID, RoleID) -- По гайду: на 1 попытку тратится 1 "Обычная наживка" (ItemID: 6600384) if role.GetRoleItemNum(RoleID, 6600384) < 1 then local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 26, 999999) -- Сообщение об отсутствии наживки (если есть отдельный MsgID - заменить тут) msg.AddMsgEvent(MsgID, 9, 1) msg.DispatchRoleMsgEvent(RoleID, MsgID) return 19, false -- Код ошибки: нет предмета end -- Проверка наличия свободного места в инвентаре (минимум 2 слота) if role.GetBagFreeSize(RoleID) < 2 then local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 26, 100003) -- Сообщение о полном инвентаре msg.AddMsgEvent(MsgID, 9, 1) msg.DispatchRoleMsgEvent(RoleID, MsgID) return 40, false -- Код ошибки: нет места в инвентаре end -- Проверка нахождения игрока в разрешенных областях карты if MapID == 3373743400 or MapID == 3373741096 then local bCanUse1 = map.IsInArea(MapID, InstanceID, RoleID, 617) -- Область 617 local bCanUse2 = map.IsInArea(MapID, InstanceID, RoleID, 1071) -- Область 1071 if bCanUse1 == true or bCanUse2 == true then return 0, false -- Успешно: можно использовать навык else return 23, false -- Код ошибки: не в разрешенной области end else return 23, false -- Код ошибки: неправильная карта end end -- Регистрация события для навыка aux.RegisterSkillEvent(9100601, 0, "s9100601_canuse") -- ============================================================================= -- Функция применения навыка рыбалки (Skill ID: 9100601) -- По гайду: -- - 1 попытка тратит 1 наживку (6600384) -- - 1 попытка даёт +1 exp "Мастерство рыбака" (базовый SkillID: 91005) -- - рыба открывается по уровню навыка 1..4 -- ============================================================================= function s9100601_Cast(MapID, InstanceID, SkillID, TargetID) -- Базовый навык "Мастерство рыбака" имеет базовый SkillID 91005 (уровень возвращает IsLearnedSkill) local masteryLv = role.IsLearnedSkill(TargetID, 91005) if masteryLv == nil or masteryLv <= 0 then return -- Прерываем выполнение, если навык не изучен end -- Таблица рыбы по уровню навыка (гайд) -- 1: 4100301 -- 2: +4100303 -- 3: +4100304 -- 4: +4100302 local fishByLevel = { [1] = {4100301}, [2] = {4100301, 4100303}, [3] = {4100301, 4100303, 4100304}, [4] = {4100301, 4100303, 4100304, 4100302}, } if masteryLv > 4 then masteryLv = 4 end local fishList = fishByLevel[masteryLv] or fishByLevel[1] -- Выбор случайной рыбы из доступного списка local fishIndex = math.random(1, #fishList) local selectedFishId = fishList[fishIndex] -- Проверка активности рыболовного ивента (Activity ID: 1184) if act.GetActIsStart(1184) then -- 10% шанс получить специальный предмет (ID: 6600790) if math.random(100) <= 10 then role.AddRoleItem(MapID, InstanceID, TargetID, 6600790, 1, -1, 8, 420) end end -- Удаление 1 наживки (Item ID: 6600384) за попытку role.RemoveFromRole(MapID, InstanceID, TargetID, 6600384, 1, 420) -- Добавление пойманной рыбы в инвентарь игрока role.AddRoleItem(MapID, InstanceID, TargetID, selectedFishId, 1, -1, 8, 420) -- Добавление опыта к навыку рыбалки: -- По гайду: 1 попытка = +1 exp, с премиумом = +2 exp. -- В этом сервере множители опыта часто реализованы баффами (см. buff_proto.xml: 9008201), -- но они могут не применяться автоматически к ChangeSkillExp, поэтому учитываем вручную. local expGain = 1 -- Премиум-статус (VIP): -- В этой сборке `IsRoleHaveBuff` обычно принимает "базовый" ID баффа (пример: 9008201 проверяют как 90082). -- Для VIP баффов 9003401/9003402/9003403 базовый ID = 90034. -- Премиум [7 дн] (item 4300008) должен давать "Рыбалка: Опыт +100%". if role.IsRoleHaveBuff and (role.IsRoleHaveBuff(MapID, InstanceID, TargetID, 90034) or role.IsRoleHaveBuff(MapID, InstanceID, TargetID, 9003403)) then expGain = 2 end role.ChangeSkillExp(TargetID, 91005, expGain) end -- Регистрация события для применения навыка aux.RegisterSkillEvent(9100601, 1, "s9100601_Cast") -- ============================================================================= -- Глобальная таблица времени действия подарков рыбалки -- ItemID -> время в минутах -- ============================================================================= local FISHING_GIFT_TIMES = { [4800300] = 30, -- Подарок 1: 30 минут [4800301] = 120, -- Подарок 2: 2 часа [4800302] = 360, -- Подарок 3: 6 часов [4800303] = 720 -- Подарок 4: 12 часов } -- ============================================================================= -- Функция проверки возможности использования подарка рыбалки -- Проверяет, не превысит ли общее время лимит в 48 часов (2880 минут) -- ============================================================================= function I4800300_CanUseGiftBag(MapID, InstanceID, TypeID, TargetID) -- Проверка существования типа подарка if not FISHING_GIFT_TIMES[TypeID] then return 43, false -- Код ошибки: неизвестный тип предмета end -- Получение текущего накопленного времени рыбалки local currentTime = role.GetRoleScriptData(TargetID, 1, RoleDataType["rubalka_time"]) if currentTime < 0 then currentTime = 0 end -- Защита от отрицательных значений -- Проверка превышения лимита времени (48 часов = 2880 минут) if currentTime + FISHING_GIFT_TIMES[TypeID] > 2880 then local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 26, 605017) -- Сообщение о превышении лимита msg.DispatchRoleMsgEvent(TargetID, MsgID) return 32, false -- Код ошибки: превышен лимит времени end return 0 -- Успешно: можно использовать подарок end -- ============================================================================= -- Функция использования подарка рыбалки -- Добавляет время рыбалки игроку и отправляет уведомление -- ============================================================================= function I4800300_GiftBag(MapID, InstanceID, TypeID, RoleID) -- Проверка существования типа подарка if not FISHING_GIFT_TIMES[TypeID] then return -- Прерываем выполнение при неизвестном типе end -- Получение текущего накопленного времени рыбалки local currentTime = role.GetRoleScriptData(RoleID, 1, RoleDataType["rubalka_time"]) if currentTime < 0 then currentTime = 0 end -- Защита от отрицательных значений -- Добавление времени подарка local giftTime = FISHING_GIFT_TIMES[TypeID] local newTime = currentTime + giftTime -- Ограничение максимального времени (48 часов = 2880 минут) if newTime > 2880 then newTime = 2880 end -- Сохранение обновленного времени role.SetRoleScriptData(RoleID, 1, RoleDataType["rubalka_time"], newTime) -- Расчет времени в часах и минутах для отображения local displayHours = math.floor(newTime / 60) local displayMinutes = newTime % 60 -- Отправка уведомления игроку local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 13, 0) msg.AddMsgEvent(MsgID, 1, 930437) -- ID сообщения о времени рыбалки msg.AddMsgEvent(MsgID, 9, displayHours) -- Часы msg.AddMsgEvent(MsgID, 9, displayMinutes) -- Минуты -- Специальное сообщение для определенной карты if MapID == 3373743400 then msg.AddMsgEvent(MsgID, 16, 28) msg.AddMsgEvent(MsgID, 16, newTime * 60) -- Время в секундах end msg.DispatchRoleMsgEvent(RoleID, MsgID) end -- ============================================================================= -- Регистрация событий для всех типов подарков рыбалки -- ============================================================================= -- Подарок 1 (30 минут) aux.RegisterItemEvent(4800300, 0, "I4800300_CanUseGiftBag") -- Проверка использования aux.RegisterItemEvent(4800300, 1, "I4800300_GiftBag") -- Использование -- Подарок 2 (2 часа) aux.RegisterItemEvent(4800301, 0, "I4800300_CanUseGiftBag") -- Проверка использования aux.RegisterItemEvent(4800301, 1, "I4800300_GiftBag") -- Использование -- Подарок 3 (6 часов) aux.RegisterItemEvent(4800302, 0, "I4800300_CanUseGiftBag") -- Проверка использования aux.RegisterItemEvent(4800302, 1, "I4800300_GiftBag") -- Использование -- Подарок 4 (12 часов) aux.RegisterItemEvent(4800303, 0, "I4800300_CanUseGiftBag") -- Проверка использования aux.RegisterItemEvent(4800303, 1, "I4800300_GiftBag") -- Использование -- ============================================================================= -- Функция использования обучающего предмета рыбалки (Item ID: 6600385) -- Выдает игроку навыки рыбалки при использовании -- ============================================================================= function I6600385_Use(MapID, InstanceID, TypeID, RoleID) -- Доп. защита: в `item_proto.xml` у 6600385 уже стоит Level="40" if role.GetRoleLevel(MapID, InstanceID, RoleID) < 40 then local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 20, 605010) -- "Ваш уровень слишком низок" msg.AddMsgEvent(MsgID, 21, -1) msg.AddMsgEvent(MsgID, 1, 100001) msg.DispatchRoleMsgEvent(RoleID, MsgID) return end -- Если уже изучено "Мастерство рыбака" (база 91005) - ничего не делаем local masteryLv = role.IsLearnedSkill(RoleID, 91005) if masteryLv ~= nil and masteryLv > 0 then return end -- Добавление базового навыка рыбалки (Skill ID: 9100501) local skillAdded1 = role.AddSkill(RoleID, 9100501) -- Добавление продвинутого навыка рыбалки (Skill ID: 9100601) local skillAdded2 = role.AddSkill(RoleID, 9100601) -- Отправка уведомления об успешном обучении if skillAdded1 and skillAdded2 then local MsgID = msg.BeginMsgEvent() msg.AddMsgEvent(MsgID, 13, 0) msg.AddMsgEvent(MsgID, 1, 930438) -- ID сообщения об обучении навыкам msg.DispatchRoleMsgEvent(RoleID, MsgID) end end -- Можно ли использовать свиток обучения (чтобы не тратить/не пытаться использовать повторно) function I6600385_CanUse(MapID, InstanceID, TypeID, TargetID) local bRet, bIgnore = 0, false if role.GetRoleLevel(MapID, InstanceID, TargetID) < 40 then bRet = 23 else local masteryLv = role.IsLearnedSkill(TargetID, 91005) if masteryLv ~= nil and masteryLv > 0 then bRet = 32 -- уже изучено end end return bRet, bIgnore end -- Регистрация события использования обучающего предмета aux.RegisterItemEvent(6600385, 1, "I6600385_Use") aux.RegisterItemEvent(6600385, 0, "I6600385_CanUse") -- ============================================================================= -- КОНЕЦ СКРИПТА РЫБАЛКИ -- =============================================================================