Action Daily Quest (different reward every day)

Jaed Le Raep

★Gaeming★
Joined
Sep 3, 2007
Messages
1,077
Best answers
0
Likes
219
#41
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
 
Joined
Jul 26, 2010
Messages
417
Best answers
1
Likes
11
#42
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
135
Best answers
3
Likes
10
Location
Hell
#43
Instead of week days, can it be accumulable through the days? I like this script so much, thanks!
 
Joined
Mar 14, 2018
Messages
65
Best answers
1
Likes
2
#44
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
Joined
Aug 31, 2007
Messages
3,082
Best answers
18
Likes
685
Location
Arica - Chile
#45
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.
 
Joined
Mar 14, 2018
Messages
65
Best answers
1
Likes
2
#46
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
Joined
Aug 31, 2007
Messages
3,082
Best answers
18
Likes
685
Location
Arica - Chile
#47
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?
 
Joined
Mar 14, 2018
Messages
65
Best answers
1
Likes
2
#48
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