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

TFS 1.X+ Help editing/modifying skills stages script for tfs 1.x

CipsoftStinks

www.relicaria.com
Joined
Oct 1, 2016
Messages
947
Solutions
3
Reaction score
137
Location
Argentina
Hello I'm trying to add skill stages support for my ot tfs 1.3
i have edited the tables a bit and im having troubles with it im trying to handle more than 1 vocation per table so that way i don't have to add a new table for each vocacion that in this case would be include atleast eight different tables.
i have added the scripts to events/scripts/player.lua
as you can see in the script in some tables im using two or even for vocations per table. and that's the problem dunno why, i think a comma , should work . but it doesn't
Lua:
--agregado
local config = {
    -- base vocationId  --knights
    [4, 8] = {
        -- skillId
        [SKILL_FIST] = {
            -- [{skillLevel}] = skillRate
            [{10, 19}] = 30,--10
            [{20, 29}] = 20,
            [{30, 39}] = 10,
            [{40, 49}] = 6,
            [{50, 59}] = 4,
            [{60, 69}] = 3,
            [{70, 79}] = 2,
            [{80, 89}] = 1
        },
        [SKILL_CLUB] = {
            [{10, 19}] = 30,--10
            [{20, 29}] = 20,
            [{30, 39}] = 10,
            [{40, 49}] = 6,
            [{50, 59}] = 4,
            [{60, 69}] = 3,
            [{70, 79}] = 2,
            [{80, 89}] = 1
        },
        [SKILL_SWORD] = {
            [{10, 19}] = 30,--10
            [{20, 29}] = 20,
            [{30, 39}] = 10,
            [{40, 49}] = 6,
            [{50, 59}] = 4,
            [{60, 69}] = 3,
            [{70, 79}] = 2,
            [{80, 89}] = 1
        },
        [SKILL_AXE] = {
            [{10, 19}] = 30,--10
            [{20, 29}] = 20,
            [{30, 39}] = 10,
            [{40, 49}] = 6,
            [{50, 59}] = 4,
            [{60, 69}] = 3,
            [{70, 79}] = 2,
            [{80, 89}] = 1
        },
        [SKILL_DISTANCE] = {
            [{10, 19}] = 30,--10
            [{20, 29}] = 20,
            [{30, 39}] = 10,
            [{40, 49}] = 6,
            [{50, 59}] = 4,
            [{60, 69}] = 3,
            [{70, 79}] = 2,
            [{80, 89}] = 1
        },
        [SKILL_SHIELD] = {
                [{10, 19}] = 30,--10
            [{20, 29}] = 20,
            [{30, 39}] = 10,
            [{40, 49}] = 6,
            [{50, 59}] = 4,
            [{60, 69}] = 3,
            [{70, 79}] = 2,
            [{80, 89}] = 1
        },
        [SKILL_FISHING] = {
            [{10, 19}] = 30,--10
            [{20, 29}] = 20,
            [{30, 39}] = 10,
            [{40, 49}] = 6,
            [{50, 59}] = 4,
            [{60, 69}] = 3,
            [{70, 79}] = 2,
            [{80, 89}] = 1
        },
        [SKILL_MAGLEVEL] = {
            [{0, 5}] = 9, --10
            [{6, 10}] = 5,
            [{11, 15}] = 1
        }
    }
}

