Compare commits

..

6 Commits

Author SHA1 Message Date
f8ee689624 free player when seat is dug 2024-11-06 23:21:40 -05:00
d8ae7a360d handle corner case where player dies while in chair 2024-11-05 01:20:34 -05:00
40898101be replace physics hell with hopefully better entity hell (#81)
* replace physics hell with hopefully better entity hell

* toss worthless optional depend

* no need to save entity if we dont remove it for some reason - crashes, etc

* fix sofas

* handle the rest of chairs

* catch malformed seating, since lua tables are 1 indexed

* niklp suggestion
2024-10-30 22:57:08 -04:00
79416b962c Add player_monoids support (#80)
* Add `player_monoids` support (*sometimes* broken for whatever reason, see xkcd#1739)

* .
2024-10-20 12:24:57 -04:00
00ee805ed7 Make half doors craftable (#79) 2024-10-15 18:44:55 -04:00
6fb69a56a5 Fix typo in German translation of "Dishwasher" 2024-10-05 19:22:13 +02:00
16 changed files with 120 additions and 51 deletions

View File

@ -41,4 +41,5 @@ read_globals = {
"doors",
"i3",
"xcompat",
"player_monoids"
}

View File

@ -4,6 +4,3 @@ dofile(modpath.."/alias.lua")
dofile(modpath.."/node_stairs.lua")
dofile(modpath.."/others.lua")
dofile(modpath.."/recipes.lua")
minetest.log("action", "[building_blocks] loaded.")

View File

@ -360,6 +360,3 @@ minetest.register_lbm({
end
end
})
minetest.log("action", "[fake_fire] loaded.")

View File

@ -131,6 +131,3 @@ if minetest.get_modpath("doors") then
end
end
minetest.log("action", "[homedecor_3d_extra] loaded.")

View File

@ -63,6 +63,6 @@ dofile(modpath.."/registration.lua")
dofile(modpath.."/water_particles.lua")
dofile(modpath.."/crafts.lua")
if minetest.settings:get_bool("log_mods") then
if minetest.settings:get_bool("log_mod") then
minetest.log("action", "[HomeDecor API] Loaded!")
end

View File

@ -410,8 +410,8 @@ minetest.register_craft( {
type = "shapeless",
output = "homedecor:gate_half_door_closed 4",
recipe = {
"doors:homedecor_wood_plain_a",
"doors:homedecor_wood_plain_a"
"doors:homedecor_wood_plain",
"doors:homedecor_wood_plain"
},
})
@ -419,8 +419,8 @@ minetest.register_craft( {
type = "shapeless",
output = "homedecor:gate_half_door_white_closed 4",
recipe = {
"doors:homedecor_bedroom_a",
"doors:homedecor_bedroom_a"
"doors:homedecor_basic_panel",
"doors:homedecor_basic_panel"
},
})

View File

@ -128,5 +128,3 @@ function inbox.get_inbox_insert_formspec(pos)
"listring[]"
return formspec
end
minetest.log("action", "[inbox] loaded.")

View File

@ -4,7 +4,7 @@ Refrigerator=Kühlschrank
Oven=Backofen
Oven (stainless steel)=Backofen (Edelstahl)
Microwave Oven=Mikrowelle
Dishwasher=Spülmachine
Dishwasher=Spülmaschine
granite=Granit
marble=Marmor
steel=Stahl

View File

@ -1934,5 +1934,3 @@ minetest.register_craft({
{ "default:steel_ingot" },
},
})
minetest.log("action", "[homedecor_lightning] loaded.")

View File

@ -183,6 +183,4 @@ minetest.register_alias("plasmascreen:screen6", "air")
minetest.register_alias("plasmascreen:screen5", "homedecor:tv")
minetest.register_alias("plasmascreen:stand", "homedecor:tv_stand")
minetest.register_alias("plasmascreen:tv", "homedecor:tv")
minetest.register_alias("plasmascreen:tv_off", "homedecor:tv_off")
minetest.log("action", "[plasmascreen] loaded.")
minetest.register_alias("plasmascreen:tv_off", "homedecor:tv_off")

View File

@ -33,7 +33,8 @@ minetest.register_node(":lrfurn:armchair", {
on_rotate = unifieddyes.fix_after_screwdriver_nsew,
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
return lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, 1)
end
end,
on_destruct = lrfurn.on_seat_destruct,
})
homedecor.register("armchair", {
@ -59,7 +60,8 @@ homedecor.register("armchair", {
on_rotate = unifieddyes.fix_after_screwdriver_nsew,
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
return lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, 1)
end
end,
on_destruct = lrfurn.on_seat_destruct,
})
-- crafts

View File

@ -78,14 +78,62 @@ function lrfurn.fix_sofa_rotation_nsew(pos, placer, itemstack, pointed_thing)
minetest.swap_node(pos, { name = node.name, param2 = fdir+colorbits })
end
local physics_cache = {}
local seated_cache = {}
minetest.register_entity("homedecor_seating:seat", {
initial_properties = {
visual = "cube",
--comment out the following when testing so you can see it
textures = {"blank.png", "blank.png", "blank.png", "blank.png", "blank.png", "blank.png"},
collisionbox = { -0.01, -0.01, -0.01, 0.01, 0.01, 0.01 },
selectionbox = { -0.01, -0.01, -0.01, 0.01, 0.01, 0.01, rotate = false },
static_save = false,
},
on_punch = function(self)
self.object:remove()
end,
})
--we only care about 4 rotations, but just in case someone worldedits, etc - do something other than crash
--radians are stupid, using degrees and then converting
local p2r = {
0*math.pi/180,
0*math.pi/180, --correct
180*math.pi/180, --correct
90*math.pi/180, --correct
270*math.pi/180, --correct
0*math.pi/180,
0*math.pi/180,
0*math.pi/180,
}
p2r[0] = p2r[1]
local p2r_sofa = {
0*math.pi/180,
90*math.pi/180, --correct
270*math.pi/180, --correct
180*math.pi/180, --correct
0*math.pi/180, --correct
0*math.pi/180,
0*math.pi/180,
0*math.pi/180,
}
p2r_sofa[0] = p2r_sofa[1]
local p2r_facedir = {
[0] = 180*math.pi/180,
[1] = 90*math.pi/180,
[2] = 0*math.pi/180,
[3] = 270*math.pi/180,
}
function lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, seats)
if not clicker:is_player() then
return itemstack
end
if physics_cache[clicker:get_player_name()] then
local name = clicker:get_player_name()
if seated_cache[name] then --already sitting
lrfurn.stand(clicker)
return itemstack
end
@ -123,34 +171,64 @@ function lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, seats)
if not pstatus then sit_pos = spos end
end
if not sit_pos then
minetest.chat_send_player(clicker:get_player_name(), "sorry, this seat is currently occupied")
minetest.chat_send_player(name, "sorry, this seat is currently occupied")
return itemstack
end
--seat the player
clicker:set_pos(sit_pos)
xcompat.player.player_attached[clicker:get_player_name()] = true
local entity = minetest.add_entity(sit_pos, "homedecor_seating:seat")
if not entity then return itemstack end --catch for when the entity fails to spawn just in case
clicker:set_attach(entity, "", {x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}, true)
local nodedef = minetest.registered_nodes[node.name]
if nodedef.paramtype2 == "facedir" then
entity:set_rotation({x = 0, y = p2r_facedir[node.param2 % 4], z = 0})
elseif string.find(node.name, "sofa") then
entity:set_rotation({x = 0, y = p2r_sofa[node.param2 % 8], z = 0})
else
entity:set_rotation({x = 0, y = p2r[node.param2 % 8], z = 0})
end
xcompat.player.player_attached[name] = true
xcompat.player.set_animation(clicker, "sit", 0)
physics_cache[clicker:get_player_name()] = table.copy(clicker:get_physics_override())
clicker:set_physics_override({speed = 0, jump = 0, gravity = 0})
seated_cache[name] = minetest.hash_node_position(pos)
return itemstack
end
function lrfurn.stand(clicker)
xcompat.player.player_attached[clicker:get_player_name()] = false
if physics_cache[clicker:get_player_name()] then
clicker:set_physics_override(physics_cache[clicker:get_player_name()])
physics_cache[clicker:get_player_name()] = nil
else --in case this is called and the cache is empty
clicker:set_physics_override({speed = 1, jump = 1, gravity = 1})
local name = clicker:get_player_name()
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
end
seated_cache[name] = nil
end
end
function lrfurn.on_seat_destruct(pos) --called when a seat is destroyed
for name, seatpos in pairs(seated_cache) do
if seatpos == minetest.hash_node_position(pos) then
local player = minetest.get_player_by_name(name)
if player then
lrfurn.stand(player)
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
lrfurn.stand(player)
end
end)
dofile(modpath.."/longsofas.lua")
dofile(modpath.."/sofas.lua")
dofile(modpath.."/armchairs.lua")
dofile(modpath.."/misc.lua")
minetest.log("action", "[homedecor_seating] loaded.")

