]> git.lizzy.rs Git - elidragon.git/blob - quests.lua
Merge pull request #4 from HimbeerserverDE/master
[elidragon.git] / quests.lua
1 elidragon.quests = {}
2
3 elidragon.quests.list = {
4         dig_dirt = {
5                 job = "Dig Dirt",
6                 desc = "dig 10 x default:dirt or default:dirt_with_grass",
7                 count = 10,
8                 parents = {},
9                 action = "dig",
10                 items = {"default:dirt", "default:dirt_with_grass"},
11                 reward = "default:dirt 20",
12         },
13         get_wood = {
14                 job = "Get Wood",
15                 desc = "dig 5 x default:wood",
16                 count = 5,
17                 parents = {},
18                 action = "dig",
19                 items = {"default:tree"},
20                 reward = "default:apple 15",
21         },
22         build_stonegen = {
23                 job = "Build a stone generator",
24                 desc = "place default:lava_source using a bucket",
25                 count = 1,
26                 parents = {"dig_dirt"},
27                 action = "place_liquid",
28                 items = {"default:lava_source"},
29                 reward = "flowers:waterlily 3",
30         },
31         craft_wood_pickaxe = {
32                 job = "Craft a wooden pickaxe",
33                 desc = "craft default:pick_wood",
34                 count = 1,
35                 parents = {"get_wood"},
36                 action = "craft",
37                 items = {"default:pick_wood"},
38                 reward = "default:sand 5",
39         },
40         dig_cobble = {
41                 job = "Dig Stone",
42                 desc = "dig 10 x default:stone",
43                 count = 10,
44                 parents = {"craft_wood_pickaxe", "build_stonegen"},
45                 action = "dig",
46                 items = {"default:stone"},
47                 reward = "default:chest_locked",
48                 goal = "Stone Age",
49         },
50         craft_stone_pick = {
51                 job = "Craft a Stone Pickaxe",
52                 desc = "craft default:pick_stone",
53                 count = 1,
54                 parents = {"dig_cobble"},
55                 action = "craft",
56                 items = {"default:pick_stone"},
57                 reward = "default:iron_lump",
58         },
59         craft_stone_axe = {
60                 job = "Craft a Stone Axe",
61                 desc = "craft default:axe_stone",
62                 count = 1,
63                 parents = {"craft_stone_pick"},
64                 action = "craft",
65                 items = {"default:axe_stone"},
66                 reward = "default:iron_lump",
67         },
68         craft_stone_shovel = {
69                 job = "Craft a Stone Shovel",
70                 desc = "craft default:shovel_stone",
71                 count = 1,
72                 parents = {"dig_cobble"},
73                 action = "craft",
74                 items = {"default:shovel_stone"},
75                 reward = "default:iron_lump",
76         },
77         craft_stone_sword = {
78                 job = "Craft a stone sword",
79                 desc = "craft default:sword_stone",
80                 count = 1,
81                 parents = {"craft_stone_shovel", "craft_stone_axe"},
82                 action = "craft",
83                 items = {"default:sword_stone"},
84                 reward = "default:iron_lump",
85                 goal = "Full Toolset",
86         },
87         craft_iron_pickaxe = {
88                 job = "Make an Iron Pick",
89                 desc = "craft default:pick_steel",
90                 count = 1,
91                 parents = {"craft_stone_pick", "craft_furnace"},
92                 action = "craft",
93                 items = {"default:pick_steel"},
94                 reward = "default:dirt 25",
95         },
96         craft_dirt = {
97                 job = "Craft some dirt!",
98                 desc = "craft 99 x default:dirt",
99                 count = 99,
100                 parents = {"craft_stone_sword"},
101                 action = "craft",
102                 items = {"default:dirt"},
103                 reward = "protector:protect 5",
104         },
105         craft_furnace = {
106                 job = "Make a furnace",
107                 desc = "craft default:furnace",
108                 count = 1,
109                 parents = {"dig_cobble"},
110                 action = "craft",
111                 items = {"default:furnace"},
112                 reward = "default:coal_lump 5",
113         },
114 }
115
116 elidragon.quests.active = {}
117
118 -- functions
119
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")
130         else
131                 minetest.sound_play("elidragon_finish_quest", {to_player = name})
132         end
133         player:get_inventory():add_item("main", ItemStack(questdef.reward))
134         elidragon.quests.update(name)
135 end
136
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
146                         local unlock = true
147                         for _, parent in pairs(questdef.parents) do
148                                 if not minetest.is_yes(meta:get_string("elidragon:" .. parent)) then
149                                         unlock = false
150                                         break
151                                 end
152                         end
153                         if unlock 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})
158                                 end)
159                                 unlock_delay = unlock_delay + 0.5
160                         end
161                 end
162         end
163 end
164
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)
174                                 end
175                                 break
176                         end
177                 end
178         end
179 end
180
181 -- register quests
182
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,
188                 autoaccept = true,
189                 callback = elidragon.quests.complete
190         })
191 end
192
193 -- startup
194
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)
200 end)
201
202 -- callbacks
203
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)
207 end)
208
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))
212 end)
213
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))
217 end)
218
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))
228                                 end
229                                 return result
230                         end
231                 })
232         end
233 end)