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.quests.active = {}
120 function elidragon.quests.complete(name, queststr)
121 local questname = string.gsub(queststr, "elidragon:", "")
122 local questdef = elidragon.quests.list[questname]
123 local player = minetest.get_player_by_name(name)
124 if not player then return end
125 local meta = player:get_meta()
126 meta:set_string(queststr, "true")
127 if questdef.goal then
128 minetest.chat_send_all(minetest.colorize("#84FFE3", name .. " has reached the goal ") .. minetest.colorize("#CF24FF", questdef.goal))
129 minetest.sound_play("elidragon_reach_goal")
131 minetest.sound_play("elidragon_finish_quest", {to_player = name})
133 player:get_inventory():add_item("main", ItemStack(questdef.reward))
134 elidragon.quests.update(name)
137 function elidragon.quests.update(name)
138 local player = minetest.get_player_by_name(name)
139 if not player then return end
140 local meta = player:get_meta()
141 local active_quests = elidragon.quests.active[name]
142 local unlock_delay = 2
143 for questname, questdef in pairs(elidragon.quests.list) do
144 local queststr = "elidragon:" .. questname
145 if not active_quests[questname] and not minetest.is_yes(meta:get_string(queststr)) then
147 for _, parent in pairs(questdef.parents) do
148 if not minetest.is_yes(meta:get_string("elidragon:" .. parent)) then
154 active_quests[questname] = true
155 minetest.after(unlock_delay, function()
156 quests.start_quest(name, queststr)
157 minetest.sound_play("elidragon_new_quest", {to_player = name})
159 unlock_delay = unlock_delay + 0.5
165 function elidragon.quests.event(name, action, itemstack)
166 if not minetest.get_player_by_name(name) then return end
167 local item_name = itemstack:get_name()
168 local item_count = itemstack:get_count()
169 for questname, questdef in pairs(elidragon.quests.list) do
170 if questdef.action == action then
171 for _, item in pairs(questdef.items) do
172 if item == item_name then
173 quests.update_quest(name, "elidragon:" .. questname, item_count)
183 for questname, questdef in pairs(elidragon.quests.list) do
184 quests.register_quest("elidragon:" .. questname, {
185 title = questdef.job,
186 description = questdef.desc,
187 max = questdef.count,
189 callback = elidragon.quests.complete
195 minetest.register_on_joinplayer(function(player)
196 local name = player:get_player_name()
197 elidragon.quests.active[name] = {}
198 elidragon.quests.update(name)
199 quests.show_hud(name, true)
204 minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv)
205 if not player then return end
206 elidragon.quests.event(player:get_player_name(), "craft", itemstack)
209 minetest.register_on_dignode(function(pos, oldnode, player)
210 if not player then return end
211 elidragon.quests.event(player:get_player_name(), "dig", ItemStack(oldnode.name))
214 minetest.register_on_placenode(function(pos, newnode, player, oldnode, itemstack, pointed_thing)
215 if not player then return end
216 elidragon.quests.event(player:get_player_name(), "place", ItemStack(newnode.name))
219 minetest.after(0, function()
220 for _, liquid in pairs(bucket.liquids) do
221 local bucket_item = minetest.registered_items[liquid.itemname]
222 local old_on_place = bucket_item.on_place
223 minetest.override_item(liquid.itemname, {
224 on_place = function(itemstack, user, pointed_thing)
225 local result = old_on_place(itemstack, user, pointed_thing)
226 if result and ItemStack(result) and ItemStack(result):get_name() == "bucket:bucket_empty" then
227 elidragon.quests.event(user:get_player_name(), "place_liquid", ItemStack(liquid.source))