Action Daily Quest (different reward every day)

Jaed Le Raep

★Gaeming★
Joined
Sep 3, 2007
Messages
1,078
Reaction score
220
This is probably the most amateur way of doing this, but I added in a minimum level requirement for the daily chest so that players can't spam make new characters. All credit to Limos for the entire script, I just added in a small parameter.

Code:
local config = {
     storage = 45392,
     exstorage = 40822,
     days = {
         ["Monday"] = {
             {itemid = 8839, count = {1, 3}}
         },
         ["Tuesday"] = {
             {itemid = 2681, count = {1}},
             {itemid = 2682, count = {1}},
             {itemid = 2683, count = {1}}
         },
         ["Wednesday"] = {
             {itemid = 2674, count = {1, 10}},
             {itemid = 2675, count = {1, 10}},
             {itemid = 2676, count = {1, 10}},
             {itemid = 2673, count = {1, 10}}
         },
         ["Thursday"] = {
             {itemid = 2679, count = {2, 15}},
             {itemid = 2680, count = {1, 5}}
         },
         ["Friday"] = {
             {itemid = 2788, count = {1, 3}}
         },
         ["Saturday"] = {
             {itemid = 6393, count = {1}}
         },
         ["Sunday"] = {
             {itemid = 2389, count = {2, 12}},
             {itemid = 2690, count = {1, 5}}
         }
     }
}



