• 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 [CreatureScript Interface] Level Recompense script

eduardojuniosm

Full Stack Web Developer
Joined
Dec 16, 2013
Messages
99
Reaction score
35
Location
Brazil
Hello guys!

I created a simple lua script that give to the player a recompense by reach a determined level.

But every single time that a player advance to a new level I get this error:

Code:
Lua Script Error: [CreatureScript Interface]
data/creaturescripts/scripts/levelrecompense.lua:onAdvance
data/creaturescripts/scripts/levelrecompense.lua:11: attempt to index a nil value
stack traceback:
        [C]: in function '__index'
        data/creaturescripts/scripts/levelrecompense.lua:11: in function <data/creaturescripts/scripts/levelrecompense.lua:10>

Here is the levelrecompense.lua file:

Code:
local recompenses = {
    [50] = {itemid = 2160, quant = 5, stor = 35322},
    [100] = {itemid = 2160, quant = 10, stor = 35333},
    [150] = {itemid = 2160, quant = 15, stor = 35344},
    [200] = {itemid = 2160, quant = 20, stor = 35355},
    [300] = {itemid = 2160, quant = 30, stor = 35366},
    [452] = {itemid = 2160, quant = 100, stor = 35377}
}

function onAdvance(player)
    if getPlayerStorageValue(player, recompenses[getPlayerLevel(player)].stor) == -1 then
        player:addItem(recompenses[getPlayerLevel(player)].itemid, recompenses[getPlayerLevel(player)].quant)
        player:getPosition():sendMagicEffect(CONST_ME_MAGIC_GREEN)
        player:sendCancelMessage("Congratulations by reach the level ".. getPlayerLevel(player) .."! Here is ".. recompenses[getPlayerLevel(player)].quant .."0000 gold pieces.")
        setPlayerStorageValue(player, recompenses[getPlayerLevel(player)].stor, 1)
        return true
    end
    return true
end

Thank you in advance! =)
 
Code:
local recompenses = {
    [50] = {itemid = 2160, amount = 5, storage = 35322},
    [100] = {itemid = 2160, amount = 10, storage = 35333},
    [150] = {itemid = 2160, amount = 15, storage = 35344},
    [200] = {itemid = 2160, amount = 20, storage = 35355},
    [300] = {itemid = 2160, amount = 30, storage = 35366},
    [452] = {itemid = 2160, amount = 100, storage = 35377}
}

function onAdvance(player, skill, oldLevel, newLevel)
    if skill ~= SKILL_LEVEL then
        return true
    end

    local level = player:getLevel()
    local target = recompenses[level]
    if not target then
        return true
    end

    if player:getStorageValue(target.storage) == -1 then
        player:addItem(target.itemid, target.amount)
        player:getPosition():sendMagicEffect(CONST_ME_MAGIC_GREEN)
        player:sendCancelMessage("Congratulations by reach the level " .. level .. "! Here is " .. target.amount .. "0000 gold pieces.")
        player:setStorageValue(target.storage, 1)
    end
    return true
end

The main problem was that you directly went to try and fetch the index from an array where the level might not exist.
The solution is to check if it exists before you try to index something from it.

A tip is to also add a check if it's actually the correct skill aswell use the new Lua interface.
 
Back
Top