local config = {
    -- base vocationId  --Magues
    [1, 2, 5, 6] = {
        -- skillId
        [SKILL_FIST] = {
            -- [{skillLevel}] = skillRate
            [{10, 19}] = 20,--10
            [{20, 29}] = 5,
            [{30, 39}] = 1
        },
        [SKILL_CLUB] = {
         [{10, 19}] = 20,--10
            [{20, 29}] = 5,
            [{30, 39}] = 1
        },
        [SKILL_SWORD] = {
            [{10, 19}] = 20,--10
            [{20, 29}] = 5,
            [{30, 39}] = 1
        },
        [SKILL_AXE] = {
            [{10, 19}] = 20,--10
            [{20, 29}] = 5,
            [{30, 39}] = 1
        },
        [SKILL_DISTANCE] = {
            [{10, 19}] = 20,--10
            [{20, 29}] = 5,
            [{30, 39}] = 1
        },
        [SKILL_SHIELD] = {
            [{10, 19}] = 30,--10
            [{20, 29}] = 5,
            [{30, 39}] = 1
        },
        [SKILL_FISHING] = {
            [{10, 19}] = 30,--10
            [{20, 29}] = 20,
            [{30, 39}] = 10,
            [{40, 49}] = 6,
            [{50, 59}] = 4,
            [{60, 69}] = 3,
            [{70, 79}] = 2,
            [{80, 89}] = 1
        },
        [SKILL_MAGLEVEL] = {
            [{0, 5}] = 25, --10
            [{6, 10}] = 20,
            [{11, 15}] = 15,
            [{16, 20}] = 10,
            [{21, 25}] = 8,
            [{26, 30}] = 5,
            [{31, 35}] = 3,
            [{36, 40}] = 2,
            [{41, 50}] = 1,
        }
    }
}

local config = {
    -- base vocationId  --Paladin
    [3, 7] = {
        -- skillId
        [SKILL_FIST] = {
            -- [{skillLevel}] = skillRate
            [{10, 19}] = 30,--10
            [{20, 29}] = 20,
            [{30, 39}] = 10,
            [{40, 49}] = 6,
            [{50, 59}] = 4,
            [{60, 69}] = 3,
            [{70, 79}] = 2,
            [{80, 89}] = 1
        },
        [SKILL_CLUB] = {
         [{10, 19}] = 25,--10
            [{20, 29}] = 15,
            [{30, 39}] = 5,
            [{40, 49}] = 5,
            [{50, 59}] = 1
        },
        [SKILL_SWORD] = {
            [{10, 19}] = 25,--10
            [{20, 29}] = 15,
            [{30, 39}] = 5,
            [{40, 49}] = 5,
            [{50, 59}] = 1
        },
        [SKILL_AXE] = {
            [{10, 19}] = 25,--10
            [{20, 29}] = 15,
            [{30, 39}] = 5,
            [{40, 49}] = 5,
            [{50, 59}] = 1
        },
        [SKILL_DISTANCE] = {
            [{10, 19}] = 30,--10
            [{20, 29}] = 20,
            [{30, 39}] = 10,
            [{40, 49}] = 6,
            [{50, 59}] = 4,
            [{60, 69}] = 3,
            [{70, 79}] = 2,
            [{80, 89}] = 1
        },
        [SKILL_SHIELD] = {
            [{10, 19}] = 30,--10
            [{20, 29}] = 20,
            [{30, 39}] = 10,
            [{40, 49}] = 6,
            [{50, 59}] = 4,
            [{60, 69}] = 3,
            [{70, 79}] = 2,
            [{80, 89}] = 1
        },
        [SKILL_FISHING] = {
            [{10, 19}] = 30,--10
            [{20, 29}] = 20,
            [{30, 39}] = 10,
            [{40, 49}] = 6,
            [{50, 59}] = 4,
            [{60, 69}] = 3,
            [{70, 79}] = 2,
            [{80, 89}] = 1
        },
        [SKILL_MAGLEVEL] = {
            [{0, 5}] = 10, --10
            [{6, 10}] = 6,
            [{11, 15}] = 3,
            [{16, 20}] = 1
 
        }
    }
}
 

function Vocation.getBase(self)
    local demotion = self:getDemotion()
    while demotion do
        local tmp = demotion:getDemotion()
        if not tmp then
            return demotion
        end
        demotion = tmp
    end
    return self
