2015-06-29 19:55:56 +02:00
|
|
|
|
--
|
|
|
|
|
-- Lavacooling
|
|
|
|
|
--
|
|
|
|
|
|
2017-01-31 23:32:56 +01:00
|
|
|
|
mcl_core.cool_lava_source = function(pos)
|
|
|
|
|
minetest.set_node(pos, {name="mcl_core:obsidian"})
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end
|
|
|
|
|
|
2017-01-31 23:32:56 +01:00
|
|
|
|
mcl_core.cool_lava_flowing = function(pos)
|
|
|
|
|
minetest.set_node(pos, {name="mcl_core:stone"})
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
minetest.register_abm({
|
2017-01-31 23:32:56 +01:00
|
|
|
|
nodenames = {"mcl_core:lava_flowing"},
|
2015-06-29 19:55:56 +02:00
|
|
|
|
neighbors = {"group:water"},
|
|
|
|
|
interval = 1,
|
|
|
|
|
chance = 1,
|
|
|
|
|
action = function(pos, node, active_object_count, active_object_count_wider)
|
2017-01-31 23:32:56 +01:00
|
|
|
|
mcl_core.cool_lava_flowing(pos, node, active_object_count, active_object_count_wider)
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end,
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
minetest.register_abm({
|
2017-01-31 23:32:56 +01:00
|
|
|
|
nodenames = {"mcl_core:lava_source"},
|
2015-06-29 19:55:56 +02:00
|
|
|
|
neighbors = {"group:water"},
|
|
|
|
|
interval = 1,
|
|
|
|
|
chance = 1,
|
|
|
|
|
action = function(pos, node, active_object_count, active_object_count_wider)
|
2017-01-31 23:32:56 +01:00
|
|
|
|
mcl_core.cool_lava_source(pos, node, active_object_count, active_object_count_wider)
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end,
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
--
|
|
|
|
|
-- Papyrus and cactus growing
|
|
|
|
|
--
|
|
|
|
|
|
|
|
|
|
-- Functions
|
2017-02-11 19:03:26 +01:00
|
|
|
|
mcl_core.grow_cactus = function(pos, node)
|
2015-06-29 19:55:56 +02:00
|
|
|
|
pos.y = pos.y-1
|
2015-07-04 04:56:02 +02:00
|
|
|
|
local name = minetest.get_node(pos).name
|
2015-06-29 19:55:56 +02:00
|
|
|
|
if minetest.get_item_group(name, "sand") ~= 0 then
|
|
|
|
|
pos.y = pos.y+1
|
|
|
|
|
local height = 0
|
2017-01-31 23:32:56 +01:00
|
|
|
|
while minetest.get_node(pos).name == "mcl_core:cactus" and height < 4 do
|
2015-06-29 19:55:56 +02:00
|
|
|
|
height = height+1
|
|
|
|
|
pos.y = pos.y+1
|
|
|
|
|
end
|
2017-01-12 07:13:58 +01:00
|
|
|
|
if height < 3 then
|
2015-07-04 04:56:02 +02:00
|
|
|
|
if minetest.get_node(pos).name == "air" then
|
2017-01-31 23:32:56 +01:00
|
|
|
|
minetest.set_node(pos, {name="mcl_core:cactus"})
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2017-02-11 19:03:26 +01:00
|
|
|
|
mcl_core.grow_reeds = function(pos, node)
|
2015-06-29 19:55:56 +02:00
|
|
|
|
pos.y = pos.y-1
|
2015-07-04 04:56:02 +02:00
|
|
|
|
local name = minetest.get_node(pos).name
|
2017-01-12 06:54:16 +01:00
|
|
|
|
if minetest.get_node_group(name, "soil_sugarcane") ~= 0 then
|
2017-02-18 02:23:27 +01:00
|
|
|
|
if minetest.find_node_near(pos, 1, {"group:water"}) == nil and minetest.find_node_near(pos, 1, {"group:frosted_ice"}) == nil then
|
2015-06-29 19:55:56 +02:00
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
pos.y = pos.y+1
|
|
|
|
|
local height = 0
|
2017-01-31 23:32:56 +01:00
|
|
|
|
while minetest.get_node(pos).name == "mcl_core:reeds" and height < 3 do
|
2015-06-29 19:55:56 +02:00
|
|
|
|
height = height+1
|
|
|
|
|
pos.y = pos.y+1
|
|
|
|
|
end
|
|
|
|
|
if height < 3 then
|
2015-07-04 04:56:02 +02:00
|
|
|
|
if minetest.get_node(pos).name == "air" then
|
2017-01-31 23:32:56 +01:00
|
|
|
|
minetest.set_node(pos, {name="mcl_core:reeds"})
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- ABMs
|
2015-07-01 07:56:51 +02:00
|
|
|
|
|
2017-01-08 00:22:10 +01:00
|
|
|
|
|
|
|
|
|
local function drop_attached_node(p)
|
|
|
|
|
local nn = minetest.get_node(p).name
|
|
|
|
|
minetest.remove_node(p)
|
|
|
|
|
for _, item in pairs(minetest.get_node_drops(nn, "")) do
|
|
|
|
|
local pos = {
|
|
|
|
|
x = p.x + math.random()/2 - 0.25,
|
|
|
|
|
y = p.y + math.random()/2 - 0.25,
|
|
|
|
|
z = p.z + math.random()/2 - 0.25,
|
|
|
|
|
}
|
|
|
|
|
minetest.add_item(pos, item)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2017-05-09 19:53:07 +02:00
|
|
|
|
-- Remove attached nodes next to and below water.
|
|
|
|
|
-- TODO: This is just an approximation! Attached nodes should be removed if water wants to flow INTO that space.
|
2015-07-01 07:37:51 +02:00
|
|
|
|
minetest.register_abm({
|
|
|
|
|
nodenames = {"group:dig_by_water"},
|
|
|
|
|
neighbors = {"group:water"},
|
|
|
|
|
interval = 1,
|
|
|
|
|
chance = 1,
|
2015-07-01 07:56:51 +02:00
|
|
|
|
action = function(pos, node, active_object_count, active_object_count_wider)
|
|
|
|
|
for xp=-1,1 do
|
|
|
|
|
for zp=-1,1 do
|
|
|
|
|
local p = {x=pos.x+xp, y=pos.y, z=pos.z+zp}
|
2015-07-04 04:56:02 +02:00
|
|
|
|
local n = minetest.get_node(p)
|
2017-02-16 22:07:54 +01:00
|
|
|
|
local d = minetest.registered_nodes[n.name]
|
2017-05-09 19:53:07 +02:00
|
|
|
|
if (d.groups.water) then
|
2017-01-08 00:22:10 +01:00
|
|
|
|
drop_attached_node(pos)
|
|
|
|
|
minetest.dig_node(pos)
|
|
|
|
|
break
|
2017-01-06 02:35:45 +01:00
|
|
|
|
end
|
2015-07-01 07:37:51 +02:00
|
|
|
|
end
|
|
|
|
|
end
|
2017-05-09 19:53:07 +02:00
|
|
|
|
for yp=-1,0 do
|
2015-07-01 07:56:51 +02:00
|
|
|
|
local p = {x=pos.x, y=pos.y+yp, z=pos.z}
|
2015-07-04 04:56:02 +02:00
|
|
|
|
local n = minetest.get_node(p)
|
2017-02-16 22:07:54 +01:00
|
|
|
|
local d = minetest.registered_nodes[n.name]
|
2017-05-09 19:53:07 +02:00
|
|
|
|
if (d.groups.water) then
|
2017-01-06 02:35:45 +01:00
|
|
|
|
drop_attached_node(pos)
|
|
|
|
|
minetest.dig_node(pos)
|
|
|
|
|
break
|
|
|
|
|
end
|
2015-07-01 07:56:51 +02:00
|
|
|
|
end
|
|
|
|
|
|
2015-07-01 07:37:51 +02:00
|
|
|
|
end,
|
|
|
|
|
})
|
|
|
|
|
|
2015-06-29 19:55:56 +02:00
|
|
|
|
minetest.register_abm({
|
2017-01-31 23:32:56 +01:00
|
|
|
|
nodenames = {"mcl_core:cactus"},
|
2015-06-29 19:55:56 +02:00
|
|
|
|
neighbors = {"group:sand"},
|
|
|
|
|
interval = 25,
|
|
|
|
|
chance = 10,
|
|
|
|
|
action = function(pos)
|
2017-02-11 19:03:26 +01:00
|
|
|
|
mcl_core.grow_cactus(pos)
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end,
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
minetest.register_abm({
|
2017-01-31 23:32:56 +01:00
|
|
|
|
nodenames = {"mcl_core:reeds"},
|
2017-02-17 23:39:23 +01:00
|
|
|
|
neighbors = {"group:soil_sugarcane"},
|
2015-06-29 19:55:56 +02:00
|
|
|
|
interval = 25,
|
|
|
|
|
chance = 10,
|
|
|
|
|
action = function(pos)
|
2017-02-11 19:03:26 +01:00
|
|
|
|
mcl_core.grow_reeds(pos)
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end,
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
--
|
|
|
|
|
-- Papyrus and cactus drop
|
|
|
|
|
--
|
|
|
|
|
|
2017-03-21 21:48:26 +01:00
|
|
|
|
local timber_nodenames={"mcl_core:reeds"}
|
2015-06-29 19:55:56 +02:00
|
|
|
|
|
|
|
|
|
minetest.register_on_dignode(function(pos, node)
|
|
|
|
|
local i=1
|
|
|
|
|
while timber_nodenames[i]~=nil do
|
|
|
|
|
if node.name==timber_nodenames[i] then
|
2017-01-27 13:45:21 +01:00
|
|
|
|
local np={x=pos.x, y=pos.y+1, z=pos.z}
|
2015-07-04 04:56:02 +02:00
|
|
|
|
while minetest.get_node(np).name==timber_nodenames[i] do
|
|
|
|
|
minetest.remove_node(np)
|
2017-02-18 21:51:50 +01:00
|
|
|
|
if not minetest.setting_getbool("creative_mode") then
|
|
|
|
|
minetest.add_item(np, timber_nodenames[i])
|
|
|
|
|
end
|
2015-06-29 19:55:56 +02:00
|
|
|
|
np={x=np.x, y=np.y+1, z=np.z}
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
i=i+1
|
|
|
|
|
end
|
|
|
|
|
end)
|
|
|
|
|
|
2017-03-07 23:28:54 +01:00
|
|
|
|
local function air_leaf(leaftype)
|
2015-06-29 19:55:56 +02:00
|
|
|
|
if math.random(0, 50) == 3 then
|
|
|
|
|
return {name = "air"}
|
|
|
|
|
else
|
2017-03-07 23:28:54 +01:00
|
|
|
|
return {name = leaftype}
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2017-02-11 19:03:26 +01:00
|
|
|
|
function mcl_core.generate_tree(pos, trunk, leaves, typearbre)
|
2015-06-29 19:55:56 +02:00
|
|
|
|
pos.y = pos.y-1
|
2015-07-04 04:56:02 +02:00
|
|
|
|
local nodename = minetest.get_node(pos).name
|
2015-06-29 19:55:56 +02:00
|
|
|
|
|
|
|
|
|
pos.y = pos.y+1
|
2015-07-04 04:56:02 +02:00
|
|
|
|
if not minetest.get_node_light(pos) then
|
2015-06-29 19:55:56 +02:00
|
|
|
|
return
|
|
|
|
|
end
|
2017-01-27 13:45:21 +01:00
|
|
|
|
local node
|
2015-06-29 19:55:56 +02:00
|
|
|
|
if typearbre == nil or typearbre == 1 then
|
|
|
|
|
node = {name = ""}
|
|
|
|
|
for dy=1,4 do
|
|
|
|
|
pos.y = pos.y+dy
|
2015-07-04 04:56:02 +02:00
|
|
|
|
if minetest.get_node(pos).name ~= "air" then
|
2015-06-29 19:55:56 +02:00
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
pos.y = pos.y-dy
|
|
|
|
|
end
|
|
|
|
|
node = {name = trunk}
|
|
|
|
|
for dy=0,4 do
|
|
|
|
|
pos.y = pos.y+dy
|
2015-07-04 04:56:02 +02:00
|
|
|
|
if minetest.get_node(pos).name == "air" then
|
|
|
|
|
minetest.add_node(pos, node)
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end
|
|
|
|
|
pos.y = pos.y-dy
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
node = {name = leaves}
|
|
|
|
|
pos.y = pos.y+3
|
|
|
|
|
local rarity = 0
|
|
|
|
|
if math.random(0, 10) == 3 then
|
|
|
|
|
rarity = 1
|
|
|
|
|
end
|
|
|
|
|
for dx=-2,2 do
|
|
|
|
|
for dz=-2,2 do
|
|
|
|
|
for dy=0,3 do
|
|
|
|
|
pos.x = pos.x+dx
|
|
|
|
|
pos.y = pos.y+dy
|
|
|
|
|
pos.z = pos.z+dz
|
|
|
|
|
|
|
|
|
|
if dx == 0 and dz == 0 and dy==3 then
|
2015-07-04 04:56:02 +02:00
|
|
|
|
if minetest.get_node(pos).name == "air" and math.random(1, 5) <= 4 then
|
|
|
|
|
minetest.add_node(pos, node)
|
2017-03-07 23:28:54 +01:00
|
|
|
|
minetest.add_node(pos, air_leaf(leaves))
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end
|
|
|
|
|
elseif dx == 0 and dz == 0 and dy==4 then
|
2015-07-04 04:56:02 +02:00
|
|
|
|
if minetest.get_node(pos).name == "air" and math.random(1, 5) <= 4 then
|
|
|
|
|
minetest.add_node(pos, node)
|
2017-03-07 23:28:54 +01:00
|
|
|
|
minetest.add_node(pos, air_leaf(leaves))
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end
|
|
|
|
|
elseif math.abs(dx) ~= 2 and math.abs(dz) ~= 2 then
|
2015-07-04 04:56:02 +02:00
|
|
|
|
if minetest.get_node(pos).name == "air" then
|
|
|
|
|
minetest.add_node(pos, node)
|
2017-03-07 23:28:54 +01:00
|
|
|
|
minetest.add_node(pos, air_leaf(leaves))
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
if math.abs(dx) ~= 2 or math.abs(dz) ~= 2 then
|
2015-07-04 04:56:02 +02:00
|
|
|
|
if minetest.get_node(pos).name == "air" and math.random(1, 5) <= 4 then
|
|
|
|
|
minetest.add_node(pos, node)
|
2017-03-07 23:28:54 +01:00
|
|
|
|
minetest.add_node(pos, air_leaf(leaves))
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
pos.x = pos.x-dx
|
|
|
|
|
pos.y = pos.y-dy
|
|
|
|
|
pos.z = pos.z-dz
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
elseif typearbre == 2 then
|
|
|
|
|
node = {name = ""}
|
|
|
|
|
|
|
|
|
|
-- can place big tree ?
|
|
|
|
|
local tree_size = math.random(15, 25)
|
|
|
|
|
for dy=1,4 do
|
|
|
|
|
pos.y = pos.y+dy
|
2015-07-04 04:56:02 +02:00
|
|
|
|
if minetest.get_node(pos).name ~= "air" then
|
2015-06-29 19:55:56 +02:00
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
pos.y = pos.y-dy
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--Cheak for placing big tree
|
|
|
|
|
pos.y = pos.y-1
|
|
|
|
|
for dz=0,1 do
|
|
|
|
|
pos.z = pos.z + dz
|
|
|
|
|
--> 0
|
2017-04-01 06:51:55 +02:00
|
|
|
|
local name = minetest.get_node(pos).name
|
|
|
|
|
if name == "mcl_core:dirt_with_grass"
|
|
|
|
|
or name == "mcl_core:dirt_with_grass_snow"
|
|
|
|
|
or name == "mcl_core:dirt" then else
|
2015-06-29 19:55:56 +02:00
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
pos.x = pos.x+1
|
|
|
|
|
--> 1
|
2017-04-01 06:51:55 +02:00
|
|
|
|
if name == "mcl_core:dirt_with_grass"
|
|
|
|
|
or name == "mcl_core:dirt_with_grass_snow"
|
|
|
|
|
or name == "mcl_core:dirt" then else
|
2015-06-29 19:55:56 +02:00
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
pos.x = pos.x-1
|
|
|
|
|
pos.z = pos.z - dz
|
|
|
|
|
end
|
|
|
|
|
pos.y = pos.y+1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- Make tree with vine
|
|
|
|
|
node = {name = trunk}
|
|
|
|
|
for dy=0,tree_size do
|
|
|
|
|
pos.y = pos.y+dy
|
|
|
|
|
|
|
|
|
|
for dz=-1,2 do
|
|
|
|
|
if dz == -1 then
|
|
|
|
|
pos.z = pos.z + dz
|
2015-07-04 04:56:02 +02:00
|
|
|
|
if math.random(1, 3) == 1 and minetest.get_node(pos).name == "air" then
|
2017-01-31 23:32:56 +01:00
|
|
|
|
minetest.add_node(pos, {name = "mcl_core:vine", param2 = 4})
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end
|
|
|
|
|
pos.x = pos.x+1
|
2015-07-04 04:56:02 +02:00
|
|
|
|
if math.random(1, 3) == 1 and minetest.get_node(pos).name == "air" then
|
2017-01-31 23:32:56 +01:00
|
|
|
|
minetest.add_node(pos, {name = "mcl_core:vine", param2 = 4})
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end
|
|
|
|
|
pos.x = pos.x-1
|
|
|
|
|
pos.z = pos.z - dz
|
|
|
|
|
elseif dz == 2 then
|
|
|
|
|
pos.z = pos.z + dz
|
2015-07-04 04:56:02 +02:00
|
|
|
|
if math.random(1, 3) == 1 and minetest.get_node(pos).name == "air"then
|
2017-01-31 23:32:56 +01:00
|
|
|
|
minetest.add_node(pos, {name = "mcl_core:vine", param2 = 5})
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end
|
|
|
|
|
pos.x = pos.x+1
|
2015-07-04 04:56:02 +02:00
|
|
|
|
if math.random(1, 3) == 1 and minetest.get_node(pos).name == "air" then
|
2017-01-31 23:32:56 +01:00
|
|
|
|
minetest.add_node(pos, {name = "mcl_core:vine", param2 = 5})
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end
|
|
|
|
|
pos.x = pos.x-1
|
|
|
|
|
pos.z = pos.z - dz
|
|
|
|
|
else
|
|
|
|
|
pos.z = pos.z + dz
|
|
|
|
|
pos.x = pos.x-1
|
2015-07-04 04:56:02 +02:00
|
|
|
|
if math.random(1, 3) == 1 and minetest.get_node(pos).name == "air" then
|
2017-01-31 23:32:56 +01:00
|
|
|
|
minetest.add_node(pos, {name = "mcl_core:vine", param2 = 2})
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end
|
|
|
|
|
pos.x = pos.x+1
|
2015-07-04 04:56:02 +02:00
|
|
|
|
if minetest.get_node(pos).name == "air" then
|
|
|
|
|
minetest.add_node(pos, {name = trunk, param2=2})
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end
|
|
|
|
|
pos.x = pos.x+1
|
2015-07-04 04:56:02 +02:00
|
|
|
|
if minetest.get_node(pos).name == "air" then
|
|
|
|
|
minetest.add_node(pos, {name = trunk, param2=2})
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end
|
|
|
|
|
pos.x = pos.x+1
|
2015-07-04 04:56:02 +02:00
|
|
|
|
if math.random(1, 3) == 1 and minetest.get_node(pos).name == "air" then
|
2017-01-31 23:32:56 +01:00
|
|
|
|
minetest.add_node(pos, {name = "mcl_core:vine", param2 = 3})
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end
|
|
|
|
|
pos.x = pos.x-2
|
|
|
|
|
pos.z = pos.z - dz
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
pos.y = pos.y-dy
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- make leaves
|
|
|
|
|
node = {name = leaves}
|
|
|
|
|
pos.y = pos.y+tree_size-4
|
2017-03-08 00:13:04 +01:00
|
|
|
|
for dx=-4,4 do
|
|
|
|
|
for dz=-4,4 do
|
2015-06-29 19:55:56 +02:00
|
|
|
|
for dy=0,3 do
|
|
|
|
|
pos.x = pos.x+dx
|
|
|
|
|
pos.y = pos.y+dy
|
|
|
|
|
pos.z = pos.z+dz
|
|
|
|
|
|
|
|
|
|
if dx == 0 and dz == 0 and dy==3 then
|
2017-01-31 23:32:56 +01:00
|
|
|
|
if minetest.get_node(pos).name == "air" or minetest.get_node(pos).name == "mcl_core:vine" and math.random(1, 2) == 1 then
|
2015-07-04 04:56:02 +02:00
|
|
|
|
minetest.add_node(pos, node)
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end
|
|
|
|
|
elseif dx == 0 and dz == 0 and dy==4 then
|
2017-01-31 23:32:56 +01:00
|
|
|
|
if minetest.get_node(pos).name == "air" or minetest.get_node(pos).name == "mcl_core:vine" and math.random(1, 5) == 1 then
|
2015-07-04 04:56:02 +02:00
|
|
|
|
minetest.add_node(pos, node)
|
2017-03-07 23:28:54 +01:00
|
|
|
|
minetest.add_node(pos, air_leaf(leaves))
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end
|
|
|
|
|
elseif math.abs(dx) ~= 2 and math.abs(dz) ~= 2 then
|
2017-01-31 23:32:56 +01:00
|
|
|
|
if minetest.get_node(pos).name == "air" or minetest.get_node(pos).name == "mcl_core:vine" then
|
2015-07-04 04:56:02 +02:00
|
|
|
|
minetest.add_node(pos, node)
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
if math.abs(dx) ~= 2 or math.abs(dz) ~= 2 then
|
2017-01-31 23:32:56 +01:00
|
|
|
|
if minetest.get_node(pos).name == "air" or minetest.get_node(pos).name == "mcl_core:vine" and math.random(1, 3) == 1 then
|
2015-07-04 04:56:02 +02:00
|
|
|
|
minetest.add_node(pos, node)
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end
|
|
|
|
|
else
|
2015-07-04 04:56:02 +02:00
|
|
|
|
if math.random(1, 5) == 1 and minetest.get_node(pos).name == "air" then
|
|
|
|
|
minetest.add_node(pos, node)
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
pos.x = pos.x-dx
|
|
|
|
|
pos.y = pos.y-dy
|
|
|
|
|
pos.z = pos.z-dz
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
------------------------------
|
2017-05-13 23:32:43 +02:00
|
|
|
|
-- Spread grass blocks and mycelium on neighbor dirt
|
2015-06-29 19:55:56 +02:00
|
|
|
|
------------------------------
|
|
|
|
|
minetest.register_abm({
|
2017-01-31 23:32:56 +01:00
|
|
|
|
nodenames = {"mcl_core:dirt"},
|
2017-05-13 23:32:43 +02:00
|
|
|
|
neighbors = {"air", "mcl_core:dirt_with_grass", "mcl_core:mycelium"},
|
2015-06-29 19:55:56 +02:00
|
|
|
|
interval = 30,
|
|
|
|
|
chance = 20,
|
|
|
|
|
action = function(pos)
|
2017-05-13 23:32:43 +02:00
|
|
|
|
if pos == nil then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
local can_change = false
|
|
|
|
|
local above = {x=pos.x, y=pos.y+1, z=pos.z}
|
|
|
|
|
local abovenode = minetest.get_node(above)
|
|
|
|
|
if (abovenode.name=="air") then
|
|
|
|
|
can_change = true
|
|
|
|
|
end
|
|
|
|
|
if can_change then
|
2017-05-14 00:02:39 +02:00
|
|
|
|
local light_self = minetest.get_node_light(above)
|
|
|
|
|
if not light_self then return end
|
|
|
|
|
--[[ Try to find a spreading dirt-type block (e.g. grass block or mycelium)
|
|
|
|
|
within a 3×5×3 area, with the source block being on the 2nd-topmost layer.
|
|
|
|
|
First we look around the source block, if we find nothing, we look below. ]]
|
2017-05-13 23:32:43 +02:00
|
|
|
|
local p2 = minetest.find_node_near(pos, 1, "group:spreading_dirt_type")
|
|
|
|
|
if not p2 then
|
2017-05-14 00:02:39 +02:00
|
|
|
|
p2 = minetest.find_node_near({x=pos.x,y=pos.y+2,z=pos.z}, 1, "group:spreading_dirt_type")
|
|
|
|
|
-- Nothing found on 2nd attempt? Bail out!
|
|
|
|
|
if not p2 then return end
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end
|
2017-05-13 23:32:43 +02:00
|
|
|
|
|
2017-05-14 00:02:39 +02:00
|
|
|
|
-- Found it! Now check light levels!
|
|
|
|
|
local light_target = minetest.get_node_light({x=p2.x, y=p2.y+1, z=p2.z})
|
|
|
|
|
if not light_target then return end
|
2017-05-13 23:32:43 +02:00
|
|
|
|
|
2017-05-14 00:02:39 +02:00
|
|
|
|
if light_self >= 9 and light_target >= 4 then
|
|
|
|
|
-- All checks passed! Let's spread the grass/mycelium!
|
|
|
|
|
local n2 = minetest.get_node(p2)
|
2017-05-13 23:32:43 +02:00
|
|
|
|
minetest.set_node(pos, {name=n2.name})
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end
|
|
|
|
|
end
|
2017-05-13 23:32:43 +02:00
|
|
|
|
end
|
2015-06-29 19:55:56 +02:00
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
--------------------------
|
|
|
|
|
-- Try generate tree ---
|
|
|
|
|
--------------------------
|
2017-03-07 23:28:54 +01:00
|
|
|
|
local treelight = 9
|
|
|
|
|
|
2017-03-08 01:54:04 +01:00
|
|
|
|
local sapling_grow_action = function(trunknode, leafnode, tree_id, soil_needed)
|
|
|
|
|
return function(pos)
|
2015-06-29 19:55:56 +02:00
|
|
|
|
local light = minetest.get_node_light(pos)
|
2017-01-12 07:07:30 +01:00
|
|
|
|
local soilnode = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z})
|
2017-01-12 21:01:01 +01:00
|
|
|
|
local soiltype = minetest.get_item_group(soilnode.name, "soil_sapling")
|
2017-03-08 01:54:04 +01:00
|
|
|
|
if soiltype >= soil_needed and light and light >= treelight then
|
2017-03-07 23:28:54 +01:00
|
|
|
|
-- Increase and check growth stage
|
|
|
|
|
local meta = minetest.get_meta(pos)
|
|
|
|
|
local stage = meta:get_int("stage")
|
|
|
|
|
if stage == nil then stage = 0 end
|
|
|
|
|
stage = stage + 1
|
|
|
|
|
if stage == 2 then
|
|
|
|
|
minetest.set_node(pos, {name="air"})
|
2017-03-08 01:54:04 +01:00
|
|
|
|
mcl_core.generate_tree(pos, trunknode, leafnode, tree_id)
|
2017-03-07 23:28:54 +01:00
|
|
|
|
else
|
|
|
|
|
meta:set_int("stage", stage)
|
|
|
|
|
end
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end
|
2017-03-08 01:54:04 +01:00
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2017-04-01 02:29:36 +02:00
|
|
|
|
-- Attempts to grow the sapling at the specified position
|
|
|
|
|
-- pos: Position
|
|
|
|
|
-- node: Node table of the node at this position, from minetest.get_node
|
|
|
|
|
-- Returns true on success and false on failure
|
|
|
|
|
mcl_core.grow_sapling = function(pos, node)
|
|
|
|
|
local grow
|
|
|
|
|
if node.name == "mcl_core:sapling" then
|
|
|
|
|
grow = sapling_grow_action("mcl_core:tree", "mcl_core:leaves", 1, 1)
|
|
|
|
|
elseif node.name == "mcl_core:darksapling" then
|
|
|
|
|
grow = sapling_grow_action("mcl_core:darktree", "mcl_core:darkleaves", 1, 2)
|
|
|
|
|
elseif node.name == "mcl_core:junglesapling" then
|
|
|
|
|
grow = sapling_grow_action("mcl_core:jungletree", "mcl_core:jungleleaves", 1, 2)
|
|
|
|
|
elseif node.name == "mcl_core:acaciasapling" then
|
|
|
|
|
grow = sapling_grow_action("mcl_core:acaciatree", "mcl_core:acacialeaves", 1, 2)
|
|
|
|
|
elseif node.name == "mcl_core:sprucesapling" then
|
|
|
|
|
grow = sapling_grow_action("mcl_core:sprucetree", "mcl_core:spruceleaves", 1, 1)
|
|
|
|
|
elseif node.name == "mcl_core:birchsapling" then
|
|
|
|
|
grow = sapling_grow_action("mcl_core:birchtree", "mcl_core:birchleaves", 1, 1)
|
|
|
|
|
end
|
|
|
|
|
if grow then
|
|
|
|
|
grow(pos)
|
|
|
|
|
return true
|
|
|
|
|
else
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2017-03-08 02:00:17 +01:00
|
|
|
|
-- TODO: Use better tree models for everything
|
|
|
|
|
-- TODO: Support 2×2 saplings
|
|
|
|
|
|
2017-03-08 01:54:04 +01:00
|
|
|
|
-- Oak tree
|
|
|
|
|
minetest.register_abm({
|
|
|
|
|
nodenames = {"mcl_core:sapling"},
|
|
|
|
|
neighbors = {"group:soil_sapling"},
|
|
|
|
|
interval = 20,
|
|
|
|
|
chance = 1,
|
|
|
|
|
action = sapling_grow_action("mcl_core:tree", "mcl_core:leaves", 1, 1),
|
2015-06-29 19:55:56 +02:00
|
|
|
|
})
|
|
|
|
|
|
2017-03-08 02:00:17 +01:00
|
|
|
|
-- Dark oak tree
|
|
|
|
|
minetest.register_abm({
|
|
|
|
|
nodenames = {"mcl_core:darksapling"},
|
|
|
|
|
neighbors = {"group:soil_sapling"},
|
|
|
|
|
interval = 20,
|
|
|
|
|
chance = 1,
|
|
|
|
|
action = sapling_grow_action("mcl_core:darktree", "mcl_core:darkleaves", 1, 2),
|
|
|
|
|
})
|
|
|
|
|
|
2015-06-29 19:55:56 +02:00
|
|
|
|
-- Jungle Tree
|
|
|
|
|
minetest.register_abm({
|
2017-01-31 23:32:56 +01:00
|
|
|
|
nodenames = {"mcl_core:junglesapling"},
|
2017-01-12 07:07:30 +01:00
|
|
|
|
neighbors = {"group:soil_sapling"},
|
2017-03-07 22:55:49 +01:00
|
|
|
|
interval = 20,
|
2017-03-07 23:28:54 +01:00
|
|
|
|
chance = 1,
|
2017-03-08 01:54:04 +01:00
|
|
|
|
action = sapling_grow_action("mcl_core:jungletree", "mcl_core:jungleleaves", 1, 2)
|
2015-06-29 19:55:56 +02:00
|
|
|
|
})
|
|
|
|
|
|
2017-03-08 02:00:17 +01:00
|
|
|
|
-- Spruce tree
|
|
|
|
|
minetest.register_abm({
|
|
|
|
|
nodenames = {"mcl_core:sprucesapling"},
|
|
|
|
|
neighbors = {"group:soil_sapling"},
|
|
|
|
|
interval = 20,
|
|
|
|
|
chance = 1,
|
|
|
|
|
action = sapling_grow_action("mcl_core:sprucetree", "mcl_core:spruceleaves", 1, 1),
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
-- Birch tree
|
|
|
|
|
minetest.register_abm({
|
|
|
|
|
nodenames = {"mcl_core:birchsapling"},
|
|
|
|
|
neighbors = {"group:soil_sapling"},
|
|
|
|
|
interval = 20,
|
|
|
|
|
chance = 1,
|
|
|
|
|
action = sapling_grow_action("mcl_core:birchtree", "mcl_core:birchleaves", 1, 1),
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
-- Acacia tree
|
|
|
|
|
minetest.register_abm({
|
|
|
|
|
nodenames = {"mcl_core:acaciasapling"},
|
|
|
|
|
neighbors = {"group:soil_sapling"},
|
|
|
|
|
interval = 20,
|
|
|
|
|
chance = 1,
|
|
|
|
|
action = sapling_grow_action("mcl_core:acaciatree", "mcl_core:acacialeaves", 1, 2),
|
|
|
|
|
})
|
|
|
|
|
|
2015-06-29 19:55:56 +02:00
|
|
|
|
---------------------
|
|
|
|
|
-- Vine generating --
|
|
|
|
|
---------------------
|
|
|
|
|
minetest.register_abm({
|
2017-01-31 23:32:56 +01:00
|
|
|
|
nodenames = {"mcl_core:vine"},
|
2015-06-29 19:55:56 +02:00
|
|
|
|
interval = 80,
|
|
|
|
|
chance = 5,
|
|
|
|
|
action = function(pos, node, active_object_count, active_object_count_wider)
|
|
|
|
|
local newpos = {x=pos.x, y=pos.y-1, z=pos.z}
|
2015-07-04 04:56:02 +02:00
|
|
|
|
local n = minetest.get_node(newpos)
|
2015-06-29 19:55:56 +02:00
|
|
|
|
if n.name == "air" then
|
2017-01-27 13:45:21 +01:00
|
|
|
|
local walldir = node.param2
|
2017-01-31 23:32:56 +01:00
|
|
|
|
minetest.add_node(newpos, {name = "mcl_core:vine", param2 = walldir})
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- Leaf Decay
|
|
|
|
|
|
|
|
|
|
-- To enable leaf decay for a node, add it to the "leafdecay" group.
|
|
|
|
|
--
|
|
|
|
|
-- The rating of the group determines how far from a node in the group "tree"
|
|
|
|
|
-- the node can be without decaying.
|
|
|
|
|
--
|
|
|
|
|
-- If param2 of the node is ~= 0, the node will always be preserved. Thus, if
|
|
|
|
|
-- the player places a node of that kind, you will want to set param2=1 or so.
|
|
|
|
|
--
|
|
|
|
|
-- If the node is in the leafdecay_drop group then the it will always be dropped
|
|
|
|
|
-- as an item
|
|
|
|
|
|
2017-01-31 23:32:56 +01:00
|
|
|
|
mcl_core.leafdecay_trunk_cache = {}
|
|
|
|
|
mcl_core.leafdecay_enable_cache = true
|
2015-06-29 19:55:56 +02:00
|
|
|
|
-- Spread the load of finding trunks
|
2017-01-31 23:32:56 +01:00
|
|
|
|
mcl_core.leafdecay_trunk_find_allow_accumulator = 0
|
2015-06-29 19:55:56 +02:00
|
|
|
|
|
|
|
|
|
minetest.register_globalstep(function(dtime)
|
|
|
|
|
local finds_per_second = 5000
|
2017-01-31 23:32:56 +01:00
|
|
|
|
mcl_core.leafdecay_trunk_find_allow_accumulator =
|
2015-06-29 19:55:56 +02:00
|
|
|
|
math.floor(dtime * finds_per_second)
|
|
|
|
|
end)
|
|
|
|
|
|
|
|
|
|
minetest.register_abm({
|
|
|
|
|
nodenames = {"group:leafdecay"},
|
|
|
|
|
neighbors = {"air", "group:liquid"},
|
|
|
|
|
-- A low interval and a high inverse chance spreads the load
|
|
|
|
|
interval = 2,
|
|
|
|
|
chance = 5,
|
|
|
|
|
|
|
|
|
|
action = function(p0, node, _, _)
|
|
|
|
|
local do_preserve = false
|
|
|
|
|
local d = minetest.registered_nodes[node.name].groups.leafdecay
|
|
|
|
|
if not d or d == 0 then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
local n0 = minetest.get_node(p0)
|
|
|
|
|
if n0.param2 ~= 0 then
|
2017-03-08 00:25:04 +01:00
|
|
|
|
-- Prevent leafdecay for player-placed leaves.
|
|
|
|
|
-- param2 is set to 1 after it was placed by the player
|
2015-06-29 19:55:56 +02:00
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
local p0_hash = nil
|
2017-01-31 23:32:56 +01:00
|
|
|
|
if mcl_core.leafdecay_enable_cache then
|
2015-06-29 19:55:56 +02:00
|
|
|
|
p0_hash = minetest.hash_node_position(p0)
|
2017-01-31 23:32:56 +01:00
|
|
|
|
local trunkp = mcl_core.leafdecay_trunk_cache[p0_hash]
|
2015-06-29 19:55:56 +02:00
|
|
|
|
if trunkp then
|
|
|
|
|
local n = minetest.get_node(trunkp)
|
|
|
|
|
local reg = minetest.registered_nodes[n.name]
|
|
|
|
|
-- Assume ignore is a trunk, to make the thing work at the border of the active area
|
|
|
|
|
if n.name == "ignore" or (reg and reg.groups.tree and reg.groups.tree ~= 0) then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
-- Cache is invalid
|
2017-01-31 23:32:56 +01:00
|
|
|
|
table.remove(mcl_core.leafdecay_trunk_cache, p0_hash)
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end
|
|
|
|
|
end
|
2017-01-31 23:32:56 +01:00
|
|
|
|
if mcl_core.leafdecay_trunk_find_allow_accumulator <= 0 then
|
2015-06-29 19:55:56 +02:00
|
|
|
|
return
|
|
|
|
|
end
|
2017-01-31 23:32:56 +01:00
|
|
|
|
mcl_core.leafdecay_trunk_find_allow_accumulator =
|
|
|
|
|
mcl_core.leafdecay_trunk_find_allow_accumulator - 1
|
2015-06-29 19:55:56 +02:00
|
|
|
|
-- Assume ignore is a trunk, to make the thing work at the border of the active area
|
|
|
|
|
local p1 = minetest.find_node_near(p0, d, {"ignore", "group:tree"})
|
|
|
|
|
if p1 then
|
|
|
|
|
do_preserve = true
|
2017-01-31 23:32:56 +01:00
|
|
|
|
if mcl_core.leafdecay_enable_cache then
|
2015-06-29 19:55:56 +02:00
|
|
|
|
-- Cache the trunk
|
2017-01-31 23:32:56 +01:00
|
|
|
|
mcl_core.leafdecay_trunk_cache[p0_hash] = p1
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
if not do_preserve then
|
|
|
|
|
-- Drop stuff other than the node itself
|
2015-07-04 04:56:02 +02:00
|
|
|
|
local itemstacks = minetest.get_node_drops(n0.name)
|
2015-06-29 19:55:56 +02:00
|
|
|
|
for _, itemname in ipairs(itemstacks) do
|
|
|
|
|
if minetest.get_item_group(n0.name, "leafdecay_drop") ~= 0 or
|
|
|
|
|
itemname ~= n0.name then
|
|
|
|
|
local p_drop = {
|
|
|
|
|
x = p0.x - 0.5 + math.random(),
|
|
|
|
|
y = p0.y - 0.5 + math.random(),
|
|
|
|
|
z = p0.z - 0.5 + math.random(),
|
|
|
|
|
}
|
|
|
|
|
minetest.add_item(p_drop, itemname)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
-- Remove node
|
|
|
|
|
minetest.remove_node(p0)
|
2017-01-26 19:14:07 +01:00
|
|
|
|
core.check_for_falling(p0)
|
2015-06-29 19:55:56 +02:00
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
------------------------
|
|
|
|
|
-- Create Color Glass --
|
|
|
|
|
------------------------
|
2017-01-31 23:32:56 +01:00
|
|
|
|
function mcl_core.add_glass(desc, recipeitem, color)
|
2015-06-29 19:55:56 +02:00
|
|
|
|
|
2017-01-31 23:32:56 +01:00
|
|
|
|
minetest.register_node("mcl_core:glass_"..color, {
|
2015-06-29 19:55:56 +02:00
|
|
|
|
description = desc,
|
2017-03-11 01:51:06 +01:00
|
|
|
|
_doc_items_longdesc = "Stained glass is a decorational and mostly transparent block which comes in various different colors.",
|
2015-06-29 19:55:56 +02:00
|
|
|
|
drawtype = "glasslike",
|
2017-01-04 22:36:51 +01:00
|
|
|
|
is_ground_content = false,
|
2017-01-16 13:00:20 +01:00
|
|
|
|
tiles = {"xpanes_pane_glass_"..color..".png"},
|
2017-01-04 12:50:23 +01:00
|
|
|
|
inventory_image = minetest.inventorycube("xpanes_pane_glass_"..color..".png"),
|
2015-06-29 19:55:56 +02:00
|
|
|
|
paramtype = "light",
|
|
|
|
|
use_texture_alpha = true,
|
|
|
|
|
stack_max = 64,
|
2017-03-11 05:34:58 +01:00
|
|
|
|
groups = {handy=1, glass=1, building_block=1, material_glass=1},
|
2017-02-11 18:46:23 +01:00
|
|
|
|
sounds = mcl_sounds.node_sound_glass_defaults(),
|
2015-06-29 19:55:56 +02:00
|
|
|
|
drop = "",
|
2017-02-22 15:40:22 +01:00
|
|
|
|
_mcl_blast_resistance = 1.5,
|
2017-02-24 15:56:46 +01:00
|
|
|
|
_mcl_hardness = 0.3,
|
2015-06-29 19:55:56 +02:00
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
minetest.register_craft({
|
2017-01-31 23:32:56 +01:00
|
|
|
|
output = 'mcl_core:glass_'..color..' 8',
|
2015-06-29 19:55:56 +02:00
|
|
|
|
recipe = {
|
2017-01-31 23:32:56 +01:00
|
|
|
|
{'mcl_core:glass','mcl_core:glass','mcl_core:glass'},
|
|
|
|
|
{'mcl_core:glass','group:dye,'..recipeitem,'mcl_core:glass'},
|
|
|
|
|
{'mcl_core:glass','mcl_core:glass','mcl_core:glass'},
|
2015-06-29 19:55:56 +02:00
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|