• 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 understanding onGainSkillTries

darkmu

Active Member
Joined
Aug 26, 2007
Messages
249
Solutions
1
Reaction score
44
Location
Paraná,Brazil
Well I made a system that "doubles" the skill rates for X hours, however I was very confused on how this function works onGainSkillTries, I will post what I did and I would like to know if it is correct?

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

    if skill == SKILL_MAGLEVEL then
        if self:getStorageValue(15732) >= os.time() then
            return tries * configManager.getNumber(configKeys.RATE_MAGIC) * 5.0
        else
            return tries * configManager.getNumber(configKeys.RATE_MAGIC)
        end
    end
   
    if self:getStorageValue(15732) >= os.time() then       
        return tries * configManager.getNumber(configKeys.RATE_SKILL) * 5.0
    else
        return tries * configManager.getNumber(configKeys.RATE_SKILL)
    end
end

My doubts and whether using that function if I use the dummy will be "double" too or do I need to change the script manually?

Lua:
local skills = {
    [32384] = {id=SKILL_SWORD,voc=4}, -- KNIGHT
    [32385] = {id=SKILL_AXE,voc=4}, -- KNIGHT
    [32386] = {id=SKILL_CLUB,voc=4}, -- KNIGHT
    [32387] = {id=SKILL_DISTANCE,voc=3,range=CONST_ANI_SIMPLEARROW}, -- PALADIN
    [32388] = {id=SKILL_MAGLEVEL,voc=2,range=CONST_ANI_SMALLICE}, -- DRUID
    [32389] = {id=SKILL_MAGLEVEL,voc=1,range=CONST_ANI_FIRE}, -- SORCERER
    [32124] = {id=SKILL_SWORD,voc=4}, -- KNIGHT
    [32125] = {id=SKILL_AXE,voc=4}, -- KNIGHT
    [32126] = {id=SKILL_CLUB,voc=4}, -- KNIGHT
    [32127] = {id=SKILL_DISTANCE,voc=3,range=CONST_ANI_SIMPLEARROW}, -- PALADIN
    [32128] = {id=SKILL_MAGLEVEL,voc=2,range=CONST_ANI_SMALLICE}, -- DRUID
    [32129] = {id=SKILL_MAGLEVEL,voc=1,range=CONST_ANI_FIRE} -- SORCERER
}

local houseDummies = {32143, 32144, 32145, 32146, 32147, 32148}
local freeDummies = {32142, 32149}
local skillRate = configManager.getNumber(configKeys.RATE_SKILL)
local magicRate = configManager.getNumber(configKeys.RATE_MAGIC)

local function start_train(pid,start_pos,itemid,fpos, bonusDummy, dummyId)
    local player = Player(pid)
    if player ~= nil then
    if Tile(fpos):getItemById(dummyId) then
        local pos_n = player:getPosition()
        if start_pos:getDistance(pos_n) == 0 and getTilePzInfo(pos_n) then
            if player:getItemCount(itemid) >= 1 then
                local exercise = player:getItemById(itemid,true)
                if exercise:isItem() then
                    if exercise:hasAttribute(ITEM_ATTRIBUTE_CHARGES) then
                        local charges_n = exercise:getAttribute(ITEM_ATTRIBUTE_CHARGES)
                        if charges_n >= 1 then
                            exercise:setAttribute(ITEM_ATTRIBUTE_CHARGES,(charges_n-1))

                            local voc = player:getVocation()
                            local randomico = math.random(1,10)
                            local tempo = player:getStorageValue(15732) > os.time()
                            
                            if skills[itemid].id == SKILL_MAGLEVEL then
                                if not bonusDummy and not player:isVip() then
                                    player:addManaSpent(math.ceil(1500*magicRate))
                                else
                                    if randomico == 1 and bonusDummy == true then
                                        player:addManaSpent(math.ceil(1500*magicRate)*3.0) -- 30%
                                        player:say('Voce recebeu [2x] de bonus por ser VIP e bater em um dummmy especial', TALKTYPE_MONSTER_YELL, false, 0, fpos)
                                    else
                                        player:addManaSpent(math.ceil(1500*magicRate)*1.5) -- 10%                                   
                                    end
                                end
                            else
                                if not bonusDummy and not player:isVip()then
                                    player:addSkillTries(skills[itemid].id, 15*skillRate)
                                else
                                    if randomico == 1 and bonusDummy == true then
                                        player:addSkillTries(skills[itemid].id, (15*skillRate)*3.0) -- 30%
                                        
                                        if tempo == true then
                                            player:say('Voce recebeu [4x] de bonus por ser VIP, bater em um dummmy especial e estar com master treino ativado', TALKTYPE_MONSTER_YELL, false, 0, fpos)
                                        else
                                            player:say('Voce recebeu [2x] de bonus por ser VIP e bater em um dummmy especial', TALKTYPE_MONSTER_YELL, false, 0, fpos)
                                        end
                                    else
                                        player:addSkillTries(skills[itemid].id, (15*skillRate)*1.5) -- 10%
                                    end
                                end
                            end
                                fpos:sendMagicEffect(CONST_ME_HITAREA)
                                
                            if skills[itemid].range then
                                pos_n:sendDistanceEffect(fpos, skills[itemid].range)
                            end
                            local training = addEvent(start_train, voc:getAttackSpeed(), pid,start_pos,itemid,fpos,bonusDummy,dummyId)
                            player:setStorageValue(Storage.isTraining,1)                           
                        else
                            exercise:remove(1)
                            player:sendTextMessage(MESSAGE_INFO_DESCR, "Your training weapon vanished.")
                            stopEvent(training)
                            player:setStorageValue(Storage.isTraining,0)                           
                        end
                    end
                end
            end
        else
            player:sendTextMessage(MESSAGE_INFO_DESCR, "Your training has stopped.")
            stopEvent(training)
            player:setStorageValue(Storage.isTraining,0)
        end
    else
    stopEvent(training)
            player:sendTextMessage(MESSAGE_INFO_DESCR, "Your training has stopped.")
            player:setStorageValue(Storage.isTraining, 0)
            end
            else
        stopEvent(training)
        if player then
            player:sendTextMessage(MESSAGE_INFO_DESCR, "Your training has stopped.")
            player:setStorageValue(Storage.isTraining,0)
        end
    end
 
    return true
