1
0
mirror of https://github.com/Sokomine/cottages.git synced 2026-01-11 03:26:23 +01:00

fix player animations when they leave sit/sleep furniture in unintended ways

This commit is contained in:
tour
2025-09-07 22:19:02 +02:00
parent 280316e404
commit f93097c944
2 changed files with 48 additions and 6 deletions

View File

@@ -22,7 +22,7 @@ minetest.register_node("cottages:bed_foot", {
tiles = {"cottages_beds_bed_top_bottom.png", cottages.texture_furniture, "cottages_beds_bed_side.png", "cottages_beds_bed_side.png", "cottages_beds_bed_side.png", "cottages_beds_bed_side.png"},
paramtype = "light",
paramtype2 = "facedir",
groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3},
groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,animates_player=1},
sounds = cottages.sounds.wood,
node_box = {
type = "fixed",
@@ -57,7 +57,7 @@ minetest.register_node("cottages:bed_head", {
tiles = {"cottages_beds_bed_top_top.png", cottages.texture_furniture, "cottages_beds_bed_side_top_r.png", "cottages_beds_bed_side_top_l.png", cottages.texture_furniture, "cottages_beds_bed_side.png"},
paramtype = "light",
paramtype2 = "facedir",
groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3},
groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,animates_player=1},
sounds = cottages.sounds.wood,
node_box = {
type = "fixed",
@@ -98,7 +98,7 @@ minetest.register_node("cottages:sleeping_mat", {
paramtype = 'light',
paramtype2 = "facedir",
walkable = false,
groups = { snappy = 3, sleeping_mat = 1 },
groups = { snappy = 3, sleeping_mat = 1, animates_player = 1},
sounds = cottages.sounds.leaves,
selection_box = {
type = "wallmounted",
@@ -132,7 +132,7 @@ minetest.register_node("cottages:sleeping_mat_head", {
sunlight_propagates = true,
paramtype = 'light',
paramtype2 = "facedir",
groups = { snappy = 3, sleeping_mat = 1 },
groups = { snappy = 3, sleeping_mat = 1, animates_player = 1 },
sounds = cottages.sounds.leaves,
node_box = {
type = "fixed",
@@ -161,7 +161,7 @@ minetest.register_node("cottages:bench", {
tiles = {"cottages_minimal_wood.png", "cottages_minimal_wood.png", "cottages_minimal_wood.png", "cottages_minimal_wood.png", "cottages_minimal_wood.png", "cottages_minimal_wood.png"},
paramtype = "light",
paramtype2 = "facedir",
groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3},
groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,animates_player=1},
sounds = cottages.sounds.wood,
node_box = {
type = "fixed",
@@ -417,11 +417,49 @@ cottages.is_bed = function(pos, node)
return false
end
-- players might leave beds/benches in unintended ways (or other mods mess up with the logic)
-- we need to make sure they won't be stuck with their last animation
local attached_players = {}
local fix_player_animation_job
local function fix_player_animations(active_loop)
if fix_player_animation_job and not active_loop then -- we already have a loop running
return
end
local continue_looping = false
for playername, last_pos in pairs(attached_players) do
-- is the player still at the position where we expect him to be
local player = minetest.get_player_by_name(playername)
local player_pos = player and vector.round(player:get_pos())
local same_position = player_pos and vector.equals(player_pos, last_pos)
-- is the node still around (might be dug/whatever)
local nodename = minetest.get_node(last_pos).name
local node_animates_player = minetest.get_item_group(nodename, "animates_player") ~= 0
if same_position and node_animates_player then
continue_looping = true
else
if player then
cottages.stand(player)
end
attached_players[playername] = nil
end
end
if continue_looping then
fix_player_animation_job = minetest.after(1, fix_player_animations, true)
else
fix_player_animation_job = nil
end
end
cottages.stand = function (player)
local pname = player:get_player_name()
player_api.player_attached[pname] = false
player:set_physics_override({speed = 1, jump = 1, gravity = 1})
player_api.set_animation(player, "stand", 30)
attached_players[pname] = nil
end
cottages.sit = function (player)
@@ -429,6 +467,8 @@ cottages.sit = function (player)
player_api.set_animation(player, "sit", 30)
player:set_physics_override({speed = 0, jump = 0, gravity = 0})
player_api.player_attached[pname] = true
attached_players[pname] = vector.round(player:get_pos())
fix_player_animations()
end
cottages.lay = function (player)
@@ -436,6 +476,8 @@ cottages.lay = function (player)
player_api.set_animation(player, "lay", 30)
player:set_physics_override({speed = 0, jump = 0, gravity = 0})
player_api.player_attached[pname] = true
attached_players[pname] = vector.round(player:get_pos())
fix_player_animations()
end
cottages.sit_on_bench = function( pos, node, clicker, itemstack, pointed_thing )

View File

@@ -61,7 +61,7 @@ minetest.register_node("cottages:straw_mat", {
paramtype = 'light',
paramtype2 = "facedir",
walkable = false,
groups = { hay = 3, snappy = 2, oddly_breakable_by_hand = 2, flammable=3 , sleeping_mat=1, },
groups = { hay = 3, snappy = 2, oddly_breakable_by_hand = 2, flammable=3 , sleeping_mat=1, animates_player=1 },
sounds = cottages.sounds.leaves,
node_box = {
type = "fixed",