mirror of
https://git.minetest.land/VoxeLibre/VoxeLibre.git
synced 2024-11-29 14:01:07 +01:00
Various fixes.
This commit is contained in:
parent
ebf9f8c918
commit
ca635b69be
1 changed files with 23 additions and 16 deletions
|
@ -2,6 +2,8 @@ local S = minetest.get_translator("mcl_ocean")
|
||||||
local mod_doc = minetest.get_modpath("doc") ~= nil
|
local mod_doc = minetest.get_modpath("doc") ~= nil
|
||||||
-- NOTE: whenever it becomes possible to fully implement kelp without the
|
-- NOTE: whenever it becomes possible to fully implement kelp without the
|
||||||
-- plantlike_rooted limitation, please adapt the code accordingly.
|
-- plantlike_rooted limitation, please adapt the code accordingly.
|
||||||
|
-- TODO: In MC, you can't actually destroy kelp by bucket'ing water in the middle.
|
||||||
|
-- However, because of the plantlike_rooted hack, we'll just allow it for now.
|
||||||
|
|
||||||
-- List of supported surfaces for seagrass and kelp.
|
-- List of supported surfaces for seagrass and kelp.
|
||||||
local surfaces = {
|
local surfaces = {
|
||||||
|
@ -25,11 +27,13 @@ local function is_downward_flowing(pos, node, nodedef, is_above)
|
||||||
|
|
||||||
result = (math.floor(node.param2 / 8) % 2) == 1
|
result = (math.floor(node.param2 / 8) % 2) == 1
|
||||||
if not (result or is_above) then
|
if not (result or is_above) then
|
||||||
-- If not, also check node above (this is needed due a weird quirk in the definition of
|
-- If not, also check node above
|
||||||
-- "downwards flowing" liquids in Minetest)
|
-- (this is needed due a weird quirk in the definition of "downwards flowing"
|
||||||
|
-- liquids in Minetest)
|
||||||
local node_above = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z})
|
local node_above = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z})
|
||||||
local nodedef_above = minetest.registered_nodes[node_above.name]
|
local nodedef_above = minetest.registered_nodes[node_above.name]
|
||||||
result = is_submerged(node_above, nodedef_above) or is_downward_flowing(pos, node_above, nodedef_above, true)
|
result = is_submerged(node_above, nodedef_above)
|
||||||
|
or is_downward_flowing(pos, node_above, nodedef_above, true)
|
||||||
end
|
end
|
||||||
return result
|
return result
|
||||||
end
|
end
|
||||||
|
@ -114,7 +118,7 @@ local function kelp_on_place(itemstack, placer, pointed_thing)
|
||||||
end
|
end
|
||||||
|
|
||||||
local new_kelp = false
|
local new_kelp = false
|
||||||
local is_downward_flowing = false
|
local downward_flowing = false
|
||||||
local pos_top, node_top, def_top
|
local pos_top, node_top, def_top
|
||||||
|
|
||||||
-- When placed on kelp.
|
-- When placed on kelp.
|
||||||
|
@ -136,6 +140,7 @@ local function kelp_on_place(itemstack, placer, pointed_thing)
|
||||||
node_under.name = "mcl_ocean:kelp_" ..surface[1]
|
node_under.name = "mcl_ocean:kelp_" ..surface[1]
|
||||||
node_under.param2 = minetest.registered_items[nu_name].place_param2 or 16
|
node_under.param2 = minetest.registered_items[nu_name].place_param2 or 16
|
||||||
new_kelp = true
|
new_kelp = true
|
||||||
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -143,14 +148,15 @@ local function kelp_on_place(itemstack, placer, pointed_thing)
|
||||||
if not new_kelp or pos_under.y >= pos_above.y then
|
if not new_kelp or pos_under.y >= pos_above.y then
|
||||||
return itemstack
|
return itemstack
|
||||||
end
|
end
|
||||||
|
|
||||||
pos_top = pos_above
|
pos_top = pos_above
|
||||||
node_top = minetest.get_node(pos_above)
|
node_top = minetest.get_node(pos_above)
|
||||||
def_top = minetest.registered_nodes[node_above.name]
|
def_top = minetest.registered_nodes[node_top.name]
|
||||||
end
|
end
|
||||||
|
|
||||||
-- New kelp must also be submerged in water.
|
-- New kelp must also be submerged in water.
|
||||||
is_downward_flowing = is_downward_flowing(pos_top, node_top, def_top)
|
downward_flowing = is_downward_flowing(pos_top, node_top, def_top)
|
||||||
if not (is_submerged(node_top, def_top) and is_downward_flowing) then
|
if not (is_submerged(node_top, def_top) or downward_flowing) then
|
||||||
return itemstack
|
return itemstack
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -159,7 +165,7 @@ local function kelp_on_place(itemstack, placer, pointed_thing)
|
||||||
if def_node.sounds then
|
if def_node.sounds then
|
||||||
minetest.sound_play(def_node.sounds.place, { gain = 0.5, pos = pos_under }, true)
|
minetest.sound_play(def_node.sounds.place, { gain = 0.5, pos = pos_under }, true)
|
||||||
end
|
end
|
||||||
kelp_place(pos_under, node_under, pos_top, def_top, is_downward_flowing)
|
kelp_place(pos_under, node_under, pos_top, def_top, downward_flowing)
|
||||||
if not minetest.is_creative_enabled(player_name) then
|
if not minetest.is_creative_enabled(player_name) then
|
||||||
itemstack:take_item()
|
itemstack:take_item()
|
||||||
end
|
end
|
||||||
|
@ -175,26 +181,24 @@ local function kelp_drop(pos, height)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Dig kelp:
|
|
||||||
-- Each kelp from broken stem until the top drop a single item
|
|
||||||
-- Kelp's height decreases to the height below dig_pos
|
|
||||||
local function kelp_dig(dig_pos, pos, node, is_drop)
|
local function kelp_dig(dig_pos, pos, node, is_drop)
|
||||||
local param2 = node.param2
|
local param2 = node.param2
|
||||||
local height = get_kelp_height(param2)
|
|
||||||
-- pos.y points to the surface, offset needed to point to the first kelp
|
-- pos.y points to the surface, offset needed to point to the first kelp
|
||||||
local new_height = dig_pos.y - (pos.y+1)
|
local new_height = dig_pos.y - (pos.y+1)
|
||||||
|
|
||||||
-- Digs the entire kelp: invoke after_dig_node to set_node
|
-- Digs the entire kelp: invoke after_dig_node to set_node
|
||||||
if new_height == 0 then
|
if new_height <= 0 then
|
||||||
if is_drop then
|
if is_drop then
|
||||||
kelp_drop(dig_pos, height)
|
kelp_drop(dig_pos, get_kelp_height(param2))
|
||||||
end
|
end
|
||||||
minetest.set_node(pos, {name=minetest.registered_nodes[node.name].node_dig_prediction})
|
minetest.set_node(pos, {
|
||||||
|
name=minetest.registered_nodes[node.name].node_dig_prediction,
|
||||||
|
param=node.param, param2=0 })
|
||||||
|
|
||||||
-- Digs the kelp beginning at a height
|
-- Digs the kelp beginning at a height
|
||||||
else
|
else
|
||||||
if is_drop then
|
if is_drop then
|
||||||
kelp_drop(dig_pos, height - new_height)
|
kelp_drop(dig_pos, get_kelp_height(param2) - new_height)
|
||||||
end
|
end
|
||||||
minetest.set_node(pos, {name=node.name, param=node.param, param2=16*new_height})
|
minetest.set_node(pos, {name=node.name, param=node.param, param2=16*new_height})
|
||||||
end
|
end
|
||||||
|
@ -264,7 +268,10 @@ for s=1, #surfaces do
|
||||||
after_dig_node = function(pos)
|
after_dig_node = function(pos)
|
||||||
minetest.set_node(pos, {name=surface[s][2]})
|
minetest.set_node(pos, {name=surface[s][2]})
|
||||||
end,
|
end,
|
||||||
|
-- TODO: add ability to detect whether the kelp or the surface is dug.
|
||||||
|
-- Currently, digging the surface gives sand, which isn't ideal.
|
||||||
on_dig = function(pos, node, digger)
|
on_dig = function(pos, node, digger)
|
||||||
|
minetest.chat_send_all("mo2")
|
||||||
local is_drop = true
|
local is_drop = true
|
||||||
if digger and minetest.is_creative_enabled(digger:get_player_name()) then
|
if digger and minetest.is_creative_enabled(digger:get_player_name()) then
|
||||||
is_drop = false
|
is_drop = false
|
||||||
|
|
Loading…
Reference in a new issue