--[[ ======================================== EXCHANGE SYSTEM - СИСТЕМА ОБМЕНА ПРЕДМЕТОВ ======================================== Файл: exchange_system.lua Описание: Система обмена предметов с NPC Автор: Система Версия: 1.0 Функциональность: - Обработка диалогов с NPC обменщиком (ID: 9516003) - Система обмена предметов на награды NPC: 9516003 (Обменщик предметов) ]] --[[ ======================================== КОНСТАНТЫ И НАСТРОЙКИ ======================================== ]] -- ID NPC local NPC_ID = 9516003 -- ID предметов для обмена local EXCHANGE_ITEMS = { {itemID = 4100201, requiredAmount = 100, rewardItemID = 4080097, rewardAmount = 2, failMsgID = 25}, {itemID = 4100202, requiredAmount = 100, rewardItemID = 4080097, rewardAmount = 4, failMsgID = 26}, {itemID = 4100203, requiredAmount = 100, rewardItemID = 4080097, rewardAmount = 8, failMsgID = 27}, {itemID = 4100204, requiredAmount = 100, rewardItemID = 4080097, rewardAmount = 16, failMsgID = 28}, {itemID = 4100205, requiredAmount = 100, rewardItemID = 4080097, rewardAmount = 30, failMsgID = 29}, {itemID = 4100206, requiredAmount = 150, rewardItemID = 4080097, rewardAmount = 50, failMsgID = 30}, {itemID = 4100207, requiredAmount = 150, rewardItemID = 4080097, rewardAmount = 70, failMsgID = 31}, {itemID = 4100208, requiredAmount = 150, rewardItemID = 4080097, rewardAmount = 90, failMsgID = 32}, {itemID = 4100209, requiredAmount = 150, rewardItemID = 4080097, rewardAmount = 110, failMsgID = 33}, {itemID = 4100210, requiredAmount = 150, rewardItemID = 4080097, rewardAmount = 130, failMsgID = 34} } -- ID сообщений local MSG_WELCOME = 920061 local MSG_MENU = 920054 local MSG_CANCEL = 100002 local MSG_OK = 100001 --[[ ======================================== ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ======================================== ]] --[[ Функция: Отправка диалогового сообщения Параметры: - RoleID: ID персонажа - eventData: Массив данных для сообщения Возвращает: - MsgID: ID созданного сообщения ]] local function sendMessage(RoleID, eventData) local MsgID = msg.BeginMsgEvent() for _, data in ipairs(eventData) do msg.AddMsgEvent(MsgID, data[1], data[2]) end msg.DispatchRoleMsgEvent(RoleID, MsgID) return MsgID end --[[ Функция: Проверка и обмен предметов Параметры: - MapID: ID карты - InstanceID: ID инстанса - RoleID: ID персонажа - TargetID: ID NPC - itemID: ID предмета для обмена - requiredAmount: Требуемое количество - rewardItemID: ID награды - rewardAmount: Количество награды - failMsgID: ID сообщения об ошибке Возвращает: - true: Обмен выполнен успешно - false: Обмен не выполнен ]] local function checkAndExchangeItem(MapID, InstanceID, RoleID, TargetID, itemID, requiredAmount, rewardItemID, rewardAmount, failMsgID) -- Обмен выполняется в порядке: проверка → контроль свободных слотов → списание → выдача -- Это позволяет избежать потери предметов или выдачи награды при переполненной сумке local itemCount = role.GetRoleItemNum(RoleID, itemID) if itemCount < requiredAmount then sendMessage(RoleID, {{20, 920062}, {24, TargetID}, {21, failMsgID}, {1, MSG_CANCEL}}) return false end if role.GetBagFreeSize(RoleID) <= 0 then sendMessage(RoleID, {{20, 444266}, {24, TargetID}, {21, -1}, {1, MSG_OK}}) return false end if role.RemoveFromRole(MapID, InstanceID, RoleID, itemID, requiredAmount, 420) ~= 0 then return false end role.AddRoleItem(MapID, InstanceID, RoleID, rewardItemID, rewardAmount, -1, 8, 420) return true end --[[ ======================================== ОСНОВНОЙ ОБРАБОТЧИК ДИАЛОГОВ ======================================== ]] --[[ Обработчик диалогов с NPC обменщиком Параметры: - MapID: ID карты - InstanceID: ID инстанса - TargetID: ID NPC - TargetTypeID: Тип NPC - RoleID: ID персонажа - TalkIndex: Индекс диалога Диалоги: - TalkIndex == -1: Приветственное сообщение - TalkIndex == 4: Меню обмена предметов - TalkIndex == 6-11: Выбор типа обмена - TalkIndex == 13,15,17,19,21,23: Обмен предметов ]] function c9516003_On_Talk(MapID, InstanceID, TargetID, TargetTypeID, RoleID, TalkIndex) -- Приветственное сообщение if TalkIndex == -1 then sendMessage(RoleID, {{20, MSG_WELCOME}, {24, TargetID}, {21, 4}, {1, 920052}, {21, 5}, {1, MSG_CANCEL}}) return end -- Меню обмена предметов if TalkIndex == 4 then sendMessage(RoleID, { {20, MSG_MENU}, {24, TargetID}, {21, 6}, {1, 920055}, {21, 7}, {1, 920056}, {21, 8}, {1, 920057}, {21, 9}, {1, 920058}, {21, 10}, {1, 920059}, {21, 11}, {1, 920060}, {21, 25}, {1, 920063}, {21, 27}, {1, 920064}, {21, 29}, {1, 920065}, {21, 31}, {1, 920066}, {21, 12}, {1, MSG_CANCEL} }) return end -- Подменю для каждого типа обмена if TalkIndex == 6 then sendMessage(RoleID, {{20, MSG_MENU}, {24, TargetID}, {21, 13}, {1, 920053}, {21, 14}, {1, MSG_CANCEL}}) elseif TalkIndex == 7 then sendMessage(RoleID, {{20, MSG_MENU}, {24, TargetID}, {21, 15}, {1, 920053}, {21, 16}, {1, MSG_CANCEL}}) elseif TalkIndex == 8 then sendMessage(RoleID, {{20, MSG_MENU}, {24, TargetID}, {21, 17}, {1, 920053}, {21, 18}, {1, MSG_CANCEL}}) elseif TalkIndex == 9 then sendMessage(RoleID, {{20, MSG_MENU}, {24, TargetID}, {21, 19}, {1, 920053}, {21, 20}, {1, MSG_CANCEL}}) elseif TalkIndex == 10 then sendMessage(RoleID, {{20, MSG_MENU}, {24, TargetID}, {21, 21}, {1, 920053}, {21, 22}, {1, MSG_CANCEL}}) elseif TalkIndex == 11 then sendMessage(RoleID, {{20, MSG_MENU}, {24, TargetID}, {21, 23}, {1, 920053}, {21, 24}, {1, MSG_CANCEL}}) end -- Обмен предметов if TalkIndex == 13 then local exchangeData = EXCHANGE_ITEMS[1] checkAndExchangeItem(MapID, InstanceID, RoleID, TargetID, exchangeData.itemID, exchangeData.requiredAmount, exchangeData.rewardItemID, exchangeData.rewardAmount, exchangeData.failMsgID) elseif TalkIndex == 15 then local exchangeData = EXCHANGE_ITEMS[2] checkAndExchangeItem(MapID, InstanceID, RoleID, TargetID, exchangeData.itemID, exchangeData.requiredAmount, exchangeData.rewardItemID, exchangeData.rewardAmount, exchangeData.failMsgID) elseif TalkIndex == 17 then local exchangeData = EXCHANGE_ITEMS[3] checkAndExchangeItem(MapID, InstanceID, RoleID, TargetID, exchangeData.itemID, exchangeData.requiredAmount, exchangeData.rewardItemID, exchangeData.rewardAmount, exchangeData.failMsgID) elseif TalkIndex == 19 then local exchangeData = EXCHANGE_ITEMS[4] checkAndExchangeItem(MapID, InstanceID, RoleID, TargetID, exchangeData.itemID, exchangeData.requiredAmount, exchangeData.rewardItemID, exchangeData.rewardAmount, exchangeData.failMsgID) elseif TalkIndex == 21 then local exchangeData = EXCHANGE_ITEMS[5] checkAndExchangeItem(MapID, InstanceID, RoleID, TargetID, exchangeData.itemID, exchangeData.requiredAmount, exchangeData.rewardItemID, exchangeData.rewardAmount, exchangeData.failMsgID) elseif TalkIndex == 23 then local exchangeData = EXCHANGE_ITEMS[6] checkAndExchangeItem(MapID, InstanceID, RoleID, TargetID, exchangeData.itemID, exchangeData.requiredAmount, exchangeData.rewardItemID, exchangeData.rewardAmount, exchangeData.failMsgID) elseif TalkIndex == 25 then local exchangeData = EXCHANGE_ITEMS[7] checkAndExchangeItem(MapID, InstanceID, RoleID, TargetID, exchangeData.itemID, exchangeData.requiredAmount, exchangeData.rewardItemID, exchangeData.rewardAmount, exchangeData.failMsgID) elseif TalkIndex == 27 then local exchangeData = EXCHANGE_ITEMS[8] checkAndExchangeItem(MapID, InstanceID, RoleID, TargetID, exchangeData.itemID, exchangeData.requiredAmount, exchangeData.rewardItemID, exchangeData.rewardAmount, exchangeData.failMsgID) elseif TalkIndex == 29 then local exchangeData = EXCHANGE_ITEMS[9] checkAndExchangeItem(MapID, InstanceID, RoleID, TargetID, exchangeData.itemID, exchangeData.requiredAmount, exchangeData.rewardItemID, exchangeData.rewardAmount, exchangeData.failMsgID) elseif TalkIndex == 31 then local exchangeData = EXCHANGE_ITEMS[10] checkAndExchangeItem(MapID, InstanceID, RoleID, TargetID, exchangeData.itemID, exchangeData.requiredAmount, exchangeData.rewardItemID, exchangeData.rewardAmount, exchangeData.failMsgID) end end --[[ ======================================== РЕГИСТРАЦИЯ ОБРАБОТЧИКОВ ======================================== Регистрируем обработчик для: - NPC обменщика (9516003): обработка диалогов ]] -- Регистрация обработчика диалогов для NPC обменщика aux.RegisterCreatureEvent(NPC_ID, 7, "c9516003_On_Talk") --[[ ======================================== ИНФОРМАЦИЯ О СИСТЕМЕ ОБМЕНА ======================================== Система "Exchange System" обеспечивает: 1. Система обмена предметов: - 6 типов обмена с разными наградами - Проверка наличия предметов - Выдача наград при успешном обмене 2. Предметы для обмена: - 4100201-4100206: Предметы для обмена - 4080097: Награда за обмен - Разные количества наград за разные предметы NPC обменщик (9516003) позволяет игрокам обменивать специальные предметы на награды. ]]