mirror of
https://git.minetest.land/MineClone2/MineClone2.git
synced 2024-11-28 13:53:45 +01:00
Add kelp growth
This commit is contained in:
parent
286009cbd7
commit
85c058125c
@ -9,6 +9,38 @@ local surfaces = {
|
|||||||
{ "gravel", "mcl_core:gravel", 1 },
|
{ "gravel", "mcl_core:gravel", 1 },
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local function get_kelp_top(pos, node)
|
||||||
|
local size = math.ceil(node.param2 / 16)
|
||||||
|
local pos_water = table.copy(pos)
|
||||||
|
pos_water.y = pos_water.y + size
|
||||||
|
return pos_water, minetest.get_node(pos_water)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function get_submerged(node_water)
|
||||||
|
local def_water = minetest.registered_nodes[node_water.name]
|
||||||
|
-- Submerged in water?
|
||||||
|
if minetest.get_item_group(node_water.name, "water") then
|
||||||
|
if def_water.liquidtype == "source" then
|
||||||
|
return "source"
|
||||||
|
elseif def_water.liquidtype == "flowing" then
|
||||||
|
return "flowing"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
local function grow_param2_step(param2, snap_into_grid)
|
||||||
|
local old_param2 = param2
|
||||||
|
param2 = param2 + 16
|
||||||
|
if param2 > 240 then
|
||||||
|
param2 = 240
|
||||||
|
end
|
||||||
|
if snap_into_grid and (param2 % 16 ~= 0) then
|
||||||
|
param2 = param2 - (param2 % 16)
|
||||||
|
end
|
||||||
|
return param2, param2 ~= old_param2
|
||||||
|
end
|
||||||
|
|
||||||
local function kelp_on_place(itemstack, placer, pointed_thing)
|
local function kelp_on_place(itemstack, placer, pointed_thing)
|
||||||
if pointed_thing.type ~= "node" or not placer then
|
if pointed_thing.type ~= "node" or not placer then
|
||||||
return itemstack
|
return itemstack
|
||||||
@ -49,15 +81,14 @@ local function kelp_on_place(itemstack, placer, pointed_thing)
|
|||||||
node_under.name = "mcl_ocean:kelp_gravel"
|
node_under.name = "mcl_ocean:kelp_gravel"
|
||||||
elseif minetest.get_item_group(node_under.name, "kelp") == 1 then
|
elseif minetest.get_item_group(node_under.name, "kelp") == 1 then
|
||||||
-- Place kelp on kelp = grow kelp by 1 node length
|
-- Place kelp on kelp = grow kelp by 1 node length
|
||||||
if node_under.param2 < 240 then
|
node_under.param2, grow_kelp = grow_param2_step(node_under.param2)
|
||||||
node_under.param2 = node_under.param2 + 16
|
if not grow_kelp then
|
||||||
grow_kelp = true
|
|
||||||
else
|
|
||||||
return itemstack
|
return itemstack
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
return itemstack
|
return itemstack
|
||||||
end
|
end
|
||||||
|
local submerged = false
|
||||||
if grow_kelp then
|
if grow_kelp then
|
||||||
-- Kelp placed on kelp ...
|
-- Kelp placed on kelp ...
|
||||||
-- Kelp can be placed on top of another kelp to make it grow
|
-- Kelp can be placed on top of another kelp to make it grow
|
||||||
@ -65,18 +96,13 @@ local function kelp_on_place(itemstack, placer, pointed_thing)
|
|||||||
-- Placed on side or below node, abort
|
-- Placed on side or below node, abort
|
||||||
return itemstack
|
return itemstack
|
||||||
end
|
end
|
||||||
-- New kelp top must also be submerged in water
|
-- New kelp top must also be submerged in water source
|
||||||
local size = math.ceil(node_under.param2 / 16)
|
local _, top_node = get_kelp_top(pos_under, node_under)
|
||||||
minetest.log("error", node_under.param2.."|"..size)
|
submerged = get_submerged(top_node)
|
||||||
local pos_water = table.copy(pos_under)
|
if submerged ~= "source" then
|
||||||
pos_water.y = pos_water.y + size
|
-- Not submerged in water source, abort
|
||||||
local node_water = minetest.get_node(pos_water)
|
|
||||||
local def_water = minetest.registered_nodes[node_water.name]
|
|
||||||
if not (minetest.get_item_group(node_water.name, "water") and def_water.liquidtype == "source") then
|
|
||||||
-- Not submerged in water, abort
|
|
||||||
return itemstack
|
return itemstack
|
||||||
end
|
end
|
||||||
|
|
||||||
else
|
else
|
||||||
-- New kelp placed ...
|
-- New kelp placed ...
|
||||||
if pos_under.y >= pos_above.y then
|
if pos_under.y >= pos_above.y then
|
||||||
@ -87,6 +113,7 @@ local function kelp_on_place(itemstack, placer, pointed_thing)
|
|||||||
local g_above_water = minetest.get_item_group(node_above.name, "water")
|
local g_above_water = minetest.get_item_group(node_above.name, "water")
|
||||||
if not (g_above_water ~= 0 and def_above.liquidtype == "source") then
|
if not (g_above_water ~= 0 and def_above.liquidtype == "source") then
|
||||||
return itemstack
|
return itemstack
|
||||||
|
-- TODO: Also allow placement into downwards flowing liquid
|
||||||
end
|
end
|
||||||
node_under.param2 = minetest.registered_items[node_under.name].place_param2 or 16
|
node_under.param2 = minetest.registered_items[node_under.name].place_param2 or 16
|
||||||
end
|
end
|
||||||
@ -235,3 +262,33 @@ minetest.register_craft({
|
|||||||
recipe = "mcl_ocean:dried_kelp_block",
|
recipe = "mcl_ocean:dried_kelp_block",
|
||||||
burntime = 200,
|
burntime = 200,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
-- Grow kelp
|
||||||
|
minetest.register_abm({
|
||||||
|
label = "Kelp growth",
|
||||||
|
nodenames = { "group:kelp" },
|
||||||
|
interval = 45,
|
||||||
|
chance = 12,
|
||||||
|
catch_up = false,
|
||||||
|
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||||
|
local grown
|
||||||
|
-- Grow kelp by 1 node length if it would grow inside water
|
||||||
|
node.param2, grown = grow_param2_step(node.param2, true)
|
||||||
|
local top, top_node = get_kelp_top(pos, node)
|
||||||
|
local submerged = get_submerged(top_node)
|
||||||
|
if grown then
|
||||||
|
if submerged == "source" then
|
||||||
|
-- Liquid source: Grow normally
|
||||||
|
minetest.set_node(pos, node)
|
||||||
|
elseif submerged == "flowing" then
|
||||||
|
-- Flowing liquid: Grow 1 step, but also turn the top node into a liquid source
|
||||||
|
minetest.set_node(pos, node)
|
||||||
|
local def_liq = minetest.registered_nodes[top_node.name]
|
||||||
|
local alt_liq = def_liq and def_liq.liquid_alternative_source
|
||||||
|
if alt_liq then
|
||||||
|
minetest.set_node(top, {name=alt_liq})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user