• 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 [TFS 1.2] player:addItem

steelzord

New Member
Joined
May 29, 2013
Messages
55
Reaction score
1
Hello!

I've got a script that gives rewards for advancing to a certain level. It works just fine as long as the reward is just one item. I'd like it to be at least three items. This is the original script that I tried customizing:

Code:
local tabela = {
    [30] = {item_id = 2160, quantidade = 5, mensagem = "You have been awarded with 5 crystal coin for reaching level 30",1},
    [50] = {item_id = 2160, quantidade = 6, mensagem = "You have been awarded with 6 crystal coin for reaching level 50!",2},
    [75] = {item_id = 2160, quantidade = 8, mensagem = "You have been awarded with 8 crystal coin for reaching level 75!",3},
    [100] = {item_id = 2160, quantidade = 20, mensagem = "You have been awarded with 20 crystal coin for reaching level 100!",4}
}
 
local storage = 15000

function onAdvance(cid, skill, oldlevel, newlevel)
    
    local player = Player(cid)
    
    if skill == 8 then
        for level, _ in pairs(tabela) do
            if player:getLevel() >= level and player:getStorageValue(storage) < level then
                player:addItem(tabela[level].item_id, tabela[level].quantidade)
                player:sendTextMessage(MESSAGE_EVENT_ADVANCE, tabela[level].mensagem)
                player:setStorageValue(storage, level)
            end
        end
    end
  
    player:save()   
    return true
end

My customization that doesn't work:

Code:
local tabela = {
    [20] = {item_id = 2160, quantidade = 3, mensagem = "You have been awarded with 3 crystal coin for reaching level 20.",1},
    [35] = {{item_id = 7392, quantidade = 1, item_id = 7406, quantidade = 1, item_id = 7380, quantidade = 1}, mensagem = "You have been awarded with some supplies for level 35.",2},
    [50] = {{item_id = 7383, quantidade = 1, item_id = 2391, quantidade = 1, item_id = 15454, quantidade = 1}, mensagem = "You have been awarded with some supplies for level 50.",3},
    [75] = {{item_id = 7429, quantidade = 1, item_id = 7390, quantidade = 1, item_id = 7434, quantidade = 1, item_id = 2160, quantidade = 5}, mensagem = "You have been awarded with some supplies for level 75.",4}
}
 
local storage = 15000

function onAdvance(cid, skill, oldlevel, newlevel)
    
    local player = Player(cid)
    
    if skill == 8 then
        for level, _ in pairs(tabela) do
            if player:getLevel() >= level and player:getStorageValue(storage) < level then
                player:addItem(tabela[level].item_id, tabela[level].quantidade)
                player:sendTextMessage(MESSAGE_EVENT_ADVANCE, tabela[level].mensagem)
                player:setStorageValue(storage, level)
            end
        end
    end
  
    player:save()   
    return true
end

What have I done wrong?
 
change player:getLevel() to newLevel and player:getStorageValue(storage) == v.storage to player:getStorageValue(storage) < v.storage
 
havent tested, but in theory I would use something like this
Code:
local levelAdvanceConf = {
    [20] = {{itemID = 2160, count = 3}},
    [35] = {{itemID = 7392}, {itemID = 7406}, {itemID = 7380}},
    [50] = {{itemID = 7383}, {itemID = 2391}, {itemID = 15454}},
    [75] = {{itemID = 7429}, {itemID = 7390}, {itemID = 7434}, {itemID = 2160, count = 5}},
}

local keepTrackLevelSV = 15000

function onAdvance(cid, skill, oldlevel, newlevel)
local player = Player(cid)
   
    if not player then return end
local rewardT = levelAdvance_getRewardT(player, skill, newlevel)

    if not rewardT then return end
local rewardMsg = "You have been awarded with:"

    for i, itemT in ipairs(rewardT) do
        local itemCount = itemT.count or 1
        local item = player:addItem(itemT.itemID, itemCount)
       
        if not item then return end
       
        if i > 1 then
            rewardMsg = rewardMsg.." and "..itemCount.." "..item:getName()
        else
            rewardMsg = rewardMsg.." "..itemCount.." "..item:getName()
        end
    end
    rewardMsg = rewardMsg.." for reaching level "..newlevel.."."
    player:sendTextMessage(MESSAGE_EVENT_ADVANCE, rewardMsg)
    player:setStorageValue(keepTrackLevelSV, newlevel)
    player:save()
end

function levelAdvance_getRewardT(player, skill, newlevel)
    if skill ~= 8 then return end
   
    for requiredLevel, rewardT in pairs(levelAdvanceConf) do
        if newlevel >= requiredLevel and player:getStorageValue(keepTrackLevelSV) < requiredLevel then return rewardT end
    end
end
 
havent tested, but in theory I would use something like this
Code:
local levelAdvanceConf = {
    [20] = {{itemID = 2160, count = 3}},
    [35] = {{itemID = 7392}, {itemID = 7406}, {itemID = 7380}},
    [50] = {{itemID = 7383}, {itemID = 2391}, {itemID = 15454}},
    [75] = {{itemID = 7429}, {itemID = 7390}, {itemID = 7434}, {itemID = 2160, count = 5}},
}

local keepTrackLevelSV = 15000

function onAdvance(cid, skill, oldlevel, newlevel)
local player = Player(cid)
  
    if not player then return end
local rewardT = levelAdvance_getRewardT(player, skill, newlevel)

    if not rewardT then return end
local rewardMsg = "You have been awarded with:"

    for i, itemT in ipairs(rewardT) do
        local itemCount = itemT.count or 1
        local item = player:addItem(itemT.itemID, itemCount)
      
        if not item then return end
      
        if i > 1 then
            rewardMsg = rewardMsg.." and "..itemCount.." "..item:getName()
        else
            rewardMsg = rewardMsg.." "..itemCount.." "..item:getName()
        end
    end
    rewardMsg = rewardMsg.." for reaching level "..newlevel.."."
    player:sendTextMessage(MESSAGE_EVENT_ADVANCE, rewardMsg)
    player:setStorageValue(keepTrackLevelSV, newlevel)
    player:save()
end

function levelAdvance_getRewardT(player, skill, newlevel)
    if skill ~= 8 then return end
  
    for requiredLevel, rewardT in pairs(levelAdvanceConf) do
        if newlevel >= requiredLevel and player:getStorageValue(keepTrackLevelSV) < requiredLevel then return rewardT end
    end
end
That's awesome, thanks!
 
Back
Top