• 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!
  • 2026 staff recruitment is open! Check it out and consider applying!

Lua Double experiance day

pasibun

New Member
Joined
Nov 7, 2011
Messages
147
Reaction score
1
Update:
Thanks to Scarlet Ayleid and Summ who build a certain day of the week exprate script.

Globalevent to set exprate player who is online:
LUA:
function onTimer()
	local message = "test"
	local expRate = 1
	if (os.date('%A') == 'Wednesday') then
		message = "Extra experience day has been started" 
		expRate = 2
	elseif (os.date('%A') ~= 'Wednesday') then
		message = "Extra experience day is over"
		expRate = 1
	else
		return true
	end
	for _, cid in pairs(getPlayersOnline()) do
		doPlayerSetRate(cid, SKILL__LEVEL, expRate)
		doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, message)
	end
	return true
end

Creaturescript to set exprate player who logs in on double exp day:
LUA:
function onLogin(cid)
	if (os.date('%A') == 'Wednesday') then
		doPlayerSetRate(cid, SKILL__LEVEL, 2)
		doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Today is extra experience day")
	end
	return true
end
 
Last edited:
Code:
[01/11/2012 14:38:00] [Error - GlobalEvent Interface] 
[01/11/2012 14:38:00] data/globalevents/scripts/exp event/exp event.lua:onTimer
[01/11/2012 14:38:00] Description: 
[01/11/2012 14:38:00] data/globalevents/scripts/exp event/exp event.lua:29: attempt to index field '?' (a nil value)
[01/11/2012 14:38:00] stack traceback:
[01/11/2012 14:38:00] 	data/globalevents/scripts/exp event/exp event.lua:29: in function <data/globalevents/scripts/exp event/exp event.lua:14>
[01/11/2012 14:38:00] [Error - GlobalEvents::timer] Couldn't execute event: exp
 
LUA:
local expRates = {
    {1, 100},
    {26, 60},
    {51, 40},
    {76, 25},
    {101, 15},
    {151, 10},
    {201, 8},
    {251, 7},
    {301, 3},
    {551, 3}
}
  
function onTimer()
    local message = "test"
    local expRate = 1
    if (os.date('%A') == 'Wednesday') then
        message = "Extra experience day has been started" 
        expRate = 50
    elseif (os.date('%A') == 'Thursday') then
        message = "Extra experience day is over"
        expRate = 1
    else
        return true
    end
    for _, cid in pairs(getPlayersOnline()) do
        for i = 1, #expRates, 1 do
            if(expRates[i][1] <= getPlayerLevel(cid)) then
                doPlayerSetRate(cid, SKILL__LEVEL, expRates[i - 1][2])
                break
            end
        end
    doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, message)
    end
    return true
end

The test player is lvl 247.

The file name is: exp event.lua
XML:
<globalevent name="exp" time="14:40" event="script" value="exp event/exp event.lua"/>
 
Last edited by a moderator:
try this now:

LUA:
local expRates = {
    {1, 100},
    {26, 60},
    {51, 40},
    {76, 25},
    {101, 15},
    {151, 10},
    {201, 8},
    {251, 7},
    {301, 3},
    {551, 3}
}
  
function onTimer()
    local message = "test"
    local expRate = 1
    if (os.date('%A') == 'Wednesday') then
        message = "Extra experience day has been started" 
        expRate = 50
    elseif (os.date('%A') == 'Thursday') then
        message = "Extra experience day is over"
        expRate = 1
    else
        return true
    end
    for _, cid in pairs(getPlayersOnline()) do
        for i = 1, #expRates, 1 do
            if(expRates[i][1] > getPlayerLevel(cid)) then
                doPlayerSetRate(cid, SKILL__LEVEL, expRates[i - 1][2])
                break
            end
        end
    doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, message)
    end
    return true
end

Had the wrong sign(>) in the level comparison
 
@Scarlet
If i is equal to 1 it will try to access the field 0 in expRates which is not set.