end

 
local function getSkillRate(player, skillId)
    local targetVocation = config[player:getVocation():getBase():getId()]
    if targetVocation then
        local targetSkillStage = targetVocation[skillId]
        if targetSkillStage then
            local skillLevel = player:getSkillLevel(skillId)
            for level, rate in pairs(targetSkillStage) do
                if skillLevel >= level[1] and skillLevel <= level[2] then
                    return rate
                end
            end
        end
    end
 
    return skillId == SKILL_MAGLEVEL and configManager.getNumber(configKeys.RATE_MAGIC) or configManager.getNumber(configKeys.RATE_SKILL)
end
 
function Player:onGainSkillTries(skill, tries)
    if not APPLY_SKILL_MULTIPLIER then
        return tries
    end
 
    return tries * getSkillRate(self, skill)
end

and here is the whole player.lua
Code:
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:isPlayer() and 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:isPlayer() and 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

function Player:onMoveItem(item, count, fromPosition, toPosition, fromCylinder, toCylinder)
    return true
end

function Player:onItemMoved(item, count, fromPosition, toPosition, fromCylinder, toCylinder)
end

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

local function hasPendingReport(name, targetName, reportType)
    local f = io.open(string.format("data/reports/players/%s-%s-%d.txt", name, targetName, reportType), "r")
    if f then
        io.close(f)
        return true
    else
        return false
    end
end

function Player:onReportRuleViolation(targetName, reportType, reportReason, comment, translation)
    local name = self:getName()
    if hasPendingReport(name, targetName, reportType) then
        self:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Your report is being processed.")
        return
    end

    local file = io.open(string.format("data/reports/players/%s-%s-%d.txt", name, targetName, reportType), "a")
    if not file then
        self:sendTextMessage(MESSAGE_EVENT_ADVANCE, "There was an error when processing your report, please contact a gamemaster.")
        return
    end

    io.output(file)
    io.write("------------------------------\n")
    io.write("Reported by: " .. name .. "\n")
    io.write("Target: " .. targetName .. "\n")
    io.write("Type: " .. reportType .. "\n")
    io.write("Reason: " .. reportReason .. "\n")
    io.write("Comment: " .. comment .. "\n")
    if reportType ~= REPORT_TYPE_BOT then
        io.write("Translation: " .. translation .. "\n")
    end
    io.write("------------------------------\n")
    io.close(file)
    self:sendTextMessage(MESSAGE_EVENT_ADVANCE, string.format("Thank you for reporting %s. Your report will be processed by %s team as soon as possible.", targetName, configManager.getString(configKeys.SERVER_NAME)))
    return
end

function Player:onReportBug(message, position, category)
    if self:getAccountType() == ACCOUNT_TYPE_NORMAL then
        return false
    end

    local name = self:getName()
    local file = io.open("data/reports/bugs/" .. name .. " report.txt", "a")

    if not file then
        self:sendTextMessage(MESSAGE_EVENT_DEFAULT, "There was an error when processing your report, please contact a gamemaster.")
        return true
    end

    io.output(file)
    io.write("------------------------------\n")
    io.write("Name: " .. name)
    if category == BUG_CATEGORY_MAP then
        io.write(" [Map position: " .. position.x .. ", " .. position.y .. ", " .. position.z .. "]")
    end
    local playerPosition = self:getPosition()
    io.write(" [Player Position: " .. playerPosition.x .. ", " .. playerPosition.y .. ", " .. playerPosition.z .. "]\n")
    io.write("Comment: " .. message .. "\n")
    io.close(file)

    self:sendTextMessage(MESSAGE_EVENT_DEFAULT, "Your report has been sent to " .. configManager.getString(configKeys.SERVER_NAME) .. ".")
    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

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 * Game.getExperienceStage(self:getLevel())

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

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

    --if skill == SKILL_MAGLEVEL then
        --return tries * configManager.getNumber(configKeys.RATE_MAGIC)
--    end
    --return tries * configManager.getNumber(configKeys.RATE_SKILL)
