• 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!

Lua Chest reward

sanderman14

New Member
Joined
May 2, 2009
Messages
20
Reaction score
0
Location
The Netherlands
Dear otlanders i've got a major issue with my chests :O

When I open the chest (with action id 2000) I get a chest as reward instead of the item inside I'm supose to get :/

I've added some screens for more info

I'm guessing the problem is with my system.lua (actions/scripts/quests/system.lua)

actions/xml
Code:
<action actionid="2000-2001" event="script" value="quests/system.lua"/>

system.lua
Code:
local specialQuests = {
}

local questsExperience = {
}

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.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

        end
    end

    doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, result)
    return true
end

*note: I commented the check for player storage so I could spam the chest without setting my DB value over and over again ;)

The chest that i get as reward also got the action id 2000

20:18 You see a chest (Vol:15).
It weighs 120.00 oz.
ItemID: [1740], ActionID: [2000].
Position: [X: 1057] [Y: 1259] [Z: 13].
 

Attachments

Last edited by a moderator:
I've been looking at the code a bit, I've got an 8.7 server (orignal TFS 0.4) but i'm downgrading it to a 8.6 server (TFS 0.3.6)

The problem seems to be:
Code:
local size = isContainer(item.uid) and getContainerSize(item.uid) or 0
if(size == 0) then
    reward = doCopyItem(item, false)

It works now with
Code:
local specialQuests = {
}

local questsExperience = {
}

function onUse(cid, item, fromPosition, itemEx, toPosition)
    if(getPlayerCustomFlagValue(cid, PLAYERCUSTOMFLAG_GAMEMASTERPRIVILEGES)) then
        doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF, cid)
        doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You are a higher ranked player...You do no need a reward")
        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

        end
    end

    doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, result)
    return true
end

I'm not sure if this effects anything else, and I've only tested it with one item per reward chest.

Maybe someday this will help someone, I'll post an update for more items per chest

EDIT:
Doesn't seems to work for more than one item per chest, I'll be looking at that soon. For now I'm happy enought that this works :p

EDIT 2:
0.3.6 can handle this piece of code, trying to look for a way to find the amount of items in a chest for 0.3.6
Code:
local size = isContainer(item.uid) and getContainerSize(item.uid) or 0

EDIT 3:
For now a little cheat (not the good way to solve this problem!)

Replace the code with:

Code:
local size = isContainer(item.uid) and getContainerSize(item.uid) or 20

And
Code:
if(i == 2) then
With
Code:
if(i >= 2) then
 
Last edited:
maybe

Code:
function onUse(cid, item, fromPosition, itemEx, toPosition)
doPlayerAddItem(cid,itemid,count or type)
+ storage

is enough?
 
Maybe someday this will help someone, I'll post an update for more items per chest

I just logged in to thank you because I was that 'someone' and today was that 'someday'. I had exactly your same problem and now I got it semi-fixed thanks to you.

I didn't find any reward chest with more than one item, I found a few with a single item and I found a few containing a single bag with items on it. Those first got fixed with your tip but reward chests with bags give just an empty bag. Fortunately, more importart quests as DH, Behemoth, Banshee, Coral Comb (?) belong to the first type. Anyway, I'll be glad if you know how to fix the problem with the bags.

Regards
 
Back
Top