---[ CUSTOM FUNCTIONS ]---
local function getTableLength(t)
local count = 0
for k, v in pairs(t) do count = count + 1 end
return count
end
local function secondsToReadable(s)
local hours = math.floor(s / 3600)
local minutes = math.floor(math.mod(s, 3600)/60)
local seconds = math.floor(math.mod(s, 60))
return (hours > 0 and (hours .. ' hours ') or '') ..
(minutes > 0 and (minutes .. ' minutes ') or '') ..
(seconds > 0 and (seconds .. ' seconds ') or '')
end
---[ CONFIGURATION ]---
local config = {
-- HEALTH BOOST
HP_BOOST_TIME = 10, -- 10 seconds
HP_BOOST_PERCENT = 10, -- +10%
HP_BOOST_STORAGE = 13450,
-- MANA BOOST
MP_BOOST_TIME = 10, -- 10 seconds
MP_BOOST_PERCENT = 10, -- +10%
MP_BOOST_STORAGE = 13451,
-- EXP_RATE
EXPERIENCE_AMOUNT = 10,
EXTRA_EXP_RATE = 1.05, -- +5%
EXTRA_EXP_STORAGE = 181233,
EXTRA_EXP_TIME = 60,
STORAGE_LAST_USED = 181234,
REWARD_TIME = 24 * 3600
}
local REWARD_TYPE = {
ITEM = 1,
EXPERIENCE = 2,
EXTRA_HP = 3,
EXTRA_MP = 4,
EXP_RATE = 5
}
local rewards = {}
rewards[REWARD_TYPE.ITEM] = {2160, 10}
rewards[REWARD_TYPE.EXPERIENCE] = config.EXPERIENCE_AMOUNT -- want to add constant amount of xp to every player or modified?
rewards[REWARD_TYPE.EXTRA_HP] = Condition(CONDITION_ATTRIBUTES)
rewards[REWARD_TYPE.EXTRA_HP]:setParameter(CONDITION_PARAM_SUBID, 1234)
rewards[REWARD_TYPE.EXTRA_HP]:setParameter(CONDITION_PARAM_STAT_MAXHITPOINTSPERCENT, 100 + config.HP_BOOST_PERCENT)
rewards[REWARD_TYPE.EXTRA_HP]:setParameter(CONDITION_PARAM_TICKS, config.HP_BOOST_TIME * 1000)
rewards[REWARD_TYPE.EXTRA_MP] = Condition(CONDITION_ATTRIBUTES)
rewards[REWARD_TYPE.EXTRA_HP]:setParameter(CONDITION_PARAM_SUBID, 1235)
rewards[REWARD_TYPE.EXTRA_MP]:setParameter(CONDITION_PARAM_STAT_MAXMANAPOINTSPERCENT, 100 + config.MP_BOOST_PERCENT)
rewards[REWARD_TYPE.EXTRA_MP]:setParameter(CONDITION_PARAM_TICKS, config.MP_BOOST_TIME * 1000)
rewards[REWARD_TYPE.EXP_RATE] = config.EXTRA_EXP_RATE
---[ ACTION SCRIPT ]---
local act = Action()
function act.onUse(player, item, fromPosition, itemEx, toPosition)
if player:getStorageValue(config.STORAGE_LAST_USED) > os.time() then
player:sendTextMessage(MESSAGE_STATUS_SMALL, 'You can only use this chest every 24h!')
player:getPosition():sendMagicEffect(CONST_ME_POFF)
return true
end
local rewardType = math.random(1, getTableLength(REWARD_TYPE))
if not rewards[rewardType] then
player:getPosition():sendMagicEffect(CONST_ME_POFF)
player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, 'An error has occured. Contact admin.')
print('[Warning - DailyRewardChest] Unknown reward. Type ('.. rewardType ..')')
return true
end
player:setStorageValue(config.STORAGE_LAST_USED, os.time() + config.REWARD_TIME)
player:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE)
-- +EXPERIENCE --
if rewardType == REWARD_TYPE.EXPERIENCE then
player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'You have received ' .. rewards[rewardType] .. ' exp.')
player:addExperience(rewards[rewardType])
return true
end
-- EXTRA EXP RATE --
if rewardType == REWARD_TYPE.EXP_RATE then
player:setStorageValue(config.EXTRA_EXP_STORAGE, os.time() + config.EXTRA_EXP_TIME)
player:sendTextMessage(MESSAGE_EVENT_ADVANCE,
'You have received extra exp rate of +'
.. (config.EXTRA_EXP_RATE * 100) - 100
.. '% for '
.. secondsToReadable(config.EXTRA_EXP_TIME)
)
return true
end
-- ITEM --
if rewardType == REWARD_TYPE.ITEM then
local item = rewards[rewardType]
player:addItem(item[1], item[2])
player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'You have found an item.')
return true
end
-- EXTRA HP / MANA --
if rewardType == REWARD_TYPE.EXTRA_HP then
player:addCondition(rewards[rewardType])
player:sendTextMessage(
MESSAGE_EVENT_ADVANCE,
'You have received +'.. config.HP_BOOST_PERCENT ..'% health boost for '
.. secondsToReadable(config.HP_BOOST_TIME)
)
return true
end
if rewardType == REWARD_TYPE.EXTRA_MP then
player:addCondition(rewards[rewardType])
player:sendTextMessage(
MESSAGE_EVENT_ADVANCE,
'You have received +'.. config.MP_BOOST_PERCENT ..'% mana boost for '
.. secondsToReadable(config.MP_BOOST_TIME)
)
end
return true
end
act:id(2135) -- change this
act:register()
--------[ EVENTS ]--------
local ecb = EventCallback
ecb.onGainExperience = function(self, source, exp, rawExp)
if not source or source:isPlayer() then
return exp
end
if self:getStorageValue(config.EXTRA_EXP_STORAGE) < os.time() then
return exp
end
exp = exp * config.EXTRA_EXP_RATE
return exp
end
ecb:register(1)