]> git.lizzy.rs Git - Crafter.git/blob - mods/treecapitator/init.lua
adjust item magnet
[Crafter.git] / mods / treecapitator / init.lua
1 treecaptitator = {}
2
3 -- Leafdecay
4 local function leafdecay_after_destruct(pos, oldnode, def)
5         for _, v in pairs(minetest.find_nodes_in_area(vector.subtract(pos, def.radius),
6                         vector.add(pos, def.radius), def.leaves)) do
7                 local node = minetest.get_node(v)
8                 local timer = minetest.get_node_timer(v)
9                 if node.param2 ~= 1 and not timer:is_started() then
10                         timer:start(math.random())
11                 end
12         end
13 end
14
15 local function leafdecay_on_timer(pos, def)
16         if minetest.find_node_near(pos, def.radius, def.trunks) then
17                 return false
18         end
19
20         local node = minetest.get_node(pos)
21         local drops = minetest.get_node_drops(node.name)
22         for _, item in ipairs(drops) do
23                 local is_leaf
24                 for _, v in pairs(def.leaves) do
25                         if v == item then
26                                 is_leaf = true
27                         end
28                 end
29                 if minetest.get_item_group(item, "leafdecay_drop") ~= 0 or
30                                 not is_leaf then
31                         minetest.add_item({
32                                 x = pos.x - 0.5 + math.random(),
33                                 y = pos.y - 0.5 + math.random(),
34                                 z = pos.z - 0.5 + math.random(),
35                         }, item)
36                 end
37         end
38
39         minetest.remove_node(pos)
40         minetest.check_for_falling(pos)
41         
42         minetest.add_particlespawner({
43                 amount = 40,
44                 time = 0.0001,
45                 minpos = {x=pos.x-0.5, y=pos.y-0.5, z=pos.z-0.5},
46                 maxpos = {x=pos.x+0.5, y=pos.y+0.5, z=pos.z+0.5},
47                 minvel = {x=0, y=0, z=0},
48                 maxvel = {x=0, y=0, z=0},
49                 minacc = {x=0, y=0, z=0},
50                 maxacc = {x=0, y=0, z=0},
51                 minexptime = 0.5,
52                 maxexptime = 1.5,
53                 minsize = 1,
54                 maxsize = 2,
55                 collisiondetection = false,
56                 vertical = false,
57                 texture = "treecapitator.png"
58         })
59 end
60
61 function treecaptitator.register_leafdecay(def)
62         assert(def.leaves)
63         assert(def.trunks)
64         assert(def.radius)
65         for _, v in pairs(def.trunks) do
66                 minetest.override_item(v, {
67                         after_destruct = function(pos, oldnode)
68                                 leafdecay_after_destruct(pos, oldnode, def)
69                         end,
70                 })
71         end
72         for _, v in pairs(def.leaves) do
73                 minetest.override_item(v, {
74                         on_timer = function(pos)
75                                 leafdecay_on_timer(pos, def)
76                         end,
77                 })
78         end
79 end
80
81 ----------------------------- registration
82 treecaptitator.register_leafdecay({
83         trunks = {"main:tree"},
84         leaves = {"main:leaves"},
85         radius = 2,
86 })