• 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 Scripts for when to evolve

44 Hunter

New Member
Joined
Dec 14, 2017
Messages
18
Reaction score
4
I need one that rewards according to level and vocation, only the first time I reach the level ..

And another that exchanges a weapon for another if it is equipped in one of the hands or in the arrow slot, when reaching a certain level, and if it loses the level, it becomes the previous item again. If the item has no slots, nothing happens. No downgrades or upgrades
 
Tested and working. tfs nekiro tfs 1.4.2+ tfs 1.5+
You just have to activate the event onLoseExperience in data/events/events.xml
example:
XML:
<event class="Player" method="onLoseExperience" enabled="1" />

data/scripts/reward_and_evole_weapons.lua`
Lua:
local evoleWeapons = {
    -- axe to vile axe
    [2386] = { level = 100, toId = 7388 }
}

local degradeWeapons = {
    -- vile axe to axe
    [7388] = { level = 100, fromId = 2386 }
}

-- reward by level up
local rewards = {
    [100] = {
        {itemId = 2152, count = 1},
    },
    [200] = {
        {itemId = 2152, count = 10},
    }
}

local storage = 150000

local function getWeapons(player)
    return {
        player:getSlotItem(CONST_SLOT_RIGHT),
        player:getSlotItem(CONST_SLOT_LEFT),
        player:getSlotItem(CONST_SLOT_AMMO)
    }
end

local creatureEvent = CreatureEvent("rewardAndEvoleWeapons")

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

    if newLevel > oldLevel then
        for _, item in pairs(getWeapons(player)) do
            local evole = evoleWeapons[item:getId()]
            if evole and newLevel >= evole.level then
                item:transform(evole.toId)
                player:sendCancelMessage("Your weapon has evolved.")
            end
        end

        local value = player:getStorageValue(storage)
        for level = oldLevel + 1, newLevel do
            local reward = rewards[level]
            if reward and value < level then
                local redBag = player:addItem(1993)
                for _, item in pairs(reward) do
                    redBag:addItem(item.itemId, item.count)
                end
                player:sendTextMessage(MESSAGE_EVENT_ADVANCE, string.format("You have received: %s", redBag:getContentDescription()))
            end
        end
        player:setStorageValue(storage, newLevel)
        return true
    end
    return true
end

creatureEvent:register()

local creatureEvent = CreatureEvent("rewardAndEvoleWeaponsLogin")

function creatureEvent.onLogin(player)
    player:registerEvent("rewardAndEvoleWeapons")
    return true
end

creatureEvent:register()

local ec = EventCallback

function ec.onLoseExperience(player, exp)
    local level = player:getLevel()
    local oldLevel = level
    local experience = player:getExperience()
    if player:getVocation():getId() == 0 or level > 7 then
        experience = experience - exp
    end
    while level > 1 and experience < Game.getExperienceForLevel(level) do
        level = level - 1
        for _, item in pairs(getWeapons(player)) do
            local degrade = degradeWeapons[item:getId()]
            if degrade and level <= degrade.level then
                item:transform(degrade.fromId)
                player:sendCancelMessage("Your weapon has degraded.")
            end
        end
    end
    return exp
end

ec:register(1)

If you want it in separate files:
data/scripts/rewards.lua
Lua:
-- reward by level up
local rewards = {
    [100] = {
        {itemId = 2152, count = 1},
    },
    [200] = {
        {itemId = 2152, count = 10},
    }
}

local storage = 150000

local creatureEvent = CreatureEvent("rewardsTEST")

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

    if newLevel > oldLevel then
        local value = player:getStorageValue(storage)
        for level = oldLevel + 1, newLevel do
            local reward = rewards[level]
            if reward and value < level then
                local redBag = player:addItem(1993)
                for _, item in pairs(reward) do
                    redBag:addItem(item.itemId, item.count)
                end
                player:sendTextMessage(MESSAGE_EVENT_ADVANCE, string.format("You have received: %s", redBag:getContentDescription()))
            end
        end
        player:setStorageValue(storage, newLevel)
        return true
    end
    return true
end

local creatureEvent = CreatureEvent("rewardTESTLogin")

function creatureEvent.onLogin(player)
    player:registerEvent("rewardsTEST")
    return true
end

creatureEvent:register()

Remember that onLoseExperience needs to be activated for the weapons script.
data/scripts/evole_weapons.lua
Lua:
local evoleWeapons = {
    -- axe to vile axe
    [2386] = { level = 100, toId = 7388 }
}

local degradeWeapons = {
    -- vile axe to axe
    [7388] = { level = 100, fromId = 2386 }
}

local function getWeapons(player)
    return {
        player:getSlotItem(CONST_SLOT_RIGHT),
        player:getSlotItem(CONST_SLOT_LEFT),
        player:getSlotItem(CONST_SLOT_AMMO)
    }
end

local creatureEvent = CreatureEvent("evoleWeapons")

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

    if newLevel > oldLevel then
        for _, item in pairs(getWeapons(player)) do
            local evole = evoleWeapons[item:getId()]
            if evole and newLevel >= evole.level then
                item:transform(evole.toId)
                player:sendCancelMessage("Your weapon has evolved.")
            end
        end
    end
    return true
end

creatureEvent:register()

local creatureEvent = CreatureEvent("evoleWeaponsLogin")

function creatureEvent.onLogin(player)
    player:registerEvent("evoleWeapons")
    return true
end

creatureEvent:register()

local ec = EventCallback

function ec.onLoseExperience(player, exp)
    local level = player:getLevel()
    local oldLevel = level
    local experience = player:getExperience()
    if player:getVocation():getId() == 0 or level > 7 then
        experience = experience - exp
    end
    while level > 1 and experience < Game.getExperienceForLevel(level) do
        level = level - 1
        for _, item in pairs(getWeapons(player)) do
            local degrade = degradeWeapons[item:getId()]
            if degrade and level <= degrade.level then
                item:transform(degrade.fromId)
                player:sendCancelMessage("Your weapon has degraded.")
            end
        end
    end
    return exp
end

ec:register(1)
 
Last edited:
Back
Top