Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local function pushValues(buffer, sep, ...)
- local argv = {...}
- local argc = #argv
- for k, v in ipairs(argv) do
- table.insert(buffer, v)
- if k < argc and sep then
- table.insert(buffer, sep)
- end
- end
- end
- function Item.getNameDescription(self)
- local subType = self:getSubType()
- local itemType = self:getType()
- local buffer = {}
- local name = self:getName() or ''
- if(#name ~= 0) then
- if(itemType:isStackable() and subType > 1) then
- pushValues(buffer, ' ', subType, self:getPluralName())
- else
- local article = self:getArticle() or ''
- pushValues(buffer, ' ', select(#article ~= 0 and 1 or 2, article, name))
- end
- else
- pushValues(buffer, ' ', 'an item of type', self:getId())
- end
- return table.concat(buffer)
- end
- function Container.getContentDescription(self, outputBuffer)
- local firstItem = true
- local buffer = outputBuffer or {}
- for i = 1, self:getSize() do
- local item = self:getItem(i - 1)
- if(firstItem) then
- firstItem = false
- else
- table.insert(buffer, ", ")
- end
- table.insert(buffer, item:getNameDescription())
- end
- if firstItem then
- table.insert(buffer, "nothing")
- end
- if not outputBuffer then
- return table.concat(buffer)
- end
- end
- local function bind(func, ...)
- local args = {...}
- return function()
- return func(unpack(args))
- end
- end
- local function filter(list, predicate)
- local ret = {}
- for _, v in ipairs(list) do
- if predicate(v) then
- table.insert(ret, v)
- end
- end
- return ret
- end
- local function map(list, predicate)
- local ret = {}
- for _, v in ipairs(list) do
- table.insert(ret, predicate(v))
- end
- return ret
- end
- local config = {
- [40000] = {
- rewards = {
- -- 1x item(2092) with actionId(61000)
- function(player)
- local item = Game.createItem(2092, 1)
- item:setActionId(61000)
- -- If you want a personalized description
- -- item:setAttribute(ITEM_ATTRIBUTE_DESCRIPTION, 'This item was awarded to ' .. player:getName() .. ' because he is badass.')
- return item
- end
- },
- storage = 40000
- },
- [40001] = {
- rewards = {
- -- 1x item(2092)
- bind(Game.createItem, 2092, 1),
- -- 50k
- bind(Game.createItem, 2160, 5)
- },
- storage = 40001
- }
- }
- function onUse(player, item, fromPosition, target, toPosition, isHotkey)
- local chest = config[item:getUniqueId()]
- if not chest or #chest.rewards == 0 then
- return true
- end
- if player:getStorageValue(chest.storage) > 0 then
- player:sendTextMessage(MESSAGE_INFO_DESCR, 'You have already completed this quest.')
- return true
- end
- local monsters = filter(Game.getSpectators(player:getPosition()), function(creature) return creature:isMonster() end)
- if #monsters > 0 then
- local names = map(monsters, function(monster) return monster:getName() end)
- player:showTextDialog(item:getId(), 'You cannot receive your rewards before killing the following monsters:\n\n' .. table.concat(names, '\n'), false, 999)
- return true
- end
- local bag = Game.createItem(ITEM_BAG)
- for _, func in ipairs(chest.rewards) do
- bag:addItemEx(func(player))
- end
- local ret = player:addItemEx(bag)
- if ret == RETURNVALUE_NOERROR then
- player:setStorageValue(chest.storage, 1)
- player:sendTextMessage(MESSAGE_INFO_DESCR, 'You have received a bag containing ' .. bag:getContentDescription())
- else
- player:sendTextMessage(MESSAGE_INFO_DESCR, Game.getReturnMessage(ret))
- end
- return true
- end
Advertisement
Add Comment
Please, Sign In to add comment