]> git.lizzy.rs Git - default.git/blob - init.lua
Fixed dirt with Snow
[default.git] / init.lua
1 local aliases = {
2         ["chest"] = "mcl_chests:chest",
3         ["chest_locked"] = "mcl_chests:chest",
4         ["blueberries"] = "mcl_farming:beetroot",
5         ["book"] = "mcl_books:book",
6         ["written_book"] = "mcl_books:book_written",
7         ["bronze_ingot"] = "mcl_core:iron_ingot",
8         ["clay_brick"] = "mcl_core:brick",
9         ["clay_lump"] = "mcl_core:clay_lump",
10         ["coal_lump"] = "mcl_core:coal_lump",
11         ["copper_ingot"] = "mcl_core:iron_ingot",
12         ["copper_lump"] = "mcl_core:stone_with_iron",
13         ["diamond"] = "mcl_core:diamond",
14         ["flint"] = "mcl_core:flint",
15         ["gold_ingot"] = "mcl_core:gold_ingot",
16         ["gold_lump"] = "mcl_core:stone_with_gold",
17         ["iron_lump"] = "mcl_core:stone_with_iron",
18         ["mese_crystal"] = "mcl_core:gold_ingot",
19         ["mese_crystal_fragment"] = "mcl_core:gold_nugget",
20         ["obsidian_shard"] = "mcl_core:obsidian",
21         ["paper"] = "mcl_core:paper",   
22         ["steel_ingot"] = "mcl_core:iron_ingot",
23         ["stick"] = "mcl_core:stick",
24         ["tin_ingot"] = "mcl_core:iron_ingot",
25         ["tin_lump"] = "mcl_core:stone_with_iron",
26         ["stone"] = "mcl_core:stone",
27         ["cobble"] = "mcl_core:cobble",
28         ["stonebrick"] = "mcl_core:stonebrick",
29         ["stone_block"] = "mcl_core:stonebrick",
30         ["mossycobble"] = "mcl_core:mossycobble",
31         ["desert_stone"] = "mcl_core:redsandstone",
32         ["desert_cobble"] = "mcl_core:redsandstone",
33         ["desert_stonebrick"] = "mcl_core:redsandstonecarved",
34         ["desert_stone_block"] = "mcl_core:redsandstonecarved",
35         ["sandstone"] = "mcl_core:sandstone",
36         ["sandstonebrick"] = "mcl_core:sandstonecarved",
37         ["sandstone_block"] = "mcl_core:sandstonecarved",
38         ["desert_sandstone"] = "mcl_core:redsandstone",
39         ["desert_sandstone_brick"] = "mcl_core:redsandstonecarved",
40         ["desert_sandstone_block"] = "mcl_core:redsandstonecarved",
41         ["silver_sandstone"] = "mcl_core:sandstone",
42         ["silver_sandstonebrick"] = "mcl_core:sandstonecarved",
43         ["silver_sandstone_block"] = "mcl_core:sandstonecarved",
44         ["obsidian"] = "mcl_core:obsidian",
45         ["obsidianbrick"] = "mcl_core:obsidian",
46         ["obsidian_block"] = "mcl_core:obsidian",
47         ["dirt"] = "mcl_core:dirt",
48         ["dirt_with_grass"] = "mcl_core:dirt_with_grass",
49         ["dirt_with_grass_footsteps"] = "mcl_core:dirt_with_grass",
50         ["dirt_with_dry_grass"] = "mcl_core:dirt_with_grass",
51         ["dirt_with_snow"] = "mcl_core:dirt_with_grass_snow",
52         ["dirt_with_rainforest_litter"] = "mcl_core:dirt_with_grass",
53         ["dirt_with_coniferous_litter"] = "mcl_core:dirt_with_grass",
54         ["dry_dirt"] = "mcl_core:dirt",
55         ["dry_dirt_with_dry_grass"] = "mcl_core:dirt_with_grass",
56         ["permafrost"] = "mcl_core:stone",
57         ["permafrost_with_stones"] = "mcl_core:stone",
58         ["permafrost_with_moss"] = "mcl_core:stone",
59         ["sand"] = "mcl_core:sand",
60         ["desert_sand"] = "mcl_core:redsand",
61         ["silver_sand"] = "mcl_core:sand",
62         ["gravel"] = "mcl_core:gravel",
63         ["clay"] = "mcl_core:clay",
64         ["snow"] = "mcl_core:snow",
65         ["snowblock"] = "mcl_core:snowblock",
66         ["ice"] = "mcl_core:ice",
67         ["cave_ice"] = "mcl_core:packed_ice",
68         ["tree"] = "mcl_core:tree",
69         ["wood"] = "mcl_core:wood",
70         ["leaves"] = "mcl_core:leaves",
71         ["sapling"] = "mcl_core:sapling",
72         ["apple"] = "mcl_core:apple",
73         ["jungletree"] = "mcl_core:jungletree",
74         ["junglewood"] = "mcl_core:junglewood",
75         ["jungleleaves"] = "mcl_core:jungleleaves",
76         ["junglesapling"] = "mcl_core:junglesapling",
77         ["emergent_jungle_sapling"] = "mcl_core:junglesapling",
78         ["pine_tree"] = "mcl_core:sprucetree",
79         ["pine_wood"] = "mcl_core:sprucewood",
80         ["pine_needles"] = "mcl_core:spruceleaves",
81         ["pine_sapling"] = "mcl_core:sprucesapling",
82         ["acacia_tree"] = "mcl_core:acaciatree",
83         ["acacia_wood"] = "mcl_core:acaciawood",
84         ["acacia_leaves"] = "mcl_core:acacialeaves",
85         ["acacia_sapling"] = "mcl_core:acaciasapling",  
86         ["aspen_tree"] = "mcl_core:birchtree",
87         ["aspen_wood"] = "mcl_core:birchwood",
88         ["aspen_leaves"] = "mcl_core:birchleaves",
89         ["aspen_sapling"] = "mcl_core:birchsapling",
90         ["stone_with_coal"] = "mcl_core:stone_with_coal",
91         ["coalblock"] = "mcl_core:coalblock",
92         ["stone_with_iron"] = "mcl_core:stone_with_iron",
93         ["steelblock"] = "mcl_core:ironblock",
94         ["stone_with_copper"] = "mcl_core:stone_with_iron",
95         ["copperblock"] = "mcl_core:ironblock",
96         ["stone_with_tin"] = "mcl_core:stone_with_iron",
97         ["tinblock"] = "mcl_core:ironblock",
98         ["bronzeblock"] = "mcl_core:ironblock",
99         ["stone_with_gold"] = "mcl_core:stone_with_gold",
100         ["goldblock"] = "mcl_core:goldblock",   
101         ["stone_with_mese"] = "mcl_core:stone_with_gold",
102         ["mese"] = "mcl_core:goldblock",
103         ["stone_with_diamond"] = "mcl_core:stone_with_iron",
104         ["cactus"] = "mcl_core:cactus", 
105         ["large_cactus_seedling"] = "mcl_core:cactus",  
106         ["papyrus"] = "mcl_core:reeds", 
107         ["dry_shrub"] = "mcl_core:deadbush",
108         ["junglegrass"] = "mcl_flowers:double_tallgrass",
109         ["grass_1"] = "mcl_flowers:tallgrass",
110         ["grass_2"] = "mcl_flowers:tallgrass",
111         ["grass_3"] = "mcl_flowers:tallgrass",
112         ["grass_4"] = "mcl_flowers:tallgrass",
113         ["grass_5"] = "mcl_flowers:tallgrass",
114         ["dry_grass_1"] = "mcl_flowers:tallgrass",
115         ["dry_grass_2"] = "mcl_flowers:tallgrass",
116         ["dry_grass_3"] = "mcl_flowers:tallgrass",
117         ["dry_grass_4"] = "mcl_flowers:tallgrass",
118         ["dry_grass_5"] = "mcl_flowers:tallgrass",
119         ["fern_1"] = "mcl_flowers:fern",
120         ["fern_2"] = "mcl_flowers:fern",
121         ["fern_3"] = "mcl_flowers:fern",
122         ["marram_grass_1"] = "mcl_flowers:tallgrass",
123         ["marram_grass_2"] = "mcl_flowers:tallgrass",
124         ["marram_grass_3"] = "mcl_flowers:tallgrass",   
125         ["bush_stem"] = "mcl_core:tree",
126         ["bush_leaves"] = "mcl_core:leaves",
127         ["bush_sapling"] = "mcl_core:sapling",
128         ["acacia_bush_stem"] = "mcl_core:acaciatree",
129         ["acacia_bush_leaves"] = "mcl_core:acacialeaves",
130         ["acacia_bush_sapling"] = "mcl_core:acaciasapling",
131         ["pine_bush_stem"] = "mcl_core:sprucetree",
132         ["pine_bush_leaves"] = "mcl_core:spruceleaves",
133         ["pine_bush_sapling"] = "mcl_core:sprucesapling",
134         ["blueberry_bush_leaves_with_berries"] = "mcl_core:leaves",
135         ["blueberry_bush_leaves"] = "mcl_core:leaves",
136         ["blueberry_bush_sapling"] = "mcl_core:sapling",
137         ["sand_with_kelp"] = "mcl_ocean:kelp_sand",
138         ["coral_brown"] = "mcl_wool:brown",
139         ["coral_orange"] = "mcl_wool:orange",
140         ["coral_skeleton"] = "mcl_wool:white",
141         ["water_source"] = "mcl_core:water_source",
142         ["water_flowing"] = "mcl_core:water_flowing",
143         ["river_water_source"] = "mclx_core:river_water_source",
144         ["river_water_flowing"] = "mclx_core:river_water_flowing",
145         ["lava_source"] = "mcl_core:lava_source",
146         ["lava_flowing"] = "mcl_core:lava_flowing",
147         ["bookshelf"] = "mcl_books:bookshelf",
148         ["sign_wall_wood"] = "mcl_signs:sign_wall",
149         ["sign_wall_steel"] = "mcl_signs:sign_wall",
150         ["ladder_wood"] = "mcl_signs:ladder",
151         ["ladder_steel"] = "mcl_signs:ladder",
152         ["fence_wood"] = "mcl_fences:fence",
153         ["fence_acacia_wood"] = "mcl_fences:fence_acacia",
154         ["fence_junglewood"] = "mcl_fences:fence_jungle",
155         ["fence_pine_wood"] = "mcl_fences:fence_spruce",
156         ["fence_aspen_wood"] = "mcl_fences:fence_birch",
157         ["fence_rail_wood"] = "mcl_fences:fence",
158         ["fence_rail_acacia_wood"] = "mcl_fences:fence_acacia",
159         ["fence_rail_junglewood"] = "mcl_fences:fence_jungle",
160         ["fence_rail_pine_wood"] = "mcl_fences:fence_spruce",
161         ["fence_rail_aspen_wood"] = "mcl_fences:fence_birch",
162         ["glass"] = "mcl_core:glass",
163         ["obsidian_glass"] = "mcl_core:glass",
164         ["brick"] = "mcl_core:brick",
165         ["meselamp"] = "mcl_nether:glowstone",
166         ["mese_post_light"] = "mcl_nether:glowstone",
167         ["cloud"] = "mcl_core:bedrock",
168         ["pick_wood"] = "mcl_tools:pick_wood",
169         ["pick_stone"] = "mcl_tools:pick_stone",
170         ["pick_steel"] = "mcl_tools:pick_iron",
171         ["pick_bronze"] = "mcl_tools:pick_iron",
172         ["pick_mese"] = "mcl_tools:pick_gold",
173         ["pick_diamond"] = "mcl_tools:pick_diamond",
174         ["shovel_wood"] = "mcl_tools:shovel_wood",
175         ["shovel_stone"] = "mcl_tools:shovel_stone",
176         ["shovel_steel"] = "mcl_tools:shovel_iron",
177         ["shovel_bronze"] = "mcl_tools:shovel_iron",
178         ["shovel_mese"] = "mcl_tools:shovel_gold",
179         ["shovel_diamond"] = "mcl_tools:shovel_diamond",
180         ["axe_wood"] = "mcl_tools:axe_wood",
181         ["axe_stone"] = "mcl_tools:axe_stone",
182         ["axe_steel"] = "mcl_tools:axe_iron",
183         ["axe_bronze"] = "mcl_tools:axe_iron",
184         ["axe_mese"] = "mcl_tools:axe_gold",
185         ["axe_diamond"] = "mcl_tools:axe_diamond",
186         ["sword_wood"] = "mcl_tools:sword_wood",
187         ["sword_stone"] = "mcl_tools:sword_stone",
188         ["sword_steel"] = "mcl_tools:sword_iron",
189         ["sword_bronze"] = "mcl_tools:sword_iron",
190         ["sword_mese"] = "mcl_tools:sword_gold",
191         ["sword_diamond"] = "mcl_tools:sword_diamond",
192         ["key"] = "mcl_clock:clock",
193         ["torch"] = "mcl_torches:torch",
194         ["torch_wall"] = "mcl_torches:torch_wall",
195         ["torch_ceiling"] = "mcl_torches:torch",
196 }
197 for k, v in pairs(aliases) do
198         minetest.register_alias("default:" .. k, v)
199 end
200
201 default = {}
202
203 --
204 -- Functions
205 --
206
207
208 --
209 -- Sounds
210 --
211
212 function default.node_sound_defaults(table)
213         table = table or {}
214         table.footstep = table.footstep or
215                         {name = "", gain = 1.0}
216         table.dug = table.dug or
217                         {name = "default_dug_node", gain = 0.25}
218         table.place = table.place or
219                         {name = "default_place_node_hard", gain = 1.0}
220         return table
221 end
222
223 function default.node_sound_stone_defaults(table)
224         table = table or {}
225         table.footstep = table.footstep or
226                         {name = "default_hard_footstep", gain = 0.3}
227         table.dug = table.dug or
228                         {name = "default_hard_footstep", gain = 1.0}
229         default.node_sound_defaults(table)
230         return table
231 end
232
233 function default.node_sound_dirt_defaults(table)
234         table = table or {}
235         table.footstep = table.footstep or
236                         {name = "default_dirt_footstep", gain = 0.4}
237         table.dug = table.dug or
238                         {name = "default_dirt_footstep", gain = 1.0}
239         table.place = table.place or
240                         {name = "default_place_node", gain = 1.0}
241         default.node_sound_defaults(table)
242         return table
243 end
244
245 function default.node_sound_sand_defaults(table)
246         table = table or {}
247         table.footstep = table.footstep or
248                         {name = "default_sand_footstep", gain = 0.12}
249         table.dug = table.dug or
250                         {name = "default_sand_footstep", gain = 0.24}
251         table.place = table.place or
252                         {name = "default_place_node", gain = 1.0}
253         default.node_sound_defaults(table)
254         return table
255 end
256
257 function default.node_sound_gravel_defaults(table)
258         table = table or {}
259         table.footstep = table.footstep or
260                         {name = "default_gravel_footstep", gain = 0.4}
261         table.dug = table.dug or
262                         {name = "default_gravel_footstep", gain = 1.0}
263         table.place = table.place or
264                         {name = "default_place_node", gain = 1.0}
265         default.node_sound_defaults(table)
266         return table
267 end
268
269 function default.node_sound_wood_defaults(table)
270         table = table or {}
271         table.footstep = table.footstep or
272                         {name = "default_wood_footstep", gain = 0.3}
273         table.dug = table.dug or
274                         {name = "default_wood_footstep", gain = 1.0}
275         default.node_sound_defaults(table)
276         return table
277 end
278
279 function default.node_sound_leaves_defaults(table)
280         table = table or {}
281         table.footstep = table.footstep or
282                         {name = "default_grass_footstep", gain = 0.45}
283         table.dug = table.dug or
284                         {name = "default_grass_footstep", gain = 0.7}
285         table.place = table.place or
286                         {name = "default_place_node", gain = 1.0}
287         default.node_sound_defaults(table)
288         return table
289 end
290
291 function default.node_sound_glass_defaults(table)
292         table = table or {}
293         table.footstep = table.footstep or
294                         {name = "default_glass_footstep", gain = 0.3}
295         table.dig = table.dig or
296                         {name = "default_glass_footstep", gain = 0.5}
297         table.dug = table.dug or
298                         {name = "default_break_glass", gain = 1.0}
299         default.node_sound_defaults(table)
300         return table
301 end
302
303 function default.node_sound_metal_defaults(table)
304         table = table or {}
305         table.footstep = table.footstep or
306                         {name = "default_metal_footstep", gain = 0.4}
307         table.dig = table.dig or
308                         {name = "default_dig_metal", gain = 0.5}
309         table.dug = table.dug or
310                         {name = "default_dug_metal", gain = 0.5}
311         table.place = table.place or
312                         {name = "default_place_node_metal", gain = 0.5}
313         default.node_sound_defaults(table)
314         return table
315 end
316
317 function default.node_sound_water_defaults(table)
318         table = table or {}
319         table.footstep = table.footstep or
320                         {name = "default_water_footstep", gain = 0.2}
321         default.node_sound_defaults(table)
322         return table
323 end
324
325 function default.node_sound_snow_defaults(table)
326         table = table or {}
327         table.footstep = table.footstep or
328                         {name = "default_snow_footstep", gain = 0.2}
329         table.dig = table.dig or
330                         {name = "default_snow_footstep", gain = 0.3}
331         table.dug = table.dug or
332                         {name = "default_snow_footstep", gain = 0.3}
333         table.place = table.place or
334                         {name = "default_place_node", gain = 1.0}
335         default.node_sound_defaults(table)
336         return table
337 end
338
339 --
340 -- Optimized helper to put all items in an inventory into a drops list
341 --
342
343 function default.get_inventory_drops(pos, inventory, drops)
344         local inv = minetest.get_meta(pos):get_inventory()
345         local n = #drops
346         for i = 1, inv:get_size(inventory) do
347                 local stack = inv:get_stack(inventory, i)
348                 if stack:get_count() > 0 then
349                         drops[n+1] = stack:to_table()
350                         n = n + 1
351                 end
352         end
353 end
354
355
356 --
357 -- Papyrus and cactus growing
358 --
359
360 -- Wrapping the functions in ABM action is necessary to make overriding them possible
361
362 function default.grow_cactus(pos, node)
363         if node.param2 >= 4 then
364                 return
365         end
366         pos.y = pos.y - 1
367         if minetest.get_item_group(minetest.get_node(pos).name, "sand") == 0 then
368                 return
369         end
370         pos.y = pos.y + 1
371         local height = 0
372         while node.name == "default:cactus" and height < 4 do
373                 height = height + 1
374                 pos.y = pos.y + 1
375                 node = minetest.get_node(pos)
376         end
377         if height == 4 or node.name ~= "air" then
378                 return
379         end
380         if minetest.get_node_light(pos) < 13 then
381                 return
382         end
383         minetest.set_node(pos, {name = "default:cactus"})
384         return true
385 end
386
387 function default.grow_papyrus(pos, node)
388         pos.y = pos.y - 1
389         local name = minetest.get_node(pos).name
390         if name ~= "default:dirt_with_grass" and name ~= "default:dirt" then
391                 return
392         end
393         if not minetest.find_node_near(pos, 3, {"group:water"}) then
394                 return
395         end
396         pos.y = pos.y + 1
397         local height = 0
398         while node.name == "default:papyrus" and height < 4 do
399                 height = height + 1
400                 pos.y = pos.y + 1
401                 node = minetest.get_node(pos)
402         end
403         if height == 4 or node.name ~= "air" then
404                 return
405         end
406         if minetest.get_node_light(pos) < 13 then
407                 return
408         end
409         minetest.set_node(pos, {name = "default:papyrus"})
410         return true
411 end
412
413 --
414 -- Dig upwards
415 --
416
417 function default.dig_up(pos, node, digger)
418         if digger == nil then return end
419         local np = {x = pos.x, y = pos.y + 1, z = pos.z}
420         local nn = minetest.get_node(np)
421         if nn.name == node.name then
422                 minetest.node_dig(np, nn, digger)
423         end
424 end
425
426 --
427 -- Leafdecay
428 --
429
430 -- Prevent decay of placed leaves
431
432 default.after_place_leaves = function(pos, placer, itemstack, pointed_thing)
433         if placer and placer:is_player() then
434                 local node = minetest.get_node(pos)
435                 node.param2 = 1
436                 minetest.set_node(pos, node)
437         end
438 end
439
440 -- Leafdecay
441 local function leafdecay_after_destruct(pos, oldnode, def)
442         for _, v in pairs(minetest.find_nodes_in_area(vector.subtract(pos, def.radius),
443                         vector.add(pos, def.radius), def.leaves)) do
444                 local node = minetest.get_node(v)
445                 local timer = minetest.get_node_timer(v)
446                 if node.param2 ~= 1 and not timer:is_started() then
447                         timer:start(math.random(20, 120) / 10)
448                 end
449         end
450 end
451
452 local function leafdecay_on_timer(pos, def)
453         if minetest.find_node_near(pos, def.radius, def.trunks) then
454                 return false
455         end
456
457         local node = minetest.get_node(pos)
458         local drops = minetest.get_node_drops(node.name)
459         for _, item in ipairs(drops) do
460                 local is_leaf
461                 for _, v in pairs(def.leaves) do
462                         if v == item then
463                                 is_leaf = true
464                         end
465                 end
466                 if minetest.get_item_group(item, "leafdecay_drop") ~= 0 or
467                                 not is_leaf then
468                         minetest.add_item({
469                                 x = pos.x - 0.5 + math.random(),
470                                 y = pos.y - 0.5 + math.random(),
471                                 z = pos.z - 0.5 + math.random(),
472                         }, item)
473                 end
474         end
475
476         minetest.remove_node(pos)
477         minetest.check_for_falling(pos)
478 end
479
480 function default.register_leafdecay(def)
481         assert(def.leaves)
482         assert(def.trunks)
483         assert(def.radius)
484         for _, v in pairs(def.trunks) do
485                 minetest.override_item(v, {
486                         after_destruct = function(pos, oldnode)
487                                 leafdecay_after_destruct(pos, oldnode, def)
488                         end,
489                 })
490         end
491         for _, v in pairs(def.leaves) do
492                 minetest.override_item(v, {
493                         on_timer = function(pos)
494                                 leafdecay_on_timer(pos, def)
495                         end,
496                 })
497         end
498 end
499
500
501 --
502 -- Register a craft to copy the metadata of items
503 --
504
505 function default.register_craft_metadata_copy(ingredient, result)
506         minetest.register_craft({
507                 type = "shapeless",
508                 output = result,
509                 recipe = {ingredient, result}
510         })
511
512         minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv)
513                 if itemstack:get_name() ~= result then
514                         return
515                 end
516
517                 local original
518                 local index
519                 for i = 1, #old_craft_grid do
520                         if old_craft_grid[i]:get_name() == result then
521                                 original = old_craft_grid[i]
522                                 index = i
523                         end
524                 end
525                 if not original then
526                         return
527                 end
528                 local copymeta = original:get_meta():to_table()
529                 itemstack:get_meta():from_table(copymeta)
530                 -- put the book with metadata back in the craft grid
531                 craft_inv:set_stack("craft", index, original)
532         end)
533 end
534
535
536
537 function default.can_interact_with_node(player, pos)
538         if player and player:is_player() then
539                 if minetest.check_player_privs(player, "protection_bypass") then
540                         return true
541                 end
542         else
543                 return false
544         end
545
546         local meta = minetest.get_meta(pos)
547         local owner = meta:get_string("owner")
548
549         if not owner or owner == "" or owner == player:get_player_name() then
550                 return true
551         end
552
553         return false
554 end