• 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.1] Skills Stages

Peonso

Godly Member
Joined
Jan 14, 2008
Messages
1,762
Solutions
30
Reaction score
1,554
Gesior developed this script for 0.2 and 0.3 versions, at 1.0 doPlayerSetRate was deprecated, and it does not work.

As of past november event Player: onGainSkillTries was added and according to dalkon something can be done now.

So, that is what I need, a skills stage system, would be good to have a file where I can set the skill stage for each skill for each vocation.

(Bountysource)
 
Last edited:
Code:
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

  if (self:getVocation() == 4 or self:getVocation() == 8) and (self:getSkillLevel(SKILL_CLUB) < 80 or self:getSkillLevel(SKILL_SWORD) < 80 or self:getSkillLevel(SKILL_AXE) or self:getSill(SKILL_SHIELD) < 80) then
  return tries * configManager.getNumber(configKeys.RATE_SKILL) * 2
  end

  if (self:getVocation() == 3 or self:getVocation() == 7) and (self:getSkillLevel(SKILL_DISTANCE) < 90 or self:getSkillLevel(SKILL_SHIELD) < 80) then
  return tries * configManager.getNumber(configKeys.RATE_SKILL) * 2
  end

  return tries * configManager.getNumber(configKeys.RATE_SKILL)

end


Knights gain 2x more skill tries till skill 80, paladin gain 2x more distance tries till skill 90. If there will be any problems feel free to post here. ;]
 
Code:
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

  if (self:getVocation() == 4 or self:getVocation() == 8) and (self:getSkillLevel(SKILL_CLUB) < 80 or self:getSkillLevel(SKILL_SWORD) < 80 or self:getSkillLevel(SKILL_AXE) or self:getSill(SKILL_SHIELD) < 80) then
  return tries * configManager.getNumber(configKeys.RATE_SKILL) * 2
  end

  if (self:getVocation() == 3 or self:getVocation() == 7) and (self:getSkillLevel(SKILL_DISTANCE) < 90 or self:getSkillLevel(SKILL_SHIELD) < 80) then
  return tries * configManager.getNumber(configKeys.RATE_SKILL) * 2
  end

  return tries * configManager.getNumber(configKeys.RATE_SKILL)

end


Knights gain 2x more skill tries till skill 80, paladin gain 2x more distance tries till skill 90. If there will be any problems feel free to post here. ;]

Thanks a lot dude, I needed an exemple like yours too set it up the way I want (kinda the same thing, just different rates).
 
i have added support for mag level but it ain't working and it screw up my exp stages too
can anybody help me please?
Lua:
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

      if (self:getVocation() == 2 or self:getVocation() == 4) and (self:getSkillLevel(SKILL_MAGLEVEL) < 25) then--DRUID
     return tries * configManager.getNumber(configKeys.RATE_MAGIC) * 2
  end

  if (self:getVocation() == 1 or self:getVocation() == 5) and (self:getSkillLevel(SKILL_MAGLEVEL) < 25) then --SORC
     return tries * configManager.getNumber(configKeys.RATE_MAGIC) * 2
  end

  if (self:getVocation() == 4 or self:getVocation() == 8) and (self:getSkillLevel(SKILL_CLUB) < 45 or self:getSkillLevel(SKILL_SWORD) < 40 or self:getSkillLevel(SKILL_AXE) or self:getSkillLevel(SKILL_SHIELD) < 80) then --KNIGHT
  return tries * configManager.getNumber(configKeys.RATE_SKILL) * 2
  end

  if (self:getVocation() == 3 or self:getVocation() == 7) and (self:getSkillLevel(SKILL_DISTANCE) < 50 or self:getSkillLevel(SKILL_SHIELD) < 40) then --PALADIN
  return tries * configManager.getNumber(configKeys.RATE_SKILL) * 2
  end

  --  return tries * configManager.getNumber(configKeys.RATE_SKILL)
--end
 
Back
Top