--end
--agregado
local config = {
    -- base vocationId  --knights
    [4, 8] = {
        -- skillId
        [SKILL_FIST] = {
            -- [{skillLevel}] = skillRate
            [{10, 19}] = 30,--10
            [{20, 29}] = 20,
            [{30, 39}] = 10,
            [{40, 49}] = 6,
            [{50, 59}] = 4,
            [{60, 69}] = 3,
            [{70, 79}] = 2,
            [{80, 89}] = 1
        },
        [SKILL_CLUB] = {
            [{10, 19}] = 30,--10
            [{20, 29}] = 20,
            [{30, 39}] = 10,
            [{40, 49}] = 6,
            [{50, 59}] = 4,
            [{60, 69}] = 3,
            [{70, 79}] = 2,
            [{80, 89}] = 1
        },
        [SKILL_SWORD] = {
            [{10, 19}] = 30,--10
            [{20, 29}] = 20,
            [{30, 39}] = 10,
            [{40, 49}] = 6,
            [{50, 59}] = 4,
            [{60, 69}] = 3,
            [{70, 79}] = 2,
            [{80, 89}] = 1
        },
        [SKILL_AXE] = {
            [{10, 19}] = 30,--10
            [{20, 29}] = 20,
            [{30, 39}] = 10,
            [{40, 49}] = 6,
            [{50, 59}] = 4,
            [{60, 69}] = 3,
            [{70, 79}] = 2,
            [{80, 89}] = 1
        },
        [SKILL_DISTANCE] = {
            [{10, 19}] = 30,--10
            [{20, 29}] = 20,
            [{30, 39}] = 10,
            [{40, 49}] = 6,
            [{50, 59}] = 4,
            [{60, 69}] = 3,
            [{70, 79}] = 2,
            [{80, 89}] = 1
        },
        [SKILL_SHIELD] = {
                [{10, 19}] = 30,--10
            [{20, 29}] = 20,
            [{30, 39}] = 10,
            [{40, 49}] = 6,
            [{50, 59}] = 4,
            [{60, 69}] = 3,
            [{70, 79}] = 2,
            [{80, 89}] = 1
        },
        [SKILL_FISHING] = {
            [{10, 19}] = 30,--10
            [{20, 29}] = 20,
            [{30, 39}] = 10,
            [{40, 49}] = 6,
            [{50, 59}] = 4,
            [{60, 69}] = 3,
            [{70, 79}] = 2,
            [{80, 89}] = 1
        },
        [SKILL_MAGLEVEL] = {
            [{0, 5}] = 9, --10
            [{6, 10}] = 5,
            [{11, 15}] = 1
        }
    }
}

local config = {
    -- base vocationId  --Magues
    [1, 2, 5, 6] = {
        -- skillId
        [SKILL_FIST] = {
            -- [{skillLevel}] = skillRate
            [{10, 19}] = 20,--10
            [{20, 29}] = 5,
            [{30, 39}] = 1
        },
        [SKILL_CLUB] = {
         [{10, 19}] = 20,--10
            [{20, 29}] = 5,
            [{30, 39}] = 1
        },
        [SKILL_SWORD] = {
            [{10, 19}] = 20,--10
            [{20, 29}] = 5,
            [{30, 39}] = 1
        },
        [SKILL_AXE] = {
            [{10, 19}] = 20,--10
            [{20, 29}] = 5,
            [{30, 39}] = 1
        },
        [SKILL_DISTANCE] = {
            [{10, 19}] = 20,--10
            [{20, 29}] = 5,
            [{30, 39}] = 1
        },
        [SKILL_SHIELD] = {
            [{10, 19}] = 30,--10
            [{20, 29}] = 5,
            [{30, 39}] = 1
        },
        [SKILL_FISHING] = {
            [{10, 19}] = 30,--10
            [{20, 29}] = 20,
            [{30, 39}] = 10,
            [{40, 49}] = 6,
            [{50, 59}] = 4,
            [{60, 69}] = 3,
            [{70, 79}] = 2,
            [{80, 89}] = 1
        },
        [SKILL_MAGLEVEL] = {
            [{0, 5}] = 25, --10
            [{6, 10}] = 20,
            [{11, 15}] = 15,
            [{16, 20}] = 10,
            [{21, 25}] = 8,
            [{26, 30}] = 5,
            [{31, 35}] = 3,
            [{36, 40}] = 2,
            [{41, 50}] = 1,
        }
    }
}

