Sdzen Boco
2012-12-22 eea96621e8cb558ad58c4afb46502d183438b9da
commit | author | age
a54666 1 -- Code of rubber tree by PilzAdam
MK 2
634fc0 3 minetest.register_node("technic:rubber_sapling", {
MK 4     description = "Rubber Tree Sapling",
5     drawtype = "plantlike",
6     tiles = {"technic_rubber_sapling.png"},
7     inventory_image = "technic_rubber_sapling.png",
8     wield_image = "technic_rubber_sapling.png",
9     paramtype = "light",
10     walkable = false,
11     groups = {dig_immediate=3,flammable=2},
12     sounds = default.node_sound_defaults(),
13 })
14
15 minetest.register_node("technic:rubber_tree_full", {
16     description = "Rubber Tree",
0821f3 17     tiles = {"default_tree_top.png", "default_tree_top.png", "technic_rubber_tree_full.png"},
634fc0 18     groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2},
MK 19     drop = "default:tree",
20     sounds = default.node_sound_wood_defaults(),
21     
22     on_dig = function(pos, node, digger)
23         minetest.node_dig(pos, node, digger)
24         minetest.env:remove_node(pos)
25     end,
26     
27     after_destruct = function(pos, oldnode)
28         oldnode.name = "technic:rubber_tree_empty"
29         minetest.env:set_node(pos, oldnode)
30     end
31 })
32
33
34 minetest.register_node("technic:rubber_tree_empty", {
0821f3 35     tiles = {"default_tree_top.png", "default_tree_top.png", "technic_rubber_tree_empty.png"},
634fc0 36     groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2, not_in_creative_inventory=1},
MK 37     drop = "default:tree",
38     sounds = default.node_sound_wood_defaults(),
39 })
40
41 minetest.register_abm({
42     nodenames = {"technic:rubber_tree_empty"},
43     interval = 60,
44     chance = 15,
45     action = function(pos, node)
46         node.name = "technic:rubber_tree_full"
47         minetest.env:set_node(pos, node)
48     end
49 })
50
51 minetest.register_node("technic:rubber_leaves", {
52     drawtype = "allfaces_optional",
53     visual_scale = 1.3,
54     tiles = {"default_leaves.png"},
55     paramtype = "light",
56     groups = {snappy=3, leafdecay=3, flammable=2, not_in_creative_inventory=1},
57     drop = {
58         max_items = 1,
59         items = {
60             {
61                 items = {'technic:rubber_sapling'},
62                 rarity = 20,
63             },
64         }
65     },
66     sounds = default.node_sound_leaves_defaults(),
67 })
68
69 minetest.register_abm({
70     nodenames = {"technic:rubber_sapling"},
71     interval = 60,
72     chance = 20,
73     action = function(pos, node)
ef174a 74         generate_tree(pos, "technic:rubber_tree_full", "technic:rubber_leaves", {"default:dirt", "default:dirt_with_grass"})
634fc0 75     end
MK 76 })
77
78 minetest.register_on_generated(function(minp, maxp, blockseed)
79     if math.random(1, 100) > 5 then
80         return
81     end
82     local tmp = {x=(maxp.x-minp.x)/2+minp.x, y=(maxp.y-minp.y)/2+minp.y, z=(maxp.z-minp.z)/2+minp.z}
83     local pos = minetest.env:find_node_near(tmp, maxp.x-minp.x, {"default:dirt_with_grass"})
84     if pos ~= nil then
ef174a 85         generate_tree({x=pos.x, y=pos.y+1, z=pos.z}, "technic:rubber_tree_full", "technic:rubber_leaves", {"default:dirt", "default:dirt_with_grass"})
634fc0 86     end
MK 87 end)
88
89
90 -- ========= FUEL =========
91 minetest.register_craft({
92     type = "fuel",
93     recipe = "technic:rubber_sapling",
94     burntime = 10
95 })
a54666 96
8ccf7f 97 function generate_tree(pos, trunk, leaves, underground, replacements)
a54666 98     pos.y = pos.y-1
MK 99     local nodename = minetest.env:get_node(pos).name
100     local ret = true
101     for _,name in ipairs(underground) do
102         if nodename == name then
103             ret = false
104             break
105         end
106     end
107     pos.y = pos.y+1
108     if ret or minetest.env:get_node_light(pos) < 8 then
109         return
110     end
111     
112     node = {name = ""}
113     for dy=1,4 do
114         pos.y = pos.y+dy
115         if minetest.env:get_node(pos).name ~= "air" then
116             return
117         end
118         pos.y = pos.y-dy
119     end
120     node.name = trunk
121     for dy=0,4 do
122         pos.y = pos.y+dy
123         minetest.env:set_node(pos, node)
124         pos.y = pos.y-dy
125     end
126     
127     if not replacements then
128         replacements = {}
129     end
130     
131     node.name = leaves
132     pos.y = pos.y+3
133     for dx=-2,2 do
134         for dz=-2,2 do
135             for dy=0,3 do
136                 pos.x = pos.x+dx
137                 pos.y = pos.y+dy
138                 pos.z = pos.z+dz
139                 
140                 if dx == 0 and dz == 0 and dy==3 then
141                     if minetest.env:get_node(pos).name == "air" and math.random(1, 5) <= 4 then
142                         minetest.env:set_node(pos, node)
143                         for name,rarity in pairs(replacements) do
144                             if math.random(1, rarity) == 1 then
145                                 minetest.env:set_node(pos, {name=name})
146                             end
147                         end
148                     end
149                 elseif dx == 0 and dz == 0 and dy==4 then
150                     if minetest.env:get_node(pos).name == "air" and math.random(1, 5) <= 4 then
151                         minetest.env:set_node(pos, node)
152                         for name,rarity in pairs(replacements) do
153                             if math.random(1, rarity) == 1 then
154                                 minetest.env:set_node(pos, {name=name})
155                             end
156                         end
157                     end
158                 elseif math.abs(dx) ~= 2 and math.abs(dz) ~= 2 then
159                     if minetest.env:get_node(pos).name == "air" then
160                         minetest.env:set_node(pos, node)
161                         for name,rarity in pairs(replacements) do
162                             if math.random(1, rarity) == 1 then
163                                 minetest.env:set_node(pos, {name=name})
164                             end
165                         end
166                     end
167                 else
168                     if math.abs(dx) ~= 2 or math.abs(dz) ~= 2 then
169                         if minetest.env:get_node(pos).name == "air" and math.random(1, 5) <= 4 then
170                             minetest.env:set_node(pos, node)
171                             for name,rarity in pairs(replacements) do
172                                 if math.random(1, rarity) == 1 then
173                                 minetest.env:set_node(pos, {name=name})
174                                 end
175                             end
176                         end
177                     end
178                 end
179                 
180                 pos.x = pos.x-dx
181                 pos.y = pos.y-dy
182                 pos.z = pos.z-dz
183             end
184         end
185     end
186 end