Important
I just checked how doPlayerSetRate work and it simply multiplies the current expgain and stuff.
So you don't have to check for any rates. Setting it to 2 will double the gained exp and setting to 1 will give normal exp.

Use this:
LUA:
function onTimer()
	local message = "test"
	local expRate = 1
	if (os.date('%A') == 'Wednesday') then
		message = "Extra experience day has been started" 
		expRate = 2
	elseif (os.date('%A') == 'Thursday') then
		message = "Extra experience day is over"
		expRate = 1
	else
		return true
	end
	for _, cid in pairs(getPlayersOnline()) do
		doPlayerSetRate(cid, SKILL__LEVEL, expRate)
		doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, message)
	end
	return true
end
 
Last edited:
@Scarlet
If i is equal to 1 it will try to access the field 0 in expRates which is not set.

wrong

if(expRates[1] > getPlayerLevel(cid)) then
i = 1 -> if(1 > 1) then (false)
i = 2 -> if(26 > 1) then (true) expRates[2 - 1][2]
 
Last edited:
@Scarlet
Ah ok. Was too quick at reading.
However he should use the simple version I posted otherwise he gets humongous exp rates for his players.

Source part:
[cpp] gainExp *= rates[SKILL__LEVEL] * g_game.getExperienceStage(level,
vocation->getExperienceMultiplier());[/cpp]
=> rates[SKILL__LEVEL] is the variable affected by doPlayerSetRate() and getExperienceStage will get the players current stage (if stages are used, otherwise simply the exp rate)
 
You misspelled experience.

yeah, im dyslectic :P

- - - Updated - - -

LUA:
function onTimer()
	local message = "test"
	local expRate = 1
	if (os.date('%A') == 'Wednesday') then
		message = "Extra experience day has been started" 
		expRate = 2
	elseif (os.date('%A') == 'Thursday') then
		message = "Extra experience day is over"
		expRate = 1
	else
		return true
	end
	for _, cid in pairs(getPlayersOnline()) do
		doPlayerSetRate(cid, SKILL__LEVEL, expRate)
		doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, message)
	end
	return true
end

Using your script gives me this error:

Code:
[01/11/2012 15:34:00] [Error - GlobalEvent Interface] 
[01/11/2012 15:34:00] data/globalevents/scripts/exp event/exp event.lua:onTimer
[01/11/2012 15:34:00] Description: 
[01/11/2012 15:34:00] (luaDoPlayerSetRate) Player not found

[01/11/2012 15:34:00] [Error - GlobalEvent Interface] 
[01/11/2012 15:34:00] data/globalevents/scripts/exp event/exp event.lua:onTimer
[01/11/2012 15:34:00] Description: 
[01/11/2012 15:34:00] (luaDoPlayerSendTextMessage) Player not found
 
Last edited by a moderator:
That means that in the script isn't selected to who will add the double experience, change the doPlayerSetRate and doPlayerSendTextMessage for another functions, im not sure of which ones.
 
he forgot to add the loop to loop thru all players online
LUA:
function onTimer()
	local message = "test"
	local expRate = 1
	if (os.date('%A') == 'Wednesday') then
		message = "Extra experience day has been started" 
		expRate = 2
	elseif (os.date('%A') == 'Thursday') then
		message = "Extra experience day is over"
		expRate = 1
	else
		return true
	end
	for _, cid in pairs(getPlayersOnline()) do
		doPlayerSetRate(cid, SKILL__LEVEL, expRate)
		doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, message)
	end
	return true
end
 
Finaly my understanding for loops are getting more clear, also thank you for that :D

The script is running and is live in the server atm :D.
Only downside is, it works currently only for the people that are online at (in our case) 00:00.
If new players login on double exp day, then they dont get the exprate set.

I tried to make this script also work onlogin but Im not able to.
Can someone help me with this?
 
LUA:
function onLogin(cid)
	if (os.date('%A') == 'Wednesday') then
		doPlayerSetRate(cid, SKILL__LEVEL, 2)
		doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Today is extra experience day")
	end
	return true
end
this should suffice
 
Back
Top