Integrated the MTG beds API sleeping part with the mod's one

master
Andrey2470T 2022-07-31 00:55:11 +03:00
parent f8f104f36f
commit b14d1ec615
7 changed files with 95 additions and 19 deletions

View File

@ -1,3 +1,56 @@
local default_on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
local add_props = minetest.registered_nodes[node.name].add_properties
if not add_props then
return
end
local bed_dir = helpers.get_dir(pos)
local lpos = add_props.lay_pos1 or {x=0, y=0, z=0}
lpos = pos + vector.rotate_around_axis(lpos, {x=0, y=1, z=0}, vector.dir_to_rotation(bed_dir).y)
local lpos2 = add_props.lay_pos2
lpos2 = lpos2 and pos + vector.rotate_around_axis(lpos2, {x=0, y=1, z=0}, vector.dir_to_rotation(bed_dir).y)
local is_lpos_fr = true
local is_lpos2_fr = true
for _, bpos in pairs(beds.bed_position) do
if vector.equals(lpos, bpos) then
is_lpos_fr = false
elseif lpos2 and vector.equals(lpos2, bpos) then
is_lpos2_fr = false
end
end
local tpos = is_lpos_fr and lpos or is_lpos2_fr and lpos2
if not tpos then
minetest.chat_send_player(clicker:get_player_name(), "This bed is already occupied!")
return
end
beds.on_rightclick(tpos, clicker)
return itemstack
end
local default_can_dig = function(pos)
local add_props = minetest.registered_nodes[minetest.get_node(pos).name].add_properties
if not add_props then
return
end
local bed_dir = helpers.get_dir(pos)
local lpos = add_props.lay_pos1 or {x=0, y=0, z=0}
lpos = pos + vector.rotate_around_axis(lpos, {x=0, y=1, z=0}, vector.dir_to_rotation(bed_dir).y)
return beds.can_dig(lpos)
end
function register.register_bed(name, base_def, add_def, craft_def)
local def = table.copy(base_def)
@ -6,16 +59,31 @@ function register.register_bed(name, base_def, add_def, craft_def)
if add_def then
if add_def.recipe then
craft_def = add_def
craft_def = table.copy(add_def)
else
def.add_properties = add_def
def.add_properties = table.copy(add_def)
end
end
local mtg_bed_def = minetest.registered_nodes["beds:bed_bottom"]
if def.callbacks then
def.callbacks.after_destruct = nil
def.callbacks.after_dig_node = nil
def.callbacks.on_rightclick = def.callbacks.on_rightclick or default_on_rightclick
def.callbacks.on_destruct = def.callbacks.on_destruct or mtg_bed_def.on_destruct
def.callbacks.can_dig = def.callbacks.can_dig or default_can_dig
else
def.callbacks = {
on_rightclick = default_on_rightclick,
on_destruct = mtg_bed_def.on_destruct,
can_dig = default_can_dig
}
end
if def.add_properties then
def.add_properties.lay_pos2 = nil
end
register.register_furniture_unit(name, def, craft_def)
if add_def.double then
@ -43,6 +111,9 @@ function register.register_bed(name, base_def, add_def, craft_def)
def2.callbacks.after_dig_node = base_def.callbacks.after_dig_node
end
if def2.add_properties then
def2.add_properties.lay_pos2 = add_def.lay_pos2
end
register.register_furniture_unit(name .. "_double", def2)
end
end

View File

@ -0,0 +1,13 @@
multidecor.helpers = {}
helpers = multidecor.helpers
-- Returns a direction of the node with 'pos' position
function helpers.get_dir(pos)
local node = minetest.get_node(pos)
local def = minetest.registered_nodes[node.name]
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

@ -2,6 +2,7 @@ multidecor = {}
local modpath = minetest.get_modpath("decor_api")
dofile(modpath .. "/common_helpers.lua")
dofile(modpath .. "/connecting.lua")
dofile(modpath .. "/register.lua")
dofile(modpath .. "/bed.lua")

View File

@ -36,7 +36,7 @@ function shelves.rotate_shelf(pos, obj, is_drawer, move_dist)
return
end
local dir = shelves.get_dir(pos)
local dir = helpers.get_dir(pos)
local rot_y = vector.dir_to_rotation(dir).y
local rel_obj_pos = vector.subtract(obj:get_pos(), pos)
@ -62,7 +62,7 @@ function shelves.rotate_shelf_bbox(obj)
if not self then return end
local sel_box = minetest.registered_entities[self.name].selectionbox
local dir = shelves.get_dir(self.connected_to.pos)
local dir = helpers.get_dir(self.connected_to.pos)
local yaw = vector.dir_to_rotation(dir).y
local box = {
@ -88,16 +88,6 @@ function shelves.rotate_shelf_bbox(obj)
obj:set_properties({selectionbox={box.min.x, box.min.y, box.min.z, box.max.x, box.max.y, box.max.z}})
end
-- Returns a direction of the node with 'pos' position
function shelves.get_dir(pos)
local node = minetest.get_node(pos)
local def = minetest.registered_nodes[node.name]
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
-- Animates opening or closing the shelf 'obj'. The action directly depends on 'dir_sign' value ('1' is open, '-1' is close)
function shelves.open_shelf(obj, dir_sign)
local self = obj:get_luaentity()
@ -112,7 +102,7 @@ function shelves.open_shelf(obj, dir_sign)
--minetest.debug("2")
local node_name = self.connected_to.name
local shelf = minetest.registered_nodes[node_name].add_properties.shelves_data[self.shelf_data_i]
local dir = shelves.get_dir(self.connected_to.pos)
local dir = helpers.get_dir(self.connected_to.pos)
self.dir = dir_sign
if shelf.type == "drawer" then

View File

@ -23,6 +23,8 @@ register.register_bed("jungle_bed", {
},
{
common_name = "jungle_bed",
lay_pos1 = {x=0, y=0, z=1},
lay_pos2 = {x=-1, y=0, z=1},
double = {
mutable_bounding_box_indices = {1, 2},
description = "Jungle Bed (double)",
@ -64,6 +66,8 @@ register.register_bed("wooden_bed_with_legs", {
},
{
common_name = "wooden_bed_with_legs",
lay_pos1 = {x=0, y=0, z=1},
lay_pos2 = {x=-1, y=0, z=1},
double = {
mutable_bounding_box_indices = {1, 2, 3},
description = "Wooden bed with legs (double)",

View File

@ -1,4 +1,4 @@
name = modern
description = Modern-style furniture
depends = decor_api
depends = beds, decor_api
author = Andrey01

View File

@ -59,9 +59,6 @@ for _, wood_n in ipairs({"", "jungle", "pine", "aspen"}) do
{-0.5, 0, 0.4, 0.5, -0.5, 0.5},
{-0.5, 0, 0.15, -0.4, -0.5, 0.4},
{0.4, 0, 0.15, 0.5, -0.5, 0.4}
--[[{-0.5, 0.4, 0, 0.5, 0.5, 0.5},
{-0.5, 0.15, 0, -0.4, 0.4, 0.5},
{0.4, 0.15, 0, 0.5, 0.4, 0.5}]]
}
},
{