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

CreatureEvent [TFS 1.2+] Give item on level advance - configurable level and vocations

Gesior.pl

Mega Noob&LOL 2012
Senator
Joined
Sep 18, 2007
Messages
2,964
Solutions
99
Reaction score
3,375
Location
Poland
GitHub
gesior
Someone asked me on Discord about script that gives configurable rewards on level advance.
It's onAdvance event. Rewards are easy configurable and can be limited by vocations and level.

Lua:
local rookVocations = { 0 }
local sorcererVocations = { 1, 5 }
local druidVocations = { 2, 6 }
local paladinVocations = { 3, 7 }
local knightVocations = { 4, 8 }
local mainVocations = { 1, 2, 3, 4, 5, 6, 7, 8 }
local allVocations = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }

local rewardsConfig = {
    -- 2cc and Magic Sword for every 20 level on main
    {
        level = 20,
        vocations = mainVocations,
        storage = 25100,
        items = {
            { 2160, 2 },
            { 2400, 1 },
        }
    },
    -- wand of inferno for 33 sorc
    {
        level = 33,
        vocations = sorcererVocations,
        storage = 25101,
        items = {
            { 2187, 1 },
        }
    },
}

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

    for i1, rewardConfig in pairs(rewardsConfig) do
        if newLevel >= rewardConfig.level then
            if table.contains(rewardConfig.vocations, player:getVocation():getId()) then
                if player:getStorageValue(rewardConfig.storage) < 1 then
                    player:setStorageValue(rewardConfig.storage, os.time())
                    for i2, item in pairs(rewardConfig.items) do
                        player:addItem(item[1], item[2])
                    end
                    player:getPosition():sendMagicEffect(CONST_ME_CRAPS)
                    player:sendTextMessage(MESSAGE_INFO_DESCR, "You received reward for getting " .. rewardConfig.level .. " level.")
                end
            end
        end
    end

    return true
end

EDIT:
Fixed level comparison. Now script works when player advanced from level 19 to 21 and reward is for level 20.
 
Last edited:
You shouldn't use

Code:
if newLevel == rewardConfig.level then

Because when player advance from level 19 to level 21 (with high exp stage), then he won't become reward.

Besides, well done, very useful script! :)
 
You shouldn't use

Code:
if newLevel == rewardConfig.level then

Because when player advance from level 19 to level 21 (with high exp stage), then he won't become reward.

Besides, well done, very useful script! :)
Thanks! I will fix it now. After years of development of low-mid exp stages servers, I forgot there are servers that can give more than 1 level for 1 kill.
 
Someone asked me on Discord about script that gives configurable rewards on level advance.
It's onAdvance event. Rewards are easy configurable and can be limited by vocations and level.

Lua:
local rookVocations = { 0 }
local sorcererVocations = { 1, 5 }
local druidVocations = { 2, 6 }
local paladinVocations = { 3, 7 }
local knightVocations = { 4, 8 }
local mainVocations = { 1, 2, 3, 4, 5, 6, 7, 8 }
local allVocations = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }

local rewardsConfig = {
    -- 2cc and Magic Sword for every 20 level on main
    {
        level = 20,
        vocations = mainVocations,
        storage = 25100,
        items = {
            { 2160, 2 },
            { 2400, 1 },
        }
    },
    -- wand of inferno for 33 sorc
    {
        level = 33,
        vocations = sorcererVocations,
        storage = 25101,
        items = {
            { 2187, 1 },
        }
    },
}

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

    for i1, rewardConfig in pairs(rewardsConfig) do
        if newLevel >= rewardConfig.level then
            if table.contains(rewardConfig.vocations, player:getVocation():getId()) then
                if player:getStorageValue(rewardConfig.storage) < 1 then
                    player:setStorageValue(rewardConfig.storage, os.time())
                    for i2, item in pairs(rewardConfig.items) do
                        player:addItem(item[1], item[2])
                    end
                    player:getPosition():sendMagicEffect(CONST_ME_CRAPS)
                    player:sendTextMessage(MESSAGE_INFO_DESCR, "You received reward for getting " .. rewardConfig.level .. " level.")
                end
            end
        end
    end

    return true
end

