• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

Solved [TFS 1.0] Create a chest for quest

Use this.
actions.xml
Code:
<action actionid="2000" script="quests/system.lua"/>

system.lua
Code:
-- system.lua edited by Limos for TFS 0.2/1.0

local specialQuests = {
   [2001] = 30015 --Annihilator
}

local questsExperience = {
   [30015] = 10000
}

function onUse(cid, item, fromPosition, itemEx, toPosition)

   local storage = specialQuests[item.actionid]
   if(not storage) then
     storage = item.uid
     if(storage > 65535) then
       return false
     end
   end

   if(getPlayerStorageValue(cid, storage) > 0) then
     doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "It is empty.")
     return true
   end

   local items = {}
   local reward = 0

   local size = isContainer(item.uid) and getContainerSize(item.uid) or 0
   if(size == 0) then
     reward = doCopyItem(item, false)
   else
     for i = 0, size do
       local tmp = getContainerItem(item.uid, i)
       if(tmp.itemid > 0) then
         table.insert(items, tmp)
       end
     end
   end

   size = table.maxn(items)
   if(size == 1) then
     reward = doCopyItem(items[1], true)
   end

   local result = ""
   if(reward ~= 0) then
     local ret = getItemDescriptions(reward.itemid)
     if(reward.type > 0 and isItemRune(reward.itemid)) then
       result = reward.type .. " charges " .. ret.name
     elseif(reward.type > 0 and isItemStackable(reward.itemid)) then
       result = reward.type .. " " .. ret.plural
     else
       result = ret.article .. " " .. ret.name
     end
   else
     if(size > 20) then
       reward = doCopyItem(item, false)
     elseif(size > 8) then
       reward = getThing(doCreateItemEx(1988, 1))
     else
       reward = getThing(doCreateItemEx(1987, 1))
     end
     for i = 1, size do
       local tmp = doCopyItem(items[i], true)
       if(doAddContainerItemEx(reward.uid, tmp.uid) ~= RETURNVALUE_NOERROR) then
         print("[Warning] QuestSystem:", "Could not add quest reward")
       else
         local ret = ", "
         if(i == 1) then
           ret = ""
         elseif(i == size) then
           ret = " and "
         end
         result = result .. ret
         ret = getItemDescriptions(tmp.itemid)
         if(tmp.type > 0 and isItemRune(tmp.itemid)) then
           result = result .. tmp.type .. " charges " .. ret.name
         elseif(tmp.type > 0 and isItemStackable(tmp.itemid)) then
           result = result .. tmp.type .. " " .. ret.plural
         else
           result = result .. ret.article .. " " .. ret.name
         end
       end
     end
   end

   if getPlayerFreeCap(cid) < getItemWeightByUID(reward.uid) then
     result = "You have found a reward weighing "..getItemWeightByUID(reward.uid).." oz. It is to heavy."
   elseif(doPlayerAddItemEx(cid, reward.uid, false) ~= RETURNVALUE_NOERROR) then
     result = "You have found a reward, but you don't have enough space."
   else
     result = "You have found " .. result .. "."
     setPlayerStorageValue(cid, storage, 1)
     if(questsExperience[storage] ~= nil) then
       doPlayerAddExp(cid, questsExperience[storage])
     end
   end
   doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, result)
   return true
end
 
Code:
local specialQuests = {
  [2001] = 30015 --Annihilator
}
in this script action id is 2000 :D
That part is for pick only one item, this is explained in the second part of the tutorial.

@Limos, the unique ID must be equal to the quest? For example: 30015 --Annihilator, the chest unique ID will 30015?
No, you won't use that part for normal quests. With normal quests you only have to use actionid 2000, random uniqueid and items in the chest.

If you are missing function doCopyItem, add this in global.lua.
Code:
function doCopyItem(item, attributes)
   local attributes = attributes or false

   local ret = doCreateItemEx(item.itemid, item.type)
   if(attributes) then
     if(item.actionid > 0) then
       doSetItemActionId(ret, item.actionid)
     end
   end

   if(isContainer(item.uid) == TRUE) then
     for i = (getContainerSize(item.uid) - 1), 0, -1 do
       local tmp = getContainerItem(item.uid, i)
       if(tmp.itemid > 0) then
         doAddContainerItemEx(ret, doCopyItem(tmp, true).uid)
       end
     end
   end

   return getThing(ret)
end
 
Back
Top