From ef54e652840d0424541751f441decf1b1847a187 Mon Sep 17 00:00:00 2001 From: Matt Gomez Date: Thu, 30 May 2024 19:49:11 -0600 Subject: [PATCH] missing quest --- .../actions/other/others/quest_system.lua | 182 ++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 data-otxserver/scripts/actions/other/others/quest_system.lua diff --git a/data-otxserver/scripts/actions/other/others/quest_system.lua b/data-otxserver/scripts/actions/other/others/quest_system.lua new file mode 100644 index 000000000..c7fdf8243 --- /dev/null +++ b/data-otxserver/scripts/actions/other/others/quest_system.lua @@ -0,0 +1,182 @@ +local specialQuests = { + -- +} + +local questsExperience = { + [3101] = 1, -- dummy values +} + +local questLog = { + -- +} + +local tutorialIds = { + [50080] = 5, + [50082] = 6, + [50084] = 10, + [50086] = 11, +} + +local function copyContainerItem(originalContainer, newContainer) + for i = 0, originalContainer:getSize() - 1 do + local originalItem = originalContainer:getItem(i) + local newItem = Game.createItem(originalItem.itemid, originalItem.type) + if not newItem then + logger.error("[questSystem.copyContainerItem] failed to create item: {}", originalItem.itemid) + return false + end + newItem:setActionId(originalItem:getActionId()) + newItem:setAttribute(ITEM_ATTRIBUTE_DESCRIPTION, originalItem:getAttribute(ITEM_ATTRIBUTE_DESCRIPTION)) + + if originalItem:isContainer() then + copyContainerItem(Container(originalItem.uid), Container(newItem.uid)) + end + newContainer:addItemEx(newItem) + end +end + +local hotaQuest = { 50950, 50951, 50952, 50953, 50954, 50955 } + +local questSystem = Action() + +function questSystem.onUse(player, item, fromPosition, target, toPosition, isHotkey) + local storage = specialQuests[item.actionid] + if not storage then + storage = item.uid + if storage > 65535 then + return false + end + end + + if storage == 23644 or storage == 24632 or storage == 14338 then + player:setStorageValue(Storage.SvargrondArena.PitDoor, -1) + end + + if player:getStorageValue(storage) > 0 and player:getGroup():getId() < GROUP_TYPE_GAMEMASTER then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "The " .. ItemType(item.itemid):getName() .. " is empty.") + return true + end + + local items, reward = {} + local size = item:isContainer() and item:getSize() or 0 + if size == 0 then + reward = Game.createItem(item.itemid, item.type) + if not reward then + logger.error("[questSystem.onUse] failed to create reward item") + return false + end + + local itemActionId = item:getActionId() + if itemActionId then + reward:setActionId(itemActionId) + end + local itemDescription = item:getAttribute(ITEM_ATTRIBUTE_DESCRIPTION) + if itemDescription then + reward:setAttribute(ITEM_ATTRIBUTE_DESCRIPTION, itemDescription) + end + else + local container = Container(item.uid) + if not container then + logger.error("[questSystem.onUse] failed to create container") + return false + end + for i = 0, container:getSize() - 1 do + local originalItem = container:getItem(i) + local newItem = Game.createItem(originalItem.itemid, originalItem.type) + if not newItem then + logger.error("[questSystem.onUse] failed to create new item") + return false + end + local newActionId = originalItem:getActionId() + if newActionId then + newItem:setActionId(newActionId) + end + local newDescription = item:getAttribute(ITEM_ATTRIBUTE_DESCRIPTION) + if newDescription then + newItem:setAttribute(ITEM_ATTRIBUTE_DESCRIPTION, newDescription) + end + + if originalItem:isContainer() then + copyContainerItem(Container(originalItem.uid), Container(newItem.uid)) + end + items[#items + 1] = newItem + end + + if size == 1 then + reward = items[1] + end + end + + local result = "" + if reward then + local ret = ItemType(reward.itemid) + if ret:isRune() then + result = ret:getArticle() .. " " .. ret:getName() .. " (" .. reward.type .. " charges)" + elseif ret:isStackable() and reward:getCount() > 1 then + result = reward:getCount() .. " " .. ret:getPluralName() + elseif ret:getArticle() ~= "" then + result = ret:getArticle() .. " " .. ret:getName() + else + result = ret:getName() + end + else + if size > 20 then + reward = Game.createItem(item.itemid, 1) + elseif size > 8 then + reward = Game.createItem(2854, 1) + else + reward = Game.createItem(2853, 1) + end + + for i = 1, size do + local tmp = items[i] + if reward:addItemEx(tmp) ~= RETURNVALUE_NOERROR then + logger.warn("[questSystem.onUse] - Could not add quest reward to container") + end + end + local ret = ItemType(reward.itemid) + result = ret:getArticle() .. " " .. ret:getName() + end + + if player:addItemEx(reward) ~= RETURNVALUE_NOERROR then + local weight = reward:getWeight() + if player:getFreeCapacity() < weight then + player:sendCancelMessage(string.format("You have found %s weighing %.2f oz. You have no capacity.", result, (weight / 100))) + else + player:sendCancelMessage("You have found " .. result .. ", but you have no room to take it.") + end + return true + end + + if questsExperience[storage] then + player:addExperience(questsExperience[storage], true) + end + + if questLog[storage] then + player:setStorageValue(questLog[storage], 1) + end + + if tutorialIds[storage] then + player:sendTutorial(tutorialIds[storage]) + if item.uid == 50080 then + player:setStorageValue(Storage.RookgaardTutorialIsland.SantiagoNpcGreetStorage, 3) + end + end + + if table.contains(hotaQuest, item.uid) then + if player:getStorageValue(Storage.TheAncientTombs.DefaultStart) ~= 1 then + player:setStorageValue(Storage.TheAncientTombs.DefaultStart, 1) + end + end + + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You have found " .. result .. ".") + player:setStorageValue(storage, 1) + return true +end + +for index, value in pairs(specialQuests) do + questSystem:aid(index) +end + +questSystem:aid(2000) +questSystem:register()