end

function onUse(player, item, fromPosition, target, toPosition, isHotkey)
    local start_pos = player:getPosition()
    if player:getStorageValue(Storage.isTraining) == 1 then
        player:sendTextMessage(MESSAGE_INFO_DESCR, "You are already training.")
        return false
    end
    if target:isItem() then
        if isInArray(houseDummies,target:getId()) then
            if not skills[item.itemid].range and (start_pos:getDistance(target:getPosition()) > 1) then
                player:sendTextMessage(MESSAGE_INFO_DESCR, "Get closer to the dummy.")
                stopEvent(training)
                return true
            end
            player:sendTextMessage(MESSAGE_INFO_DESCR, "You started training.")
            start_train(player:getId(),start_pos,item.itemid,target:getPosition(), true, target:getId())
        elseif isInArray(freeDummies, target:getId()) then
            if not skills[item.itemid].range and (start_pos:getDistance(target:getPosition()) > 1) then
                player:sendTextMessage(MESSAGE_INFO_DESCR, "Get closer to the dummy.")
                stopEvent(training)
                return true
            end
            player:sendTextMessage(MESSAGE_INFO_DESCR, "You started training.")
            start_train(player:getId(),start_pos,item.itemid,target:getPosition(), false, target:getId())
        end
    end
    return true
end
 

Sarah Wesker

ค∂vαηcε รүηтαx ❤
Support Team
Joined
Mar 16, 2017
Messages
1,039
Solutions
103
Reaction score
1,096
Location
London
GitHub
MillhioreBT
yes, works, because the function filters all skill attempts, you should try with an impression in the function and know when it is executed, you can check that giving skill with the addSkillTries function goes through there.
 
OP
OP
darkmu

darkmu

Active Member
Joined
Aug 26, 2007
Messages
249
Solutions
1
Reaction score
44
Location
Paraná,Brazil
yes, works, because the function filters all skill attempts, you should try with an impression in the function and know when it is executed, you can check that giving skill with the addSkillTries function goes through there.
So I put a print on the function onGainSkillTries, when I use exercise on the dummy it seems to me that it is not calling that function :(, it is only called when I hit monsters.


I'm trying to find out what that means, it's in LIB / CORE / player.lua

APPLY_SKILL_MULTIPLIER = true
local addSkillTriesFunc = Player.addSkillTries
function Player.addSkillTries(...)
APPLY_SKILL_MULTIPLIER = false
local ret = addSkillTriesFunc(...)
APPLY_SKILL_MULTIPLIER = true
return ret
end

local addManaSpentFunc = Player.addManaSpent
function Player.addManaSpent(...)
APPLY_SKILL_MULTIPLIER = false
local ret = addManaSpentFunc(...)
APPLY_SKILL_MULTIPLIER = true
return ret
end
 
Last edited:
Top