• 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 Problem with quest scripts

multrayzor

New Member
Joined
Mar 17, 2014
Messages
58
Reaction score
2
So, i was using chests unique id the same as quest rewards item id. But i realized this was too outdated and decided to change to the system.lua script that seems to be the best. I followed everything found on this post here: http://otland.net/threads/tfs-0-2-1-0-system-lua-questsystem.185583/

But im still getting an error:

[Error - Action Interface]
data/actions/scripts/quests/system.lua:eek:nUse
Description:
data/actions/scripts/quests/system.lua:80: attempt to index local 'ret' (a boolean value)
stack traceback:
data/actions/scripts/quests/system.lua:80: in function <data/actions/scripts/quests/system.lua:9>

The post mentioned changing something in global.lua, but i didnt find it in my data folder. I currently have chests with actionid = 2000, random uniqueid and items insed, when i open them i can get the items inside, like it was a normal container, and i get this error.

I have this on actions.xml:

<action actionid="2000" event="script" value="quests/system.lua"/>

And this is my system.lua:

Code:
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

Any help is appreciated :)

Btw, im using TFS 0.3.6 (Tibia 8.6).
 
Last edited by a moderator:
The script from that link is for TFS 0.2, the system.lua was made for TFS 0.3 and is added by default to TFS 0.3/0.4 datapacks. The script from that link is an edited version of the TFS 0.3/0.4 system.lua to make it work for TFS 0.2.
So just use the one that was already added to your server (datapack).
 
This is the system.lua that came with the server:


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

local questsExperience = {
    [30015] = 10000
}

function onUse(cid, item, fromPosition, itemEx, toPosition)
    if(getPlayerCustomFlagValue(cid, PLAYERCUSTOMFLAG_GAMEMASTERPRIVILEGES)) then
        doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF, cid)
        return true
    end

    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.uid)
        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 == 2) then
                    ret = " and "
                elseif(i == 1) then
                    ret = ""
                end

                result = result .. ret
                ret = getItemDescriptions(tmp.uid)
                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(doPlayerAddItemEx(cid, reward.uid, false) ~= RETURNVALUE_NOERROR) then
        result = "You have found a reward weighing " .. getItemWeight(reward.uid) .. " oz. It is too heavy or you have not enough space."
    else
        result = "You have found " .. result .. "."
        setPlayerStorageValue(cid, storage, 1)
        if(questsExperience[storage] ~= nil) then
            doPlayerAddExp(cid, questsExperience[storage])
            doSendAnimatedText(getCreaturePosition(cid), questsExperience[storage], TEXTCOLOR_WHITE)
        end
    end

    doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, result)
    return true
end

It also doesnt work, when i use the chest my character just poofs and nothing happens :/
 
That's because you test it with a god/gm character, this is to avoid abuse of gms on your server.
If you don't want that, remove this.
Code:
if(getPlayerCustomFlagValue(cid, PLAYERCUSTOMFLAG_GAMEMASTERPRIVILEGES)) then
     doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF, cid)
     return true
end
 

Similar threads

Back
Top