• 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 script error skill stage

henkas

Well-Known Member
Joined
Jul 8, 2015
Messages
1,067
Solutions
5
Reaction score
63
Hi
i got this error, it happens when i cast spell.
Untitled.png


LUA:
local experienceStages = {
    {
        minlevel = 1,
        maxlevel = 8,
        multiplier = 7
    }, {
        minlevel = 9,
        maxlevel = 20,
        multiplier = 6
    }, {
        minlevel = 21,
        maxlevel = 50,
        multiplier = 5
    }, {
        minlevel = 51,
        maxlevel = 100,
        multiplier = 4
    }, {
        minlevel = 101,
        multiplier = 3
    }
}

function Player:onLook(thing, position, distance)
    local description = "You see " .. thing:getDescription(distance)
    if self:getGroup():getAccess() then
        if thing:isItem() then
            description = string.format("%s\nItem ID: %d", description, thing:getId())

            local actionId = thing:getActionId()
            if actionId ~= 0 then
                description = string.format("%s, Action ID: %d", description, actionId)
            end

            local uniqueId = thing:getAttribute(ITEM_ATTRIBUTE_UNIQUEID)
            if uniqueId > 0 and uniqueId < 65536 then
                description = string.format("%s, Unique ID: %d", description, uniqueId)
            end

            local itemType = thing:getType()

            local transformEquipId = itemType:getTransformEquipId()
            local transformDeEquipId = itemType:getTransformDeEquipId()
            if transformEquipId ~= 0 then
                description = string.format("%s\nTransforms to: %d (onEquip)", description, transformEquipId)
            elseif transformDeEquipId ~= 0 then
                description = string.format("%s\nTransforms to: %d (onDeEquip)", description, transformDeEquipId)
            end

            local decayId = itemType:getDecayId()
            if decayId ~= -1 then
                description = string.format("%s\nDecays to: %d", description, decayId)
            end
        elseif thing:isCreature() then
            local str = "%s\nHealth: %d / %d"
            if thing:getMaxMana() > 0 then
                str = string.format("%s, Mana: %d / %d", str, thing:getMana(), thing:getMaxMana())
            end
            description = string.format(str, description, thing:getHealth(), thing:getMaxHealth()) .. "."
        end

        local position = thing:getPosition()
        description = string.format(
            "%s\nPosition: %d, %d, %d",
            description, position.x, position.y, position.z
        )

        if thing:isCreature() then
            if thing:isPlayer() then
                description = string.format("%s\nIP: %s.", description, Game.convertIpToString(thing:getIp()))
            end
        end
    end
    self:sendTextMessage(MESSAGE_INFO_DESCR, description)
end

function Player:onLookInBattleList(creature, distance)
    local description = "You see " .. creature:getDescription(distance)
    if self:getGroup():getAccess() then
        local str = "%s\nHealth: %d / %d"
        if creature:getMaxMana() > 0 then
            str = string.format("%s, Mana: %d / %d", str, creature:getMana(), creature:getMaxMana())
        end
        description = string.format(str, description, creature:getHealth(), creature:getMaxHealth()) .. "."

        local position = creature:getPosition()
        description = string.format(
            "%s\nPosition: %d, %d, %d",
            description, position.x, position.y, position.z
        )

        if creature:isPlayer() then
            description = string.format("%s\nIP: %s", description, Game.convertIpToString(creature:getIp()))
        end
    end
    self:sendTextMessage(MESSAGE_INFO_DESCR, description)
end

function Player:onLookInTrade(partner, item, distance)
    self:sendTextMessage(MESSAGE_INFO_DESCR, "You see " .. item:getDescription(distance))
end

function Player:onLookInShop(itemType, count)
    return true
end

local vocs = {
    [{1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35}] = {13385, 12746, 13434, 13435, 12747, 12744, 12748, 12736, 13444, 13443, 15667, 15712},
    [{10, 11, 19, 23, 34}] = {12716, 12717, 12722, 12727, 12720, 12721, 12724, 12723, 12730, 12729, 14675, 14680, 14678, 14676, 14679, 14681, 14677, 14683, 14682, 14684, 13390, 14685, 14686, 14498, 12699, 12700, 12698, 12702,
    12713, 12703, 12704, 12701, 12705, 12706, 12707, 12708, 12710, 12712, 12711, 12709, 12714, 13466, 15671, 15676, 15711, 15724}
}

function Player:onMoveItem(item, count, fromPosition, toPosition, fromCylinder, toCylinder)
    if toPosition.x ~= CONTAINER_POSITION then
        return true
    end

    if bit.band(toPosition.y, 0x40) == 0 then
        for vocations, ids in pairs(vocs) do
            if table.contains(vocations, self:getVocation():getId()) then
                if table.contains(ids, item:getId()) then
                    return false
                end
            end
        end
    end

        local itemType, moveItem = ItemType(item:getId())
        if bit.band(itemType:getSlotPosition(), SLOTP_TWO_HAND) ~= 0 and toPosition.y == CONST_SLOT_LEFT then
            moveItem = self:getSlotItem(CONST_SLOT_RIGHT)
        elseif itemType:getWeaponType() == WEAPON_SHIELD and toPosition.y == CONST_SLOT_RIGHT then
            moveItem = self:getSlotItem(CONST_SLOT_LEFT)
            if moveItem and bit.band(ItemType(moveItem:getId()):getSlotPosition(), SLOTP_TWO_HAND) == 0 then
                return true
        end

        if moveItem then
            local parent = item:getParent()
            if parent and parent:isItem() and parent:isContainer() then
                if parent:getSize() == parent:getCapacity() then
                    self:sendTextMessage(MESSAGE_STATUS_SMALL, Game.getReturnMessage(RETURNVALUE_CONTAINERNOTENOUGHROOM))
                    return false
                else
                    return moveItem:moveTo(parent)
                end
            end
        end
    end

    return true