local config = {
    -- base vocationId  --Paladin
    [3, 7] = {
        -- skillId
        [SKILL_FIST] = {
            -- [{skillLevel}] = skillRate
            [{10, 19}] = 30,--10
            [{20, 29}] = 20,
            [{30, 39}] = 10,
            [{40, 49}] = 6,
            [{50, 59}] = 4,
            [{60, 69}] = 3,
            [{70, 79}] = 2,
            [{80, 89}] = 1
        },
        [SKILL_CLUB] = {
         [{10, 19}] = 25,--10
            [{20, 29}] = 15,
            [{30, 39}] = 5,
            [{40, 49}] = 5,
            [{50, 59}] = 1
        },
        [SKILL_SWORD] = {
            [{10, 19}] = 25,--10
            [{20, 29}] = 15,
            [{30, 39}] = 5,
            [{40, 49}] = 5,
            [{50, 59}] = 1
        },
        [SKILL_AXE] = {
            [{10, 19}] = 25,--10
            [{20, 29}] = 15,
            [{30, 39}] = 5,
            [{40, 49}] = 5,
            [{50, 59}] = 1
        },
        [SKILL_DISTANCE] = {
            [{10, 19}] = 30,--10
            [{20, 29}] = 20,
            [{30, 39}] = 10,
            [{40, 49}] = 6,
            [{50, 59}] = 4,
            [{60, 69}] = 3,
            [{70, 79}] = 2,
            [{80, 89}] = 1
        },
        [SKILL_SHIELD] = {
            [{10, 19}] = 30,--10
            [{20, 29}] = 20,
            [{30, 39}] = 10,
            [{40, 49}] = 6,
            [{50, 59}] = 4,
            [{60, 69}] = 3,
            [{70, 79}] = 2,
            [{80, 89}] = 1
        },
        [SKILL_FISHING] = {
            [{10, 19}] = 30,--10
            [{20, 29}] = 20,
            [{30, 39}] = 10,
            [{40, 49}] = 6,
            [{50, 59}] = 4,
            [{60, 69}] = 3,
            [{70, 79}] = 2,
            [{80, 89}] = 1
        },
        [SKILL_MAGLEVEL] = {
            [{0, 5}] = 10, --10
            [{6, 10}] = 6,
            [{11, 15}] = 3,
            [{16, 20}] = 1
 
        }
    }
}
 

function Vocation.getBase(self)
    local demotion = self:getDemotion()
    while demotion do
        local tmp = demotion:getDemotion()
        if not tmp then
            return demotion
        end
        demotion = tmp
    end
    return self
end

 
local function getSkillRate(player, skillId)
    local targetVocation = config[player:getVocation():getBase():getId()]
    if targetVocation then
        local targetSkillStage = targetVocation[skillId]
        if targetSkillStage then
            local skillLevel = player:getSkillLevel(skillId)
            for level, rate in pairs(targetSkillStage) do
                if skillLevel >= level[1] and skillLevel <= level[2] then
                    return rate
                end
            end
        end
    end
 
    return skillId == SKILL_MAGLEVEL and configManager.getNumber(configKeys.RATE_MAGIC) or configManager.getNumber(configKeys.RATE_SKILL)
end
 
function Player:onGainSkillTries(skill, tries)
    if not APPLY_SKILL_MULTIPLIER then
        return tries
    end
 
    return tries * getSkillRate(self, skill)
end

and i must add the i get the script from here
Skills Stages for tfs 1.x

ok solved it. doing it in the long long way. i got like eight long tables. does anybody has another way?
 
Last edited:
Back
Top