NonSequitur

Untitled

Jan 16th, 2016
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.74 KB | None | 0 0
  1. local function pushValues(buffer, sep, ...)
  2.     local argv = {...}
  3.     local argc = #argv
  4.     for k, v in ipairs(argv) do
  5.         table.insert(buffer, v)
  6.         if k < argc and sep then
  7.             table.insert(buffer, sep)
  8.         end
  9.     end
  10.  end
  11.  
  12.  function Item.getNameDescription(self)
  13.     local subType = self:getSubType()
  14.     local itemType = self:getType()
  15.  
  16.     local buffer = {}
  17.  
  18.     local name = self:getName() or ''
  19.     if(#name ~= 0) then
  20.         if(itemType:isStackable() and subType > 1) then
  21.             pushValues(buffer, ' ', subType, self:getPluralName())
  22.         else
  23.             local article = self:getArticle() or ''
  24.             pushValues(buffer, ' ', select(#article ~= 0 and 1 or 2, article, name))
  25.         end
  26.     else
  27.         pushValues(buffer, ' ', 'an item of type', self:getId())
  28.     end
  29.  
  30.     return table.concat(buffer)
  31. end
  32.  
  33. function Container.getContentDescription(self, outputBuffer)
  34.     local firstItem = true
  35.     local buffer = outputBuffer or {}
  36.     for i = 1, self:getSize() do
  37.         local item = self:getItem(i - 1)
  38.  
  39.         if(firstItem) then
  40.             firstItem = false
  41.         else
  42.             table.insert(buffer, ", ")
  43.         end
  44.  
  45.         table.insert(buffer, item:getNameDescription())
  46.     end
  47.  
  48.     if firstItem then
  49.         table.insert(buffer, "nothing")
  50.     end
  51.  
  52.     if not outputBuffer then
  53.         return table.concat(buffer)
  54.     end
  55. end
  56.  
  57. local function bind(func, ...)
  58.     local args = {...}
  59.     return function()
  60.         return func(unpack(args))
  61.     end
  62. end
  63.  
  64. local function filter(list, predicate)
  65.     local ret = {}
  66.     for _, v in ipairs(list) do
  67.         if predicate(v) then
  68.             table.insert(ret, v)
  69.         end
  70.     end
  71.     return ret
  72. end
  73.  
  74. local function map(list, predicate)
  75.     local ret = {}
  76.     for _, v in ipairs(list) do
  77.         table.insert(ret, predicate(v))
  78.     end
  79.     return ret
  80. end
  81.  
  82. local config = {
  83.     [40000] = {
  84.         rewards = {
  85.             -- 1x item(2092) with actionId(61000)
  86.             function(player)
  87.                 local item = Game.createItem(2092, 1)
  88.                 item:setActionId(61000)
  89.                 -- If you want a personalized description
  90.                 -- item:setAttribute(ITEM_ATTRIBUTE_DESCRIPTION, 'This item was awarded to ' .. player:getName() .. ' because he is badass.')
  91.                 return item
  92.             end
  93.         },
  94.  
  95.         storage = 40000
  96.     },
  97.  
  98.     [40001] = {
  99.         rewards = {
  100.             -- 1x item(2092)
  101.             bind(Game.createItem, 2092, 1),
  102.             -- 50k
  103.             bind(Game.createItem, 2160, 5)
  104.         },
  105.  
  106.         storage = 40001
  107.     }
  108. }
  109.  
  110. function onUse(player, item, fromPosition, target, toPosition, isHotkey)
  111.     local chest = config[item:getUniqueId()]
  112.     if not chest or #chest.rewards == 0 then
  113.         return true
  114.     end
  115.  
  116.     if player:getStorageValue(chest.storage) > 0 then
  117.         player:sendTextMessage(MESSAGE_INFO_DESCR, 'You have already completed this quest.')
  118.         return true
  119.     end
  120.  
  121.     local monsters = filter(Game.getSpectators(player:getPosition()), function(creature) return creature:isMonster() end)
  122.     if #monsters > 0 then
  123.         local names = map(monsters, function(monster) return monster:getName() end)
  124.         player:showTextDialog(item:getId(), 'You cannot receive your rewards before killing the following monsters:\n\n' .. table.concat(names, '\n'), false, 999)
  125.         return true
  126.     end
  127.  
  128.     local bag = Game.createItem(ITEM_BAG)
  129.     for _, func in ipairs(chest.rewards) do
  130.         bag:addItemEx(func(player))
  131.     end
  132.  
  133.     local ret = player:addItemEx(bag)
  134.     if ret == RETURNVALUE_NOERROR then
  135.         player:setStorageValue(chest.storage, 1)
  136.         player:sendTextMessage(MESSAGE_INFO_DESCR, 'You have received a bag containing ' .. bag:getContentDescription())
  137.     else
  138.         player:sendTextMessage(MESSAGE_INFO_DESCR, Game.getReturnMessage(ret))
  139.     end
  140.     return true
  141. end
Advertisement
Add Comment
Please, Sign In to add comment