3 elidragon.quests.list = {
6 desc = "You need ressources to build a stone generator!",
10 items = {"default:dirt", "default:dirt_with_grass"},
11 reward = "default:dirt 20",
15 desc = "Wood is one of your basic resources",
19 items = {"default:tree"},
20 reward = "default:apple 15",
23 job = "Build a stone generator",
24 desc = "Using lavacooling mechanisms to get access to cobblestone and ores! Be careful, you have only one lava bucket.",
26 parents = {"dig_dirt"},
27 action = "place_liquid",
28 items = {"default:lava_source"},
29 reward = "flowers:waterlily 3",
31 craft_wood_pickaxe = {
32 job = "Craft a wooden pickaxe",
33 desc = "You need a pickaxe to get Cobblestone.",
35 parents = {"get_wood"},
37 items = {"default:pick_wood"},
38 reward = "default:sand 5",
42 desc = "Let's get some cobble!",
44 parents = {"craft_wood_pickaxe", "build_stonegen"},
46 items = {"default:stone"},
47 reward = "default:chest_locked",
52 elidragon.savedata.quests = elidragon.savedata.quests or {}
54 elidragon.quests.active = {}
58 function elidragon.quests.complete(name, queststr)
59 local questname = string.gsub(queststr, "elidragon:", "")
60 local questdef = elidragon.quests.list[questname]
61 local player = minetest.get_player_by_name(name)
62 if not player then return end
63 elidragon.savedata.quests[name][questname] = true
65 minetest.chat_send_all(minetest.colorize("#84FFE3", name .. " has reached the goal ") .. minetest.colorize("#CF24FF", questdef.goal))
66 minetest.sound_play("elidragon_reach_goal")
68 minetest.sound_play("elidragon_finish_quest", {to_player = name})
70 player:get_inventory():add_item("main", ItemStack(questdef.reward))
71 elidragon.quests.update(name)
74 function elidragon.quests.update(name)
75 local completed_quests = elidragon.savedata.quests[name]
76 local active_quests = elidragon.quests.active[name]
77 local unlock_delay = 2
78 for questname, questdef in pairs(elidragon.quests.list) do
79 if not completed_quests[questname] and not active_quests[questname] then
81 for _, parent in pairs(questdef.parents) do
82 if not completed_quests[parent] then
88 active_quests[questname] = true
89 minetest.after(unlock_delay, function()
90 quests.start_quest(name, "elidragon:" .. questname)
91 minetest.sound_play("elidragon_new_quest", {to_player = name})
93 unlock_delay = unlock_delay + 0.5
99 function elidragon.quests.event(name, action, itemstack)
100 if not minetest.get_player_by_name(name) then return end
101 local item_name = itemstack:get_name()
102 local item_count = itemstack:get_count()
103 for questname, questdef in pairs(elidragon.quests.list) do
104 if questdef.action == action then
105 for _, item in pairs(questdef.items) do
106 if item == item_name then
107 quests.update_quest(name, "elidragon:" .. questname, item_count)
117 for questname, questdef in pairs(elidragon.quests.list) do
118 quests.register_quest("elidragon:" .. questname, {
119 title = questdef.job,
120 description = questdef.desc,
121 max = questdef.count,
123 callback = elidragon.quests.complete
129 minetest.register_on_joinplayer(function(player)
130 local name = player:get_player_name()
131 elidragon.savedata.quests[name] = elidragon.savedata.quests[name] or {}
132 elidragon.quests.active[name] = {}
133 elidragon.quests.update(name)
138 minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv)
139 elidragon.quests.event(player:get_player_name(), "craft", itemstack)
142 minetest.register_on_dignode(function(pos, oldnode, player)
143 elidragon.quests.event(player:get_player_name(), "dig", ItemStack(oldnode.name))
146 minetest.register_on_placenode(function(pos, newnode, player, oldnode, itemstack, pointed_thing)
147 elidragon.quests.event(player:get_player_name(), "place", ItemStack(newnode.name))
150 minetest.after(0, function()
151 for _, liquid in pairs(bucket.liquids) do
152 local bucket_item = minetest.registered_items[liquid.itemname]
153 local old_on_place = bucket_item.on_place
154 minetest.override_item(liquid.itemname, {
155 on_place = function(itemstack, user, pointed_thing)
156 local result = old_on_place(itemstack, user, pointed_thing)
157 if result and ItemStack(result) and ItemStack(result):get_name() == "bucket:bucket_empty" then
158 elidragon.quests.event(user:get_player_name(), "place_liquid", ItemStack(liquid.source))