function onUse(cid, item, fromPosition, itemEx, toPosition, isHotkey)
     local player = Player(cid)
     local x = config.days[os.date("%A")]
     if player:getStorageValue(config.storage) == tonumber(os.date("%w")) and player:getStorageValue(config.exstorage) > os.time() then
         return player:sendCancelMessage("The chest is empty, come back tomorrow for a new reward.")
     end
    
    
     if getPlayerLevel(cid) < 10 then -- Edit level requirement here
         return player:sendCancelMessage("You must be level 10 in order to use this chest.")
     end
    
    
     local c = math.random(#x)
     local info, count = ItemType(x[c].itemid), x[c].count[2] and math.random(x[c].count[1], x[c].count[2]) or x[c].count[1]
     if count > 1 then
         text = count .. " " .. info:getPluralName()
     else
         text = info:getArticle() .. " " .. info:getName()
     end
     local itemx = Game.createItem(x[c].itemid, count)
     if player:addItemEx(itemx) ~= RETURNVALUE_NOERROR then
         player:getPosition():sendMagicEffect(CONST_ME_POFF)
         text = "You have found a reward weighing " .. itemx:getWeight() .. " oz. It is too heavy or you have not enough space."
     else
         text = "You have received " .. text .. "."
         player:setStorageValue(config.storage, tonumber(os.date("%w")))
         player:setStorageValue(config.exstorage, os.time() + 24*60*60)
     end
     player:sendTextMessage(MESSAGE_INFO_DESCR, text)
     return true
end
 

beenii

Intermediate OT User
Joined
Jul 26, 2010
Messages
421
Reaction score
11
Tested with TFS 1.0 and TFS 1.1





Every day people can get a different reward from the chest, which reward depens on which day it is.
You can add 1 or more items to 1 day. With more items people will get 1 of those items randomly so they won't always get the same item on a certain day.
It can be used in an actual quest so people can do it more often to get more rewards or be a part of something where people need certain items.


actions.xml
Code:
<action uniqueid="3001" script="quests/dailyquest.lua"/>

dailyquest.lua
Code:
local config = {
     storage = 45392,
     exstorage = 40822,
     days = {
         ["Monday"] = {
             {itemid = 8839, count = {1, 3}}
         },
         ["Tuesday"] = {
             {itemid = 2681, count = {1}},
             {itemid = 2682, count = {1}},
             {itemid = 2683, count = {1}}
         },
         ["Wednesday"] = {
             {itemid = 2674, count = {1, 10}},
             {itemid = 2675, count = {1, 10}},
             {itemid = 2676, count = {1, 10}},
             {itemid = 2673, count = {1, 10}}
         },
         ["Thursday"] = {
             {itemid = 2679, count = {2, 15}},
             {itemid = 2680, count = {1, 5}}
         },
         ["Friday"] = {
             {itemid = 2788, count = {1, 3}}
         },
         ["Saturday"] = {
             {itemid = 6393, count = {1}}
         },
         ["Sunday"] = {
             {itemid = 2389, count = {2, 12}},
             {itemid = 2690, count = {1, 5}}
         }
     }
}

function onUse(cid, item, fromPosition, itemEx, toPosition, isHotkey)
     local player = Player(cid)
     local x = config.days[os.date("%A")]
     if player:getStorageValue(config.storage) == tonumber(os.date("%w")) and player:getStorageValue(config.exstorage) > os.time() then
         return player:sendCancelMessage("The chest is empty, come back tomorrow for a new reward.")
     end
     local c = math.random(#x)
     local info, count = ItemType(x[c].itemid), x[c].count[2] and math.random(x[c].count[1], x[c].count[2]) or x[c].count[1]
     if count > 1 then
         text = count .. " " .. info:getPluralName()
     else
         text = info:getArticle() .. " " .. info:getName()
     end
     local itemx = Game.createItem(x[c].itemid, count)
     if player:addItemEx(itemx) ~= RETURNVALUE_NOERROR then
         player:getPosition():sendMagicEffect(CONST_ME_POFF)
         text = "You have found a reward weighing " .. itemx:getWeight() .. " oz. It is too heavy or you have not enough space."
     else
         text = "You have received " .. text .. "."
         player:setStorageValue(config.storage, tonumber(os.date("%w")))
         player:setStorageValue(config.exstorage, os.time() + 24*60*60)
     end
     player:sendTextMessage(MESSAGE_INFO_DESCR, text)
     return true
end
For older versions: [Lua] Daily Quest - Pastebin.com

how add multiples items on reward?
 

demon088

#088 in the Horde
Joined
Jun 17, 2009
Messages
140
Reaction score
10
Location
Hell
Instead of week days, can it be accumulable through the days? I like this script so much, thanks!
 

LIINDI

Member
Joined
Mar 14, 2018
Messages
65
Reaction score
2
Are you supposed to map/spawn in the chest or does it appear randomly everyday?
Also how do you know when you got the quest to do it? Will it appear in quest log?

Cool script.
Thanks!
 

StreamSide

Joseluis Gonzalez
Support Team
Joined
Aug 31, 2007
Messages
3,211
Reaction score
750
Location
Arica - Chile
Are you supposed to map/spawn in the chest or does it appear randomly everyday?
Also how do you know when you got the quest to do it? Will it appear in quest log?

Cool script.
Thanks!
daily quest means a quest that change his content daily, also quest logs reads storage values so yay, you can make them appear in qlog.
 

LIINDI

Member
Joined
Mar 14, 2018
Messages
65
Reaction score
2
daily quest means a quest that change his content daily, also quest logs reads storage values so yay, you can make them appear in qlog.
Yeah i understand that but how do people know where the chest will spawn & know how to do the quest if the questlog is inactive? :)
 

StreamSide

Joseluis Gonzalez
Support Team
Joined
Aug 31, 2007
Messages
3,211
Reaction score
750
Location
Arica - Chile
Yeah i understand that but how do people know where the chest will spawn & know how to do the quest if the questlog is inactive? :)
I think you dont understand the code, the chest will never spawn is some position, its an action script so you should set the action/unique id to the chest somehow. why would they know how to do the quest via questlog? And why questlog would be inactive?
 

LIINDI

Member
Joined
Mar 14, 2018
Messages
65
Reaction score
2
I think you dont understand the code, the chest will never spawn is some position, its an action script so you should set the action/unique id to the chest somehow. why would they know how to do the quest via questlog? And why questlog would be inactive?
Haha yeah probably i don't lol. I have the chest as 3001 like original one. Should i now maybe add the chest via map editor somewhere on the map and set it as uniqueID 3001? Trying to learn how to implement it onto my server! =)
 
Top