end

function Player:onMoveCreature(creature, fromPosition, toPosition)
    return true
end

function Player:onTurn(direction)
    return true
end

function Player:onTradeRequest(target, item)
    return true
end

function Player:onTradeAccept(target, item, targetItem)
    return true
end

local soulCondition = Condition(CONDITION_SOUL, CONDITIONID_DEFAULT)
soulCondition:setTicks(4 * 60 * 1000)
soulCondition:setParameter(CONDITION_PARAM_SOULGAIN, 1)

local function useStamina(player)
    local staminaMinutes = player:getStamina()
    if staminaMinutes == 0 then
        return
    end

    local playerId = player:getId()
    local currentTime = os.time()
    local timePassed = currentTime - nextUseStaminaTime[playerId]
    if timePassed <= 0 then
        return
    end

    if timePassed > 60 then
        if staminaMinutes > 2 then
            staminaMinutes = staminaMinutes - 2
        else
            staminaMinutes = 0
        end
        nextUseStaminaTime[playerId] = currentTime + 120
    else
        staminaMinutes = staminaMinutes - 1
        nextUseStaminaTime[playerId] = currentTime + 60
    end
    player:setStamina(staminaMinutes)
end

local function getExpRateFromTable(t, level, default)
   for _, rate in ipairs(t) do
        if level >= rate.minlevel and (not rate.maxlevel or level <= rate.maxlevel) then
            return rate.multiplier
        end
    end

    return default
end

function Player:onGainExperience(source, exp, rawExp)
    if not source or source:isPlayer() then
        return exp
    end
    -- Soul regeneration
    local vocation = self:getVocation()
    if self:getSoul() < vocation:getMaxSoul() and exp >= self:getLevel() then
        soulCondition:setParameter(CONDITION_PARAM_SOULTICKS, vocation:getSoulGainTicks() * 1000)
        self:addCondition(soulCondition)
    end
    -- Apply experience stage multiplier
    exp = exp * getExpRateFromTable(experienceStages, self:getLevel(), configManager.getNumber(configKeys.RATE_EXP))
    -- Stamina modifier
    if configManager.getBoolean(configKeys.STAMINA_SYSTEM) then
        useStamina(self)
        local staminaMinutes = self:getStamina()
        if staminaMinutes > 2400 and self:isPremium() then
            exp = exp * 1.5
        elseif staminaMinutes <= 840 then
            exp = exp * 0.5
        end
    end
    return exp
end


function Player:onLoseExperience(exp)
    return exp
end

local skillStages = {
    [SKILL_MAGLEVEL] = {
        {minLevel = 1, maxLevel = 30, multiplier = 6}
    },
    [SKILL_CLUB] = {
        {minLevel = 1, maxLevel = 30, multiplier = 6}
    },
    [SKILL_SWORD] = {
        {minLevel = 1, maxLevel = 30, multiplier = 4}
    },
    [SKILL_AXE] = {
        {minLevel = 1, maxLevel = 30, multiplier = 6}
    },
    [SKILL_DISTANCE] = {
        {minLevel = 1, maxLevel = 30, multiplier = 3}
    },
    [SKILL_SHIELD] = {
        {minLevel = 1, maxLevel = 30, multiplier = 3}
    },
    [SKILL_FISHING] = {
        {minLevel = 1, maxLevel = 30, multiplier = 3}
    },
    [SKILL_MAGLEVEL] = {
        {minLevel = 1, maxLevel = 30, multiplier = 3}
    }
}

function getRateFromTable(t, skill, level, default)
    local rateTable = t[skill]
    if rateTable then
        for _, rate in ipairs(rateTable) do
            local max = rate.maxLevel or math.huge
            if level >= rate.minLevel and level <= max then
                return rate.multiplier
            end
        end
    end
    return default
end

function Player:onGainSkillTries(skill, tries)
    if APPLY_SKILL_MULTIPLIER == false then
        return tries
    end

    local level = self:getSkillLevel(skill)
    local multiplier = getRateFromTable(skillStages, skill, level, 1)

    local key = (skill == SKILL_MAGLEVEL) and configKeys.RATE_MAGIC or configKeys.RATE_SKILL

    tries = tries * configManager.getNumber(key) * multiplier
    return tries
end
 
Solution
change
LUA:
local level = self:getSkillLevel(skill)
to
LUA:
local level = (skill == SKILL_MAGLEVEL) and self:getMagicLevel() or self:getSkillLevel(skill)
print(level, max) above line 273 and see what it prints
it's occurring with level <= max but level clearly passes the previous check so level can't be nil
max shouldn't be nil either, math.huge is a valid constant
 
are you using the same spell to make it error?
the prints are useless unless you can get it to error again
 
you said when you casted a spell it gave you this error
now when you cast a spell it doesn't do anything whatsoever?
are you casting a spell that takes mana to give your ml skilltries?
 
you said when you casted a spell it gave you this error
now when you cast a spell it doesn't do anything whatsoever?
are you casting a spell that takes mana to give your ml skilltries?
No i mean if i cast spell it gives that error but it doesnt print, if i hit with hands it prints. Yes that spell takes mana and gives skilltries
 
if you added it above line 273 it should be printing right before it errors
did you put it inside the if statement or something?
 
change
LUA:
local level = self:getSkillLevel(skill)
to
LUA:
local level = (skill == SKILL_MAGLEVEL) and self:getMagicLevel() or self:getSkillLevel(skill)
 
Solution
Back
Top