• 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!
  • 2026 staff recruitment is open! Check it out and consider applying!

Lua Quest Box Tutorial

bensley

New Member
Joined
Mar 21, 2011
Messages
26
Reaction score
0
TFS 0.2.14
Tibia Client 9.60

Hi guys attempted to follow http://otland.net/threads/how-to-quests.148708/ so when you click on a chest you get a reward.

I have added the following to the actions.xml.
Code:
<action actionid="2001" script="quests/rewardBox.lua"/>

My lua file is pratically a straight rip from the tutorial.
Code:
local specialQuests = {
    [2001] = 30001 --Armors,
}

local questsExperience = {
    [30001] = 100000
}

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


On my map I have added a chest with actionid 2001 and uniqueid of 30001 with a crown armor in.
When I click on the chest I can open it as if it was a regular chest I am trying to get it to automatically go straight into my backpack providing I have cap etc? This is my first attempt at scripting a quest so any pointers on variables and things would help aswell.

Thanks
 
Read the first line of the tutorial. Its not for your version of TFS. Limos made a system for 0.2.x you should use that one.
 
Thanks sorted it.
Reading through the code though.
Code:
if(questsExperience[storage] ~= nil) then
             doPlayerAddExp(cid, questsExperience[storage])
My quest's experience variable:
Code:
local questsExperience = {
   [30001] = 10000
}
Surely this should give me 10k exp aswell?
 
If you use actionid 2001, it would give 10k exp.
Make sure you use the system.lua for TFS 0.2.
http://otland.net/threads/tfs-0-2-1-0-system-lua-questsystem.185583/

Also remove this in actions if you want to use those chests for the system.lua
Code:
<action itemid="1740" script="quests/quests.lua"/>
<action fromid="1747" toid="1749" script="quests/quests.lua"/>
 
Back
Top