Added directional connection API
parent
31129350a4
commit
51f9b20c20
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
@ -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 |
Loading…
Reference in New Issue