View File

@ -47,7 +47,8 @@ minetest.register_node(":lrfurn:longsofa", {
on_dig = unifieddyes.on_dig,
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
return lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, 3)
end
end,
on_destruct = lrfurn.on_seat_destruct,
})
minetest.register_craft({

View File

@ -22,7 +22,8 @@ homedecor.register("deckchair", {
on_rotate = minetest.get_modpath("screwdriver") and screwdriver.disallow or nil,
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
return lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, 1)
end
end,
on_destruct = lrfurn.on_seat_destruct,
})
minetest.register_alias("homedecor:deckchair_foot", "homedecor:deckchair")
@ -42,7 +43,8 @@ homedecor.register("deckchair_striped_blue", {
on_rotate = minetest.get_modpath("screwdriver") and screwdriver.disallow or nil,
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
return lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, 1)
end
end,
on_destruct = lrfurn.on_seat_destruct,
})
homedecor.register("simple_bench", {
@ -62,7 +64,8 @@ homedecor.register("simple_bench", {
},
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
return lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, 1)
end
end,
on_destruct = lrfurn.on_seat_destruct,
})
local bl1_sbox = {
@ -154,7 +157,8 @@ homedecor.register("kitchen_chair_wood", {
on_rotate = unifieddyes.fix_after_screwdriver_nsew,
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
return lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, 1)
end
end,
on_destruct = lrfurn.on_seat_destruct,
})
homedecor.register("kitchen_chair_padded", {
@ -180,7 +184,8 @@ homedecor.register("kitchen_chair_padded", {
on_rotate = unifieddyes.fix_after_screwdriver_nsew,
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
return lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, 1)
end
end,
on_destruct = lrfurn.on_seat_destruct,
})
local ofchairs_sbox = {
@ -219,7 +224,8 @@ for _, c in pairs(chairs) do
on_rotate = minetest.get_modpath("screwdriver") and screwdriver.rotate_simple or nil,
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
return lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, 1)
end
end,
on_destruct = lrfurn.on_seat_destruct,
})
end

View File

@ -47,7 +47,8 @@ minetest.register_node(":lrfurn:sofa", {
on_dig = unifieddyes.on_dig,
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
return lrfurn.sit(pos, node, clicker, itemstack, pointed_thing, 2)
end
end,
on_destruct = lrfurn.on_seat_destruct,
})
minetest.register_craft({

View File

@ -96,10 +96,6 @@ local update_item = function(pos, node)
pos.z = pos.z + posad.z * 6.5 / 16
elseif node.name == "itemframes:pedestal" then
pos.y = pos.y + 12 / 16 + 0.33
local n = meta:get_string("item")
if string.match(n, "spears:spear_") then
pos.y = pos.y + 0.2
end
end
tmp.nodename = node.name
tmp.texture = ItemStack(meta:get_string("item")):get_name()
@ -342,4 +338,3 @@ if minetest.get_modpath("mesecons_mvps") then
mesecon.register_mvps_stopper("itemframes:pedestal")
end
minetest.log("action", "[itemframes] loaded.")