EDIT:
Fixed level comparison. Now script works when player advanced from level 19 to 21 and reward is for level 20.
data\events\scripts i must create onAdvance.lua ?
and later <event class="Player" method="onAdvance" enabled="1" /> in events.xml ?
dont work
 
In data/creaturescripts/creaturescripts.xml add
XML:
<event type="advance" name="LevelItems" script="levelitems.lua" />
In data/creaturescripts/scripts create levelitems.lua and paste script code
Edit data/creaturescripts/scripts/login.lua and add
Lua:
player:registerEvent("LevelItems")
 
Błąd skryptu Lua: [CreatureScript Interface]
data / creaturescripts / scripts / levelitems.lua: onAdvance
data / lib / core / table.lua: 17: zły argument nr 1 na „pary” (oczekiwano tabeli, uzyskano numer)
śledzenie stosu:
[C]: pod adresem 0x7ff697722e20
[C]: w funkcji „pary”
data / lib / core / table.lua: 17: w funkcji „zawiera”
data / creaturescripts / scripts / levelitems.lua: 38: w funkcji <data / creaturescripts / scripts / levelitems.lua: 31>
Post automatically merged:

Lua Script Error: [CreatureScript Interface]
data/creaturescripts/scripts/levelitems.lua:eek:nAdvance
data/lib/core/tables.lua:17: bad argument #1 to 'pairs' (table expected, got number)
stack traceback:
[C]: at 0x7ff697722e20
[C]: in function 'pairs'
data/lib/core/tables.lua:17: in function 'contains'
data/creaturescripts/scripts/levelitems.lua:38: in function <data/creaturescripts/scripts/levelitems.lua:31>
 
Błąd skryptu Lua: [CreatureScript Interface]
data / creaturescripts / scripts / levelitems.lua: onAdvance
data / lib / core / table.lua: 17: zły argument nr 1 na „pary” (oczekiwano tabeli, uzyskano numer)
śledzenie stosu:
[C]: pod adresem 0x7ff697722e20
[C]: w funkcji „pary”
data / lib / core / table.lua: 17: w funkcji „zawiera”
data / creaturescripts / scripts / levelitems.lua: 38: w funkcji <data / creaturescripts / scripts / levelitems.lua: 31>
Post automatically merged:
Looks like bad config. Post your script with config.

Looks like you set vocation in config with number value like:
Code:
 level = 33,
        vocations = 3,
        storage = 25101,
and it must be in table format:

Code:
 level = 33,
        vocations = {3},
        storage = 25101,
 
in tfs 1.3 should I only add onAdvance.lue in scripts folder or may i make some changes in some files too. in tfs 1.3 there is no xml files
 
revscript version (tfs 1.4+)

Paste in data/scripts

Lua:
local rookVocations = { 0 }
local sorcererVocations = { 1, 5 }
local druidVocations = { 2, 6 }
local paladinVocations = { 3, 7 }
local knightVocations = { 4, 8 }
local mainVocations = { 1, 2, 3, 4, 5, 6, 7, 8 }
local allVocations = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }

local rewardsConfig = {
    -- 2cc and Magic Sword for every 20 level on main
    {
        level = 20,
        vocations = mainVocations,
        storage = 25100,
        items = {
            { 2160, 2 },
            { 2400, 1 },
        }
    },
    -- wand of inferno for 33 sorc
    {
        level = 33,
        vocations = sorcererVocations,
        storage = 25101,
        items = {
            { 2187, 1 },
        }
    },
}

local advanceReward = CreatureEvent("AdvanceReward")

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

    for i1, rewardConfig in pairs(rewardsConfig) do
        if newLevel >= rewardConfig.level then
            if table.contains(rewardConfig.vocations, player:getVocation():getId()) then
                if player:getStorageValue(rewardConfig.storage) < 1 then
                    player:setStorageValue(rewardConfig.storage, os.time())
                    for i2, item in pairs(rewardConfig.items) do
                        player:addItem(item[1], item[2])
                    end
                    player:getPosition():sendMagicEffect(CONST_ME_CRAPS)
                    player:sendTextMessage(MESSAGE_INFO_DESCR, "You received reward for getting " .. rewardConfig.level .. " level.")
                end
            end
        end
    end

    return true
end

advanceReward:register()
 
Back
Top