diff --git a/homedecor_seating/armchairs.lua b/homedecor_seating/armchairs.lua index 2c7d1c3b..6de86d62 100644 --- a/homedecor_seating/armchairs.lua +++ b/homedecor_seating/armchairs.lua @@ -35,6 +35,7 @@ minetest.register_node(":lrfurn:armchair", { return lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, 1) end, on_destruct = lrfurn.on_seat_destruct, + on_movenode = lrfurn.on_seat_movenode, }) homedecor.register("armchair", { @@ -62,6 +63,7 @@ homedecor.register("armchair", { return lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, 1) end, on_destruct = lrfurn.on_seat_destruct, + on_movenode = lrfurn.on_seat_movenode, }) -- crafts diff --git a/homedecor_seating/init.lua b/homedecor_seating/init.lua index c4c0bf9e..99318e97 100644 --- a/homedecor_seating/init.lua +++ b/homedecor_seating/init.lua @@ -79,6 +79,7 @@ function lrfurn.fix_sofa_rotation_nsew(pos, placer, itemstack, pointed_thing) end local seated_cache = {} +local offset_cache = {} minetest.register_entity("homedecor_seating:seat", { initial_properties = { @@ -161,14 +162,19 @@ function lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, seats) --see if we can find a non occupied seat local sit_pos + local sit_hash for hash, spos in pairs(valid_seats) do local pstatus = false for _, ref in pairs(minetest.get_objects_inside_radius(spos, 0.5)) do - if ref:is_player() then + if ref:is_player() and seated_cache[ref:get_player_name()] then pstatus = true end end - if not pstatus then sit_pos = spos end + if not pstatus then + sit_pos = spos + sit_hash = hash + break; + end end if not sit_pos then minetest.chat_send_player(name, "sorry, this seat is currently occupied") @@ -194,6 +200,9 @@ function lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, seats) xcompat.player.player_attached[name] = true xcompat.player.set_animation(clicker, "sit", 0) seated_cache[name] = minetest.hash_node_position(pos) + if seated_cache[name] ~= sit_hash then + offset_cache[name] = core.hash_node_position(vector.subtract(pos, sit_pos)) + end return itemstack end @@ -203,14 +212,18 @@ function lrfurn.stand(clicker) xcompat.player.player_attached[name] = false if seated_cache[name] then local attached_to = clicker:get_attach() - if attached_to then --check, a stupid clearobjects might have been called, etc - attached_to:remove() --removing also detaches + -- Check, clearobjects might have been called, etc + if attached_to then + -- Removing also detaches + attached_to:remove() end seated_cache[name] = nil + offset_cache[name] = nil end end -function lrfurn.on_seat_destruct(pos) --called when a seat is destroyed +-- Called when a seat is destroyed +function lrfurn.on_seat_destruct(pos) for name, seatpos in pairs(seated_cache) do if seatpos == minetest.hash_node_position(pos) then local player = minetest.get_player_by_name(name) @@ -221,6 +234,30 @@ function lrfurn.on_seat_destruct(pos) --called when a seat is destroyed end end +function lrfurn.on_seat_movenode(from_pos, to_pos) + local hashed_from_pos = core.hash_node_position(from_pos) + local hashed_to_pos = core.hash_node_position(to_pos) + for name, seatpos in pairs(seated_cache) do + if seatpos == hashed_from_pos then + local player = core.get_player_by_name(name) + if player then + local attached_to = player:get_attach() + -- Check, clearobjects might have been called, etc + if attached_to then + if offset_cache[name] then + -- multi-seat node aka sofas + attached_to:set_pos(vector.subtract(to_pos, + core.get_position_from_hash(offset_cache[name]))) + else + attached_to:set_pos(to_pos) + end + seated_cache[name] = hashed_to_pos + end + end + end + end +end + --if the player gets killed in the seat, handle it minetest.register_on_dieplayer(function(player) if seated_cache[player:get_player_name()] then diff --git a/homedecor_seating/longsofas.lua b/homedecor_seating/longsofas.lua index 4f1c7c96..5d22a69e 100644 --- a/homedecor_seating/longsofas.lua +++ b/homedecor_seating/longsofas.lua @@ -49,6 +49,7 @@ minetest.register_node(":lrfurn:longsofa", { return lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, 3) end, on_destruct = lrfurn.on_seat_destruct, + on_movenode = lrfurn.on_seat_movenode, }) minetest.register_craft({ diff --git a/homedecor_seating/misc.lua b/homedecor_seating/misc.lua index 386de67c..4ceb5865 100644 --- a/homedecor_seating/misc.lua +++ b/homedecor_seating/misc.lua @@ -24,6 +24,7 @@ homedecor.register("deckchair", { return lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, 1) end, on_destruct = lrfurn.on_seat_destruct, + on_movenode = lrfurn.on_seat_movenode, }) minetest.register_alias("homedecor:deckchair_foot", "homedecor:deckchair") @@ -45,6 +46,7 @@ homedecor.register("deckchair_striped_blue", { return lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, 1) end, on_destruct = lrfurn.on_seat_destruct, + on_movenode = lrfurn.on_seat_movenode, }) homedecor.register("simple_bench", { @@ -66,6 +68,7 @@ homedecor.register("simple_bench", { return lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, 1) end, on_destruct = lrfurn.on_seat_destruct, + on_movenode = lrfurn.on_seat_movenode, }) local bl1_sbox = { @@ -159,6 +162,7 @@ homedecor.register("kitchen_chair_wood", { return lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, 1) end, on_destruct = lrfurn.on_seat_destruct, + on_movenode = lrfurn.on_seat_movenode, }) homedecor.register("kitchen_chair_padded", { @@ -186,6 +190,7 @@ homedecor.register("kitchen_chair_padded", { return lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, 1) end, on_destruct = lrfurn.on_seat_destruct, + on_movenode = lrfurn.on_seat_movenode, }) local ofchairs_sbox = { @@ -226,6 +231,7 @@ for _, c in pairs(chairs) do return lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, 1) end, on_destruct = lrfurn.on_seat_destruct, + on_movenode = lrfurn.on_seat_movenode, }) end diff --git a/homedecor_seating/sofas.lua b/homedecor_seating/sofas.lua index 130f9c58..ff1f3c95 100644 --- a/homedecor_seating/sofas.lua +++ b/homedecor_seating/sofas.lua @@ -49,6 +49,7 @@ minetest.register_node(":lrfurn:sofa", { return lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, 2) end, on_destruct = lrfurn.on_seat_destruct, + on_movenode = lrfurn.on_seat_movenode, }) minetest.register_craft({