• 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 Reward for get a level

Szka

Member
Joined
Jul 27, 2016
Messages
65
Reaction score
11
Location
Chile
Hello guys!
I'm trying to get running this script, but I keep having an error which I don't know how to fix it because I can't find where is the bug.
First of all here is the error I'm getting:
uvNP7U.png


And here is the script:
Code:
local prizes = {
    [60001] = {level = 20, reward = {2152, 50}},
    [60002] = {level = 35, reward = {2160, 1}},
    [60003] = {level = 50, reward = {2160, 2}},
    [60004] = {level = 80, reward = {2160, 3}},
    [60005] = {level = 120, reward = {2160, 4}},
    [60006] = {level = 160, reward = {2160, 5}},
    [60007] = {level = 200, reward = {2160, 10}},
    [60008] = {level = 250, reward = {{7958, 50}},
}

function onAdvance(cid, skill, oldlevel, newlevel)
    if(skill ~= SKILL__LEVEL)then    return TRUE end
    for i,t in ipairs(prizes) do
        if not(getPlayerStorageValue(cid, i)) and t.level <= newlevel then
            if type(t.reward[1] ~= "table") then
                local add = doPlayerAddItem(cid, t.reward[1], t.reward[2])
                if add then
                    doPlayerSendTextMessage(cid, 19, "You have received ".t.reward[2]." ".getItemNameById(t.reward[2])." due to reaching level ".t.level.".")
                    setPlayerStorageValue(cid, i, true)
                end
            else   
                local bp = doCreateItemEx(1988, 1)
                for _,item in ipairs(t.reward) do
                    doAddContainerItem(bp, item[1], item[2])
                end
                local add = doPlayerAddItemEx(cid, bp)
                if add then
                    doPlayerSendTextMessage(cid, 19, "You have received backpack with items due to reaching level ".t.level.".")
                    setPlayerStorageValue(cid, i, true)
                end
            end
        end
    end
    return TRUE
end

I already put the code on creaturescripts.xml so everything should be working just fine...
Hope someone can help me!
Thanks!
 
Code:
[60008] = {level = 250, reward = {{7958, 50}},
{ There's your problem. :p
 
try this
Code:
local prizes = {
    [60001] = {level = 20, reward = {2152, 50}},
    [60002] = {level = 35, reward = {2160, 1}},
    [60003] = {level = 50, reward = {2160, 2}},
    [60004] = {level = 80, reward = {2160, 3}},
    [60005] = {level = 120, reward = {2160, 4}},
    [60006] = {level = 160, reward = {2160, 5}},
    [60007] = {level = 200, reward = {2160, 10}},
    [60008] = {level = 250, reward = {{7958, 50}}
}
}


function onAdvance(cid, skill, oldlevel, newlevel)
    if(skill ~= SKILL__LEVEL) then    return TRUE end
    for i,t in ipairs(prizes) do
        if not(getPlayerStorageValue(cid, i)) and t.level <= newlevel then
            if type(t.reward[1] ~= "table") then
                local add = doPlayerAddItem(cid, t.reward[1], t.reward[2])
                if add then
                    doPlayerSendTextMessage(cid, 19, "You have received "..t.reward[2].." "..getItemNameById(t.reward[2]).." due to reaching level "..t.level..".")
                    setPlayerStorageValue(cid, i, true)
                end
            else  
                local bp = doCreateItemEx(1988, 1)
                for _,item in ipairs(t.reward) do
                    doAddContainerItem(bp, item[1], item[2])
                end
                local add = doPlayerAddItemEx(cid, bp)
                if add then
                    doPlayerSendTextMessage(cid, 19, "You have received backpack with items due to reaching level "..t.level..".")
                    setPlayerStorageValue(cid, i, true)
                end
            end
        end
    end
    return TRUE
end
 
Code:
local prizes = {
    [60001] = {level = 20, reward = {2152, 50}},
    [60002] = {level = 35, reward = {2160, 1}},
    [60003] = {level = 50, reward = {2160, 2}},
    [60004] = {level = 80, reward = {2160, 3}},
    [60005] = {level = 120, reward = {2160, 4}},
    [60006] = {level = 160, reward = {2160, 5}},
    [60007] = {level = 200, reward = {2160, 10}},
    [60008] = {level = 250, reward = {7958, 50}}
}


function onAdvance(cid, skill, oldlevel, newlevel)
    if(skill ~= SKILL__LEVEL) then    return TRUE end
    for i,t in ipairs(prizes) do
        if not(getPlayerStorageValue(cid, i)) and t.level <= newlevel then
            if type(t.reward[1]) ~= "table" then
                local add = doPlayerAddItem(cid, t.reward[1], t.reward[2])
                if add then
                    doPlayerSendTextMessage(cid, 19, "You have received "..t.reward[2].." "..getItemNameById(t.reward[2]).." due to reaching level "..t.level..".")
                    setPlayerStorageValue(cid, i, true)
                end
            else
                local bp = doCreateItemEx(1988, 1)
                for _,item in ipairs(t.reward) do
                    doAddContainerItem(bp, item[1], item[2])
                end
                local add = doPlayerAddItemEx(cid, bp)
                if add then
                    doPlayerSendTextMessage(cid, 19, "You have received backpack with items due to reaching level "..t.level..".")
                    setPlayerStorageValue(cid, i, true)
                end
            end
        end
    end
    return true
end

credits @Zothion
 
Last edited:
put this in your onAdvance lua script inside onAdvance function
Code:
    local st = getPlayerStorageValue(cid, lvlForNext)
    if st <= newlevel then
        if st == -100 then
            local tmp = prizes[getPlayerStorageValue(cid, rewardLvl)]
            if tmp then
                setPlayerStorageValue(cid, lvlForNext, tmp.level)
            end
        else
            local rewL = getPlayerStorageValue(cid, rewardLvl)
            local prize = prizes[rewL]
            local reward = prize.reward
            local nextLvl = prizes[rewL+1]
            local bp = doCreateItemEx(1988, 1)
            for i=1,#reward do
                doAddContainerItem(bp, reward[i][1], reward[i][2])
            end
            doPlayerAddItemEx(cid, bp)
            doPlayerSendTextMessage(cid, 19, "You have received backpack with items due to reaching level "..prize.level..".")
            setPlayerStorageValue(cid, rewardLvl, rewL+1)
            if nextLvl then
                setPlayerStorageValue(cid, lvlForNext, nextLvl.level)
            else
                setPlayerStorageValue(cid, lvlForNext, -100)
            end
        end
    end

put this inside 000-constant.lua
Code:
prizes = {
    {level = 20, reward = {{2152, 50}}},
    {level = 35, reward = {{2160, 1}}},
    {level = 50, reward = {{2160, 2}}},
    {level = 80, reward = {{2160, 3}}},
    {level = 120, reward = {{2160, 4}}},
    {level = 160, reward = {{2160, 5}}},
    {level = 200, reward = {{2160, 10}}},
    {level = 250, reward = {{7958, 50}}},
}

rewardLvl = 60001
lvlForNext = 60002

and put this inside login.lua and onLogin function
Code:
    if getPlayerStorageValue(cid, 60001) == -1 then
        setPlayerStorageValue(cid, 60001, 1)
    end
    if getPlayerStorageValue(cid, 60002) == -1 then
        setPlayerStorageValue(cid, 60002, prizes[1].level)
    end

just tested this on my 0.3.6 and worked fine
 
Last edited:
Back
Top