3 elidragon.quests.list = {
6 desc = "dig 10 x default:dirt or default:dirt_with_grass",
10 items = {"default:dirt", "default:dirt_with_grass"},
11 reward = "default:dirt 20",
15 desc = "dig 5 x default:wood",
19 items = {"default:tree"},
20 reward = "default:apple 15",
23 job = "Build a stone generator",
24 desc = "place default:lava_source using a 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 = "craft default:pick_wood",
35 parents = {"get_wood"},
37 items = {"default:pick_wood"},
38 reward = "default:sand 5",
42 desc = "dig 10 x default:stone",
44 parents = {"craft_wood_pickaxe", "build_stonegen"},
46 items = {"default:stone"},
47 reward = "default:chest_locked",
51 job = "Craft a Stone Pickaxe",
52 desc = "craft default:pick_stone",
54 parents = {"dig_cobble"},
56 items = {"default:pick_stone"},
57 reward = "default:iron_lump",
60 job = "Craft a Stone Axe",
61 desc = "craft default:axe_stone",
63 parents = {"craft_stone_pick"},
65 items = {"default:axe_stone"},
66 reward = "default:iron_lump",
68 craft_stone_shovel = {
69 job = "Craft a Stone Shovel",
70 desc = "craft default:shovel_stone",
72 parents = {"dig_cobble"},
74 items = {"default:shovel_stone"},
75 reward = "default:iron_lump",
78 job = "Craft a stone sword",
79 desc = "craft default:sword_stone",
81 parents = {"craft_stone_shovel", "craft_stone_axe"},
83 items = {"default:sword_stone"},
84 reward = "default:iron_lump",
85 goal = "Full Toolset",
87 craft_iron_pickaxe = {
88 job = "Make an Iron Pick",
89 desc = "craft default:pick_steel",
91 parents = {"craft_stone_pick", "craft_furnace"},
93 items = {"default:pick_steel"},
94 reward = "default:dirt 25",
97 job = "Craft some dirt!",
98 desc = "craft 99 x default:dirt",
100 parents = {"craft_stone_sword"},
102 items = {"default:dirt"},
103 reward = "protector:protect 5",
106 job = "Make a furnace",
107 desc = "craft default:furnace",
109 parents = {"dig_cobble"},
111 items = {"default:furnace"},
112 reward = "default:coal_lump 5",
116 elidragon.savedata.quests = elidragon.savedata.quests or {}
118 elidragon.quests.active = {}
122 function elidragon.quests.complete(name, queststr)
123 local questname = string.gsub(queststr, "elidragon:", "")
124 local questdef = elidragon.quests.list[questname]
125 local player = minetest.get_player_by_name(name)
126 if not player then return end
127 elidragon.savedata.quests[name][questname] = true
128 if questdef.goal then
129 minetest.chat_send_all(minetest.colorize("#84FFE3", name .. " has reached the goal ") .. minetest.colorize("#CF24FF", questdef.goal))
130 minetest.sound_play("elidragon_reach_goal")
132 minetest.sound_play("elidragon_finish_quest", {to_player = name})
134 player:get_inventory():add_item("main", ItemStack(questdef.reward))
135 elidragon.quests.update(name)
138 function elidragon.quests.update(name)
139 local completed_quests = elidragon.savedata.quests[name]
140 local active_quests = elidragon.quests.active[name]
141 local unlock_delay = 2
142 for questname, questdef in pairs(elidragon.quests.list) do
143 if not completed_quests[questname] and not active_quests[questname] then
145 for _, parent in pairs(questdef.parents) do
146 if not completed_quests[parent] then
152 active_quests[questname] = true
153 minetest.after(unlock_delay, function()
154 quests.start_quest(name, "elidragon:" .. questname)
155 minetest.sound_play("elidragon_new_quest", {to_player = name})
157 unlock_delay = unlock_delay + 0.5
163 function elidragon.quests.event(name, action, itemstack)
164 if not minetest.get_player_by_name(name) then return end
165 local item_name = itemstack:get_name()
166 local item_count = itemstack:get_count()
167 for questname, questdef in pairs(elidragon.quests.list) do
168 if questdef.action == action then
169 for _, item in pairs(questdef.items) do
170 if item == item_name then
171 quests.update_quest(name, "elidragon:" .. questname, item_count)
181 for questname, questdef in pairs(elidragon.quests.list) do
182 quests.register_quest("elidragon:" .. questname, {
183 title = questdef.job,
184 description = questdef.desc,
185 max = questdef.count,
187 callback = elidragon.quests.complete
193 minetest.register_on_joinplayer(function(player)
194 local name = player:get_player_name()
195 elidragon.savedata.quests[name] = elidragon.savedata.quests[name] or {}
196 elidragon.quests.active[name] = {}
197 elidragon.quests.update(name)
198 quests.show_hud(name, true)
203 minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv)
204 if not player then return end
205 elidragon.quests.event(player:get_player_name(), "craft", itemstack)
208 minetest.register_on_dignode(function(pos, oldnode, player)
209 if not player then return end
210 elidragon.quests.event(player:get_player_name(), "dig", ItemStack(oldnode.name))
213 minetest.register_on_placenode(function(pos, newnode, player, oldnode, itemstack, pointed_thing)
214 if not player then return end
215 elidragon.quests.event(player:get_player_name(), "place", ItemStack(newnode.name))
218 minetest.after(0, function()
219 for _, liquid in pairs(bucket.liquids) do
220 local bucket_item = minetest.registered_items[liquid.itemname]
221 local old_on_place = bucket_item.on_place
222 minetest.override_item(liquid.itemname, {
223 on_place = function(itemstack, user, pointed_thing)
224 local result = old_on_place(itemstack, user, pointed_thing)
225 if result and ItemStack(result) and ItemStack(result):get_name() == "bucket:bucket_empty" then
226 elidragon.quests.event(user:get_player_name(), "place_liquid", ItemStack(liquid.source))