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