Added directional connection API

master
Andrey2470T 2022-08-07 01:31:51 +03:00
parent 31129350a4
commit 51f9b20c20
20 changed files with 130 additions and 52 deletions

View File

@ -9,6 +9,7 @@ function helpers.get_dir(pos)
local dir = def.paramtype2 == "facedir" and vector.copy(minetest.facedir_to_dir(node.param2)) or
def.paramtype2 == "wallmounted" and vector.copy(minetest.wallmounted_to_dir(node.param2))
dir = dir*-1
return dir
end

View File

@ -30,11 +30,10 @@ function connecting.replace_node_to(pos, disconnect)
local add_props = minetest.registered_nodes[node_name].add_properties
local modname = node_name:find("multidecor:")
--minetest.debug("3")
if not modname or not add_props or not add_props.common_name then
return
end
--minetest.debug("4")
local target_node = ""
local rel_rot = 0
@ -42,12 +41,12 @@ function connecting.replace_node_to(pos, disconnect)
target_node = "edge"
rel_rot = 180
end
--minetest.debug("5")
if connecting.are_nodes_identical(ord_shifts[2], pos) then
target_node = target_node == "edge" and "corner" or "edge"
rel_rot = 90
end
--minetest.debug("6")
if connecting.are_nodes_identical(ord_shifts[3], pos) then
if target_node == "corner" then
target_node = "edge_middle"
@ -58,7 +57,7 @@ function connecting.replace_node_to(pos, disconnect)
end
rel_rot = 0
end
--minetest.debug("7")
if connecting.are_nodes_identical(ord_shifts[4], pos) then
if target_node == "edge_middle" then
target_node = "off_edge"
@ -66,15 +65,6 @@ function connecting.replace_node_to(pos, disconnect)
elseif target_node == "edge" then
target_node = (rel_rot == 180 or rel_rot == 0) and "corner" or "middle"
rel_rot = rel_rot == 0 and -90 or rel_rot
--[[if rel_rot == 180 then
target_node = "corner"
rel_rot = 180
elseif rel_rot == 90 then
target_node = "middle"
rel_rot = 90
else
target_node = "corner"
rel_rot = -90]]
elseif target_node == "corner" then
target_node = "edge_middle"
rel_rot = rel_rot == 0 and -90 or rel_rot
@ -86,27 +76,92 @@ function connecting.replace_node_to(pos, disconnect)
rel_rot = -90
end
end
target_node = target_node ~= "" and "_" .. target_node or ""
minetest.debug("target_node: " .. target_node)
target_node = target_node ~= "" and "_" .. target_node or ""
if not disconnect and target_node == "" then
return
end
local param2 = minetest.dir_to_facedir(vector.rotate_around_axis({x=0, y=0, z=1}, {x=0, y=1, z=0}, math.rad(rel_rot))*-1)
--minetest.debug("8")
--minetest.debug("name:" .. dump(minetest.registered_nodes["multidecor:" .. add_props.common_name .. "_" .. target_node]))
minetest.set_node(pos, {name="multidecor:" .. add_props.common_name .. target_node, param2=param2})
--minetest.debug("9")
end
function connecting.directional_replace_node_to(pos, dir, side, disconnect)
local node = minetest.get_node(pos)
local def = minetest.registered_nodes[node.name]
local add_props = def.add_properties
local modname = node.name:find("multidecor:")
if not modname or not add_props or not add_props.common_name then
return
end
local left_dir
local right_dir
local dir_rot = math.deg(vector.dir_to_rotation(dir).y)
local dir_rot2 = math.deg(vector.dir_to_rotation(helpers.get_dir(pos)).y)
minetest.debug("side: " .. dump(side))
minetest.debug("dir_rot: " .. dir_rot)
minetest.debug("dir_rot2: " .. dir_rot2)
local is_left_corner = add_props.connect_parts.left_side == def.mesh and side == "right" and
dir_rot-math.pi/2 == dir_rot2
local is_right_corner = add_props.connect_parts.right_side == def.mesh and side == "left" and
dir_rot+math.pi/2 == dir_rot2
if is_left_corner then
--minetest.debug("left corner")
right_dir = dir
elseif is_right_corner then
--minetest.debug("right corner")
left_dir = dir
end
left_dir = left_dir or vector.rotate_around_axis(dir, {x=0, y=1, z=0}, -math.pi/2)
right_dir = right_dir or vector.rotate_around_axis(dir, {x=0, y=1, z=0}, math.pi/2)
local left_pos = pos+left_dir
local right_pos = pos+right_dir
local target_node = ""
local rel_rot = 0
if connecting.are_nodes_identical(left_pos, pos) then
if is_left_corner then
target_node = "corner"
rel_rot = -math.pi/2
else
target_node = "right_side"
end
end
if connecting.are_nodes_identical(right_pos, pos) then
if target_node == "" then
target_node = "left_side"
elseif target_node == "right_side" then
target_node = "middle"
elseif is_right_corner then
target_node = "corner"
end
end
minetest.debug("target_node: " .. target_node)
target_node = target_node ~= "" and "_" .. target_node or ""
if not disconnect and target_node == "" then
return
end
local param2 = minetest.dir_to_facedir(vector.rotate_around_axis(dir, {x=0, y=1, z=0}, rel_rot)*-1)
minetest.set_node(pos, {name="multidecor:" .. add_props.common_name .. target_node, param2=param2})
end
-- Connects or disconnects adjacent nodes around 'pos' position.
-- If the identical table node was set at 'pos' as surrounding, connect them. On destroying it, disconnect.
-- *type* can be "horizontal", "vertical", "pair", "sofa"
function connecting.update_adjacent_nodes_connection(pos, type, disconnect, old_node)
local node = minetest.get_node(pos)
minetest.debug("update_adjacent_nodes_connection()")
if not disconnect then
--minetest.debug("1")
local node = minetest.get_node(pos)
local add_props = minetest.registered_nodes[node.name].add_properties
local modname = node.name:find("multidecor:")
local cmn_name = add_props and add_props.common_name
@ -114,7 +169,6 @@ function connecting.update_adjacent_nodes_connection(pos, type, disconnect, old_
if not modname or not cmn_name then
return
end
--minetest.debug("2")
end
if type == "horizontal" then
@ -134,10 +188,9 @@ function connecting.update_adjacent_nodes_connection(pos, type, disconnect, old_
end
elseif type == "pair" then
if not disconnect then
local node = minetest.get_node(pos)
local dir = minetest.facedir_to_dir(node.param2)
local left = pos+vector.rotate_around_axis(dir, {x=0, y=1, z=0}, math.pi/2)
local right = pos+vector.rotate_around_axis(dir, {x=0, y=1, z=0}, -math.pi/2)
local dir = helpers.get_dir(pos)
local left = pos+vector.rotate_around_axis(dir, {x=0, y=1, z=0}, -math.pi/2)
local right = pos+vector.rotate_around_axis(dir, {x=0, y=1, z=0}, math.pi/2)
local lnode = minetest.get_node(left)
local rnode = minetest.get_node(right)
@ -155,14 +208,31 @@ function connecting.update_adjacent_nodes_connection(pos, type, disconnect, old_
return
end
minetest.set_node(place_pos, {name="multidecor:" .. add_props.common_name .. "_double", param2=minetest.dir_to_facedir(dir)})
minetest.remove_node(place_pos+vector.rotate_around_axis(dir, {x=0, y=1, z=0}, -math.pi/2))
minetest.set_node(place_pos, {name="multidecor:" .. add_props.common_name .. "_double", param2=minetest.dir_to_facedir(dir*-1)})
minetest.remove_node(place_pos+vector.rotate_around_axis(dir, {x=0, y=1, z=0}, math.pi/2))
else
local dir = minetest.facedir_to_dir(old_node.param2)
local right = pos+vector.rotate_around_axis(dir, {x=0, y=1, z=0}, -math.pi/2)
local add_props = minetest.registered_nodes[old_node.name].add_properties
minetest.set_node(right, {name="multidecor:" .. add_props.common_name, param2=minetest.dir_to_facedir(dir)})
end
elseif type == "directional" then
local dir
if disconnect then
dir = minetest.facedir_to_dir(old_node.param2)*-1
else
dir = helpers.get_dir(pos)
end
local left = pos+vector.rotate_around_axis(dir, {x=0, y=1, z=0}, -math.pi/2)
local right = pos+vector.rotate_around_axis(dir, {x=0, y=1, z=0}, math.pi/2)
connecting.directional_replace_node_to(left, dir, "left", disconnect)
connecting.directional_replace_node_to(right, dir, "right", disconnect)
if not disconnect then
connecting.directional_replace_node_to(pos, dir, nil)
end
end
end
@ -178,15 +248,8 @@ function connecting.register_connect_parts(def)
c_def.groups = {not_in_creative_inventory=1}
end
for cb_name, _ in pairs(c_def.callbacks) do
if cb_name ~= "after_destruct" and cb_name ~= "after_dig_node" then
c_def[cb_name] = nil
end
end
c_def.callbacks = nil
c_def.callbacks.on_construct = nil
register.register_furniture_unit(def.add_properties.common_name .. "_" .. name, c_def)
--minetest.register_node(":multidecor:" .. def.add_properties.common_name .. "_" .. name, c_def)
end
end

View File

@ -57,4 +57,8 @@ function register.register_seat(name, base_def, add_def, craft_def)
end
register.register_furniture_unit(name, def, craft_def)
if def.add_properties and def.add_properties.connect_parts then
connecting.register_connect_parts(def)
end
end

View File

@ -27,12 +27,11 @@ end
function sitting.detach_player_from_node(detacher, prev_pdata)
if not prev_pdata then
minetest.debug("3")
return
end
minetest.debug("prev_pdata.physics: " .. dump(prev_pdata.physics))
detacher:set_physics_override(prev_pdata.physics)
if prev_pdata.mesh and prev_pdata.anim then
detacher:set_properties({mesh = prev_pdata.mesh})
detacher:set_animation(prev_pdata.anim.range, prev_pdata.anim.speed, prev_pdata.anim.blend, prev_pdata.anim.loop)
@ -41,13 +40,13 @@ end
function sitting.is_player_attached_to_anything(player)
local prev_pdata = player:get_meta():get_string("previous_player_data")
return prev_pdata ~= ""
end
function sitting.is_seat_busy(node_pos)
local is_busy = minetest.get_meta(node_pos):get_string("is_busy")
return is_busy ~= ""
end
@ -67,25 +66,25 @@ function sitting.sit_player(player, node_pos)
end
local physics = player:get_physics_override()
local prev_pdata = {
physics = {speed = physics.speed, jump = physics.jump}
}
local node = minetest.get_node(node_pos)
local seat_data = minetest.registered_nodes[node.name].add_properties.seat_data
local rand_model
if seat_data.models then
local range, speed, blend, loop = player:get_animation()
prev_pdata.mesh = player:get_properties().mesh
prev_pdata.anim = {range = range, speed = speed, blend = blend, loop = loop}
rand_model = seat_data.models[math.random(1, #seat_data.models)]
end
player:get_meta():set_string("previous_player_data", minetest.serialize(prev_pdata))
local dir_rot = vector.dir_to_rotation(minetest.facedir_to_dir(node.param2))
sitting.attach_player_to_node(player, {pos = vector.add(node_pos, seat_data.pos), rot = vector.add(dir_rot, seat_data.rot), model = rand_model})
@ -96,13 +95,11 @@ end
function sitting.standup_player(player, node_pos)
if not player then
minetest.debug("1")
return
end
local meta = minetest.get_meta(node_pos)
if player:get_player_name() ~= meta:get_string("is_busy") then
minetest.debug("2")
return false
end

View File

@ -13,9 +13,6 @@ register.register_bed("jungle_bed", {
on_construct = function(pos)
connecting.update_adjacent_nodes_connection(pos, "pair")
end,
after_destruct = function(pos, oldnode)
connecting.update_adjacent_nodes_connection(pos, "pair", true, oldnode)
end,
after_dig_node = function(pos, oldnode)
connecting.update_adjacent_nodes_connection(pos, "pair", true, oldnode)
end

View File

@ -199,9 +199,24 @@ register.register_seat("sofa", {
{-0.5, -0.5, -0.325, -0.4, 0.2, 0.225},
{0.4, -0.5, -0.325, 0.5, 0.2, 0.225},
{-0.5, -0.5, 0.225, 0.5, 0.6, 0.5}
},
callbacks = {
on_construct = function(pos)
connecting.update_adjacent_nodes_connection(pos, "directional")
end,
after_dig_node = function(pos, old_node)
connecting.update_adjacent_nodes_connection(pos, "directional", true, old_node)
end
}
},
{
common_name = "sofa",
connect_parts = {
["left_side"] = "multidecor_modern_sofa_1.b3d",
["right_side"] = "multidecor_modern_sofa_2.b3d",
["middle"] = "multidecor_modern_sofa_3.b3d",
["corner"] = "multidecor_modern_sofa_4.b3d"
},
seat_data = {
pos = {x=0.0, y=0.1, z=0.0},
rot = {x=0, y=0, z=0},

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -12,6 +12,7 @@ register.register_table("kitchen_modern_wooden_table", {
connecting.update_adjacent_nodes_connection(pos, "horizontal")
end,
after_dig_node = function(pos)
minetest.debug("1.2")
connecting.update_adjacent_nodes_connection(pos, "horizontal", true)
end
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 11 KiB