Skip to content

Commit

Permalink
Jump drive support for seats (#87)
Browse files Browse the repository at this point in the history
* psuedo code for jump drive support

* avoid re-calculating node hash in loop

* cache new position for next move

* clean comment and minetest -> core

* cache seat offset for sofas

* use first found sitting position

* cleanup some comments

* bugfix: reported seat occupied when it wasn't

---------

Co-authored-by: Luke aka SwissalpS <[email protected]>
  • Loading branch information
wsor4035 and SwissalpS authored Dec 22, 2024
1 parent 94e25c2 commit b51d271
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 5 deletions.
2 changes: 2 additions & 0 deletions homedecor_seating/armchairs.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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", {
Expand Down Expand Up @@ -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
Expand Down
47 changes: 42 additions & 5 deletions homedecor_seating/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand Down Expand Up @@ -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")
Expand All @@ -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
Expand All @@ -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)
Expand All @@ -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
Expand Down
1 change: 1 addition & 0 deletions homedecor_seating/longsofas.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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({
Expand Down
6 changes: 6 additions & 0 deletions homedecor_seating/misc.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand All @@ -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", {
Expand All @@ -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 = {
Expand Down Expand Up @@ -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", {
Expand Down Expand Up @@ -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 = {
Expand Down Expand Up @@ -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

Expand Down
1 change: 1 addition & 0 deletions homedecor_seating/sofas.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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({
Expand Down

0 comments on commit b51d271

Please sign in to comment.