• 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.1] onAdvance reward

zbizu

Legendary OT User
Joined
Nov 22, 2010
Messages
3,323
Solutions
26
Reaction score
2,694
Location
Poland
reward given for advancing to certain level/skill

creaturescripts.xml
Code:
	<event type="advance" name="onadvance_reward" script="onadvance_reward.lua"/>
	<event type="login" name="onadv_register" script="onadvance_reward.lua"/>

onadvance_reward.lua
Code:
local rewards = {
	[SKILL_SWORD] = {
		{lvl = 150, items = {{2160, 2}, {2148, 1}}, storage = 54776},
		{lvl = 160, items = {{2365, 2}}, storage = 54777}
	},
	[SKILL_MAGLEVEL] = {
		{lvl = 100, items = {{2365, 2}}, storage = 54778},
	},
	[SKILL_LEVEL] = {
		{lvl = 480, items = {{2152, 2}}, storage = 54779},
	},
}

function onAdvance(player, skill, oldlevel, newlevel)
	local rewardstr = "Items received: "
	local reward_t = {}
	if rewards[skill] then
		for j = 1, #rewards[skill] do
			local r = rewards[skill][j]
			if not r then
				return true
			end

			if newlevel >= r.lvl then
				if player:getStorageValue(r.storage) < 1 then
					player:setStorageValue(r.storage, 1)
					for i = 1, #r.items do
						local itt = ItemType(r.items[i][1])
						if itt then
							player:addItem(r.items[i][1], r.items[i][2])
							table.insert(reward_t, itt:getName() .. (r.items[i][2] > 1 and " x" .. r.items[i][2] or ""))
						end
					end
				end
			end
		end
	
		if #reward_t > 0 then
			player:sendTextMessage(MESSAGE_STATUS_CONSOLE_ORANGE, rewardstr .. table.concat(reward_t, ", "))
		end
	end
	return true
end

function onLogin(player)
	player:registerEvent("onadvance_reward")
	return true
end
 
Last edited:
Why should you have
<event type="login" name="onadv_register" script="onadvance_reward.lua"/>
in creaturescripts.xml
When you dont put it anywhere else?

it executes this
Code:
function onLogin(player)
player:registerEvent("onadvance_reward")
return true
end

so it's registered on player and executed when he levels up
it's in same script so you don't need to edit your login.lua
 
it executes this
Code:
function onLogin(player)
player:registerEvent("onadvance_reward")
return true
end

so it's registered on player and executed when he levels up
it's in same script so you don't need to edit your login.lua

Yup I saw that later. Thanks for charing and caring mate. Great job! And the error is all gone now, with the new one. Thanks again!
 
I was reading the script and I've never been very good with tables. Would you be able to enhance this script by giving an option of exp earned based on certain skill milestones? You already have items for skill milestones, which I think it pretty good.
 
Smh.. I gutted the script so bad trying to work it and now I can't figure out what to do.. >.> I hate tables...

Code:
local rewards = {
    [SKILL_SWORD] = {
        {lvl = 11, reward = 5000, storage = 54776},
        {lvl = 12, reward = 5000, storage = 54777},
        {lvl = 13, reward = 5000, storage = 54778},
        {lvl = 14, reward = 5000, storage = 54779},
        {lvl = 15, reward = 5000, storage = 54780},
        {lvl = 16, reward = 5000, storage = 54781},
        {lvl = 17, reward = 5000, storage = 54782},
        {lvl = 18, reward = 5000, storage = 54783},
        {lvl = 19, reward = 5000, storage = 54784},
        {lvl = 20, reward = 5000, storage = 54785}
    },
    [SKILL_MAGLEVEL] = {
        {lvl = 100, reward = 5000, storage = 54800},
    },
    [SKILL_CLUB] = {
        {lvl = 480, reward = 5000, storage = 54900},
    },
}

function onAdvance(player, skill, oldlevel, newlevel)
    local rewardstr = "You've reached a new Skill milestone and thus, feel more experienced."
    local reward_t = {}
    if rewards[skill] then
        player:addExperience(rewards)
        for j = 1, #rewards[skill] do
            local r = rewards[skill][j]
            if not r then
                return true
            end
        end
  
        if #reward_t > 0 then
            player:sendTextMessage(MESSAGE_STATUS_CONSOLE_ORANGE, rewardstr .. table.concat(reward_t, ", "))
        end
    end
    return true
end

function onLogin(player)
    player:registerEvent("onadvance_reward")
    return true
end
 
Last edited:
Smh.. I gutted the script so bad trying to work it and now I can't figure out what to do.. >.> I hate tables...

Code:
local rewards = {
    [SKILL_SWORD] = {
        {lvl = 11, reward = 5000, storage = 54776},
        {lvl = 12, reward = 5000, storage = 54777},
        {lvl = 13, reward = 5000, storage = 54778},
        {lvl = 14, reward = 5000, storage = 54779},
        {lvl = 15, reward = 5000, storage = 54780},
        {lvl = 16, reward = 5000, storage = 54781},
        {lvl = 17, reward = 5000, storage = 54782},
        {lvl = 18, reward = 5000, storage = 54783},
        {lvl = 19, reward = 5000, storage = 54784},
        {lvl = 20, reward = 5000, storage = 54785}
    },
    [SKILL_MAGLEVEL] = {
        {lvl = 100, reward = 5000, storage = 54800},
    },
    [SKILL_CLUB] = {
        {lvl = 480, reward = 5000, storage = 54900},
    },
}
 
function onAdvance(player, skill, oldlevel, newlevel)
    local rewardstr = "You've reached a new Skill milestone and thus, feel more experienced."
    local reward_t = {}
    if rewards[skill] then
        player:addExperience(reward)
        for j = 1, #rewards[skill] do
            local r = rewards[skill][j]
            if not r then
                return true
            end
        end
  
        if #reward_t > 0 then
            player:sendTextMessage(MESSAGE_STATUS_CONSOLE_ORANGE, rewardstr .. table.concat(reward_t, ", "))
        end
    end
    return true
end
 
function onLogin(player)
    player:registerEvent("onadvance_reward")
    return true
end

You want for example when a player gets 50 sword he is given 100k exp?
 
+1 and bump for that
Code:
local rewards = {
    --- Sorcerer
    [1] = {
        [SKILL_MAGLEVEL] = {
            {lvl = 5, items = {{2365, 2}}, storage = 54778},
        }
    },
    --- Druid
    [2] = {
        [SKILL_MAGLEVEL] = {
            {lvl = 10, items = {{2365, 2}}, storage = 54778},
        }
    },
    --- Paladin
    [3] = {
        [SKILL_DISTANCE] = {
            {lvl = 20, items = {{2160, 2}, {2148, 1}}, storage = 54776},
            {lvl = 160, items = {{2365, 2}}, storage = 54777}
        }
    },
    --- Knight
    [4] = {
        [SKILL_SWORD] = {
            {lvl = 50, items = {{2160, 2}, {2148, 1}}, storage = 54776},
            {lvl = 100, items = {{2365, 2}}, storage = 54777}
        },
        [SKILL_CLUB] = {
            {lvl = 50, items = {{2160, 2}, {2148, 1}}, storage = 54776},
            {lvl = 100, items = {{2365, 2}}, storage = 54777}
        },
        [SKILL_AXE] = {
            {lvl = 50, items = {{2160, 2}, {2148, 1}}, storage = 54776},
            {lvl = 100, items = {{2365, 2}}, storage = 54777}
        }
    }
}

function onAdvance(player, skill, oldlevel, newlevel)
    local rewardstr = "Items received: "
    local reward_t = {}
    local voc = player:getVocation():getBase():getId()
    if rewards[voc][skill] then
        for j = 1, #rewards[voc][skill] do
            local r = rewards[voc][skill][j]
            if not r then
                return true
            end

            if newlevel >= r.lvl then
                if player:getStorageValue(r.storage) < 1 then
                    player:setStorageValue(r.storage, 1)
                    for i = 1, #r.items do
                        local itt = ItemType(r.items[i][1])
                        if itt then
                            player:addItem(r.items[i][1], r.items[i][2])
                            table.insert(reward_t, itt:getName() .. (r.items[i][2] > 1 and " x" .. r.items[i][2] or ""))
                        end
                    end
                end
            end
        end
   
        if #reward_t > 0 then
            player:sendTextMessage(MESSAGE_STATUS_CONSOLE_ORANGE, rewardstr .. table.concat(reward_t, ", "))
        end
    end
    return true
end

function onLogin(player)
    player:registerEvent("onadvance_reward")
    return true
end
 
Code:
local rewards = {
    --- Sorcerer
    [1] = {
        [SKILL_MAGLEVEL] = {
            {lvl = 5, items = {{2365, 2}}, storage = 54778},
        }
    },
    --- Druid
    [2] = {
        [SKILL_MAGLEVEL] = {
            {lvl = 10, items = {{2365, 2}}, storage = 54778},
        }
    },
    --- Paladin
    [3] = {
        [SKILL_DISTANCE] = {
            {lvl = 20, items = {{2160, 2}, {2148, 1}}, storage = 54776},
            {lvl = 160, items = {{2365, 2}}, storage = 54777}
        }
    },
    --- Knight
    [4] = {
        [SKILL_SWORD] = {
            {lvl = 50, items = {{2160, 2}, {2148, 1}}, storage = 54776},
            {lvl = 100, items = {{2365, 2}}, storage = 54777}
        },
        [SKILL_CLUB] = {
            {lvl = 50, items = {{2160, 2}, {2148, 1}}, storage = 54776},
            {lvl = 100, items = {{2365, 2}}, storage = 54777}
        },
        [SKILL_AXE] = {
            {lvl = 50, items = {{2160, 2}, {2148, 1}}, storage = 54776},
            {lvl = 100, items = {{2365, 2}}, storage = 54777}
        }
    }
}

function onAdvance(player, skill, oldlevel, newlevel)
    local rewardstr = "Items received: "
    local reward_t = {}
    local voc = player:getVocation():getBase():getId()
    if rewards[voc][skill] then
        for j = 1, #rewards[voc][skill] do
            local r = rewards[voc][skill][j]
            if not r then
                return true
            end

            if newlevel >= r.lvl then
                if player:getStorageValue(r.storage) < 1 then
                    player:setStorageValue(r.storage, 1)
                    for i = 1, #r.items do
                        local itt = ItemType(r.items[i][1])
                        if itt then
                            player:addItem(r.items[i][1], r.items[i][2])
                            table.insert(reward_t, itt:getName() .. (r.items[i][2] > 1 and " x" .. r.items[i][2] or ""))
                        end
                    end
                end
            end
        end
  
        if #reward_t > 0 then
            player:sendTextMessage(MESSAGE_STATUS_CONSOLE_ORANGE, rewardstr .. table.concat(reward_t, ", "))
        end
    end
    return true
end

function onLogin(player)
    player:registerEvent("onadvance_reward")
    return true
end

I already sent one to him hehe
 
Code:
local rewards = {
    --- Sorcerer
    [1] = {
        [SKILL_MAGLEVEL] = {
            {lvl = 5, items = {{2365, 2}}, storage = 54778},
        }
    },
    --- Druid
    [2] = {
        [SKILL_MAGLEVEL] = {
            {lvl = 10, items = {{2365, 2}}, storage = 54778},
        }
    },
    --- Paladin
    [3] = {
        [SKILL_DISTANCE] = {
            {lvl = 20, items = {{2160, 2}, {2148, 1}}, storage = 54776},
            {lvl = 160, items = {{2365, 2}}, storage = 54777}
        }
    },
    --- Knight
    [4] = {
        [SKILL_SWORD] = {
            {lvl = 50, items = {{2160, 2}, {2148, 1}}, storage = 54776},
            {lvl = 100, items = {{2365, 2}}, storage = 54777}
        },
        [SKILL_CLUB] = {
            {lvl = 50, items = {{2160, 2}, {2148, 1}}, storage = 54776},
            {lvl = 100, items = {{2365, 2}}, storage = 54777}
        },
        [SKILL_AXE] = {
            {lvl = 50, items = {{2160, 2}, {2148, 1}}, storage = 54776},
            {lvl = 100, items = {{2365, 2}}, storage = 54777}
        }
    }
}

function onAdvance(player, skill, oldlevel, newlevel)
    local rewardstr = "Items received: "
    local reward_t = {}
    local voc = player:getVocation():getBase():getId()
    if rewards[voc][skill] then
        for j = 1, #rewards[voc][skill] do
            local r = rewards[voc][skill][j]
            if not r then
                return true
            end

            if newlevel >= r.lvl then
                if player:getStorageValue(r.storage) < 1 then
                    player:setStorageValue(r.storage, 1)
                    for i = 1, #r.items do
                        local itt = ItemType(r.items[i][1])
                        if itt then
                            player:addItem(r.items[i][1], r.items[i][2])
                            table.insert(reward_t, itt:getName() .. (r.items[i][2] > 1 and " x" .. r.items[i][2] or ""))
                        end
                    end
                end
            end
        end
 
        if #reward_t > 0 then
            player:sendTextMessage(MESSAGE_STATUS_CONSOLE_ORANGE, rewardstr .. table.concat(reward_t, ", "))
        end
    end
    return true
end

function onLogin(player)
    player:registerEvent("onadvance_reward")
    return true
end

In the part of the Vocs. If the player is promoted, is rewarded also? Or I have to put 1,5 for MS?
 
Back
Top