215 lines
6.5 KiB
Lua
215 lines
6.5 KiB
Lua
|
|
|
|
|
|
local Asciugamano_list = {
|
|
{ "Red Asciugamano", "red"},
|
|
{ "Orange Asciugamano", "orange"},
|
|
{ "Black Asciugamano", "black"},
|
|
{ "Yellow Asciugamano", "yellow"},
|
|
{ "Green Asciugamano", "green"},
|
|
{ "Blue Asciugamano", "blue"},
|
|
{ "Violet Asciugamano", "violet"},
|
|
}
|
|
|
|
for i in ipairs(Asciugamano_list) do
|
|
local asciugamanodesc = Asciugamano_list[i][1]
|
|
local colour = Asciugamano_list[i][2]
|
|
|
|
|
|
|
|
|
|
minetest.register_node("summer:asciugamano_"..colour.."", {
|
|
description = asciugamanodesc.."",
|
|
drawtype = "mesh",
|
|
mesh = "asciugamano.obj",
|
|
tiles = {"asciugsmano_"..colour..".png",
|
|
},
|
|
inventory_image = "asciugsmano_a_"..colour..".png",
|
|
|
|
wield_image = "asciugsmano_a_"..colour..".png",
|
|
paramtype = "light",
|
|
paramtype2 = "facedir",
|
|
sunlight_propagates = true,
|
|
walkable = false,
|
|
selection_box = {
|
|
type = "fixed",
|
|
fixed = { -1.0, -0.5,-0.5, 1.0,-0.49, 0.5 },
|
|
},
|
|
groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3,not_in_creative_inventory=0},
|
|
--sounds = default.node_sound_wood_defaults(),
|
|
drop = "summer:asciugamano_"..colour.."",
|
|
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
|
|
return minetest.sleep_in_asciugamano( pos, node, clicker, itemstack, pointed_thing );
|
|
end
|
|
|
|
|
|
})
|
|
|
|
|
|
minetest.allow_sit = function( player )
|
|
-- no check possible
|
|
if( not( player.get_player_velocity )) then
|
|
return true;
|
|
end
|
|
local velo = player:get_player_velocity();
|
|
if( not( velo )) then
|
|
return false;
|
|
end
|
|
local max_velo = 0.0010;
|
|
if( math.abs(velo.x) < max_velo
|
|
and math.abs(velo.y) < max_velo
|
|
and math.abs(velo.z) < max_velo ) then
|
|
return true;
|
|
end
|
|
return false;
|
|
end
|
|
|
|
|
|
|
|
minetest.sleep_in_asciugamano = function( pos, node, clicker, itemstack, pointed_thing )
|
|
if( not( clicker ) or not( node ) or not( node.name ) or not( pos ) or not( minetest.allow_sit( clicker))) then
|
|
return;
|
|
end
|
|
|
|
local animation = default.player_get_animation( clicker );
|
|
local pname = clicker:get_player_name();
|
|
|
|
local place_name = 'place';
|
|
-- if only one node is present, the player can only sit;
|
|
-- sleeping requires a asciugamano head+foot or two sleeping mats
|
|
local allow_sleep = false;
|
|
local new_animation = 'lay';
|
|
|
|
-- let players get back up
|
|
if( animation and animation.animation=="lay" ) then
|
|
default.player_attached[pname] = false
|
|
clicker:setpos({x=pos.x,y=pos.y-0.5,z=pos.z})
|
|
clicker:set_eye_offset({x=0,y=0,z=0}, {x=0,y=0,z=0})
|
|
clicker:set_physics_override({1, 1, 1})
|
|
default.player_set_animation(clicker, "stand", 30)
|
|
minetest.chat_send_player( pname, 'That was enough sleep for now. You stand up again.');
|
|
return;
|
|
end
|
|
|
|
local second_node_pos = {x=pos.x, y=pos.y, z=pos.z};
|
|
-- the node that will contain the head of the player
|
|
local p = {x=pos.x, y=pos.y, z=pos.z};
|
|
-- the player's head is pointing in this direction
|
|
local dir = node.param2;
|
|
-- it would be odd to sleep in half a asciugamano
|
|
if( node.name=="summer:asciugamano_"..colour.."" ) then
|
|
if( node.param2==0 ) then
|
|
second_node_pos.z = pos.z-1;
|
|
elseif( node.param2==1) then
|
|
second_node_pos.x = pos.x-1;
|
|
elseif( node.param2==2) then
|
|
second_node_pos.z = pos.z+1;
|
|
elseif( node.param2==3) then
|
|
second_node_pos.x = pos.x+1;
|
|
end
|
|
local node2 = minetest.get_node( second_node_pos );
|
|
if( not( node2 ) or not( node2.param2 ) or not( node.param2 )
|
|
or node2.name ~= "summer:asciugamano_"..colour..""
|
|
or node2.param2 ~= node.param2 ) then
|
|
allow_sleep = false;
|
|
else
|
|
allow_sleep = true;
|
|
end
|
|
place_name = "asciugamano_"..colour.."";
|
|
|
|
-- if the player clicked on the foot of the asciugamano, locate the head
|
|
elseif( node.name=='summer:asciugamano' ) then
|
|
if( node.param2==2 ) then
|
|
second_node_pos.z = pos.z-1;
|
|
elseif( node.param2==3) then
|
|
second_node_pos.x = pos.x-1;
|
|
elseif( node.param2==0) then
|
|
second_node_pos.z = pos.z+1;
|
|
elseif( node.param2==1) then
|
|
second_node_pos.x = pos.x+1;
|
|
end
|
|
local node2 = minetest.get_node( second_node_pos );
|
|
if( not( node2 ) or not( node2.param2 ) or not( node.param2 )
|
|
or node2.name ~= 'summer:asciugamano'
|
|
or node2.param2 ~= node.param2 ) then
|
|
allow_sleep = false;
|
|
else
|
|
allow_sleep = true;
|
|
end
|
|
if( allow_sleep==true ) then
|
|
p = {x=second_node_pos.x, y=second_node_pos.y, z=second_node_pos.z};
|
|
end
|
|
place_name = 'asciugamano';
|
|
|
|
elseif( node.name=='summer:sleeping_mat' or node.name=='summer:straw_mat') then
|
|
place_name = 'mat';
|
|
dir = node.param2;
|
|
allow_sleep = false;
|
|
-- search for a second mat right next to this one
|
|
local offset = {{x=0,z=-1}, {x=-1,z=0}, {x=0,z=1}, {x=1,z=0}};
|
|
for i,off in ipairs( offset ) do
|
|
node2 = minetest.get_node( {x=pos.x+off.x, y=pos.y, z=pos.z+off.z} );
|
|
if( node2.name == 'summer:sleeping_mat' or node2.name=='summer:straw_mat' ) then
|
|
-- if a second mat is found, sleeping is possible
|
|
allow_sleep = true;
|
|
dir = i-1;
|
|
end
|
|
end
|
|
end
|
|
|
|
-- set the right height for the asciugamano
|
|
if( place_name=='asciugamano' ) then
|
|
p.y = p.y-0.4;
|
|
end
|
|
if( allow_sleep==true ) then
|
|
-- set the right position (middle of the asciugamano)
|
|
if( dir==0 ) then
|
|
p.z = p.z-0.5;
|
|
elseif( dir==1 ) then
|
|
p.x = p.x-0.5;
|
|
elseif( dir==2 ) then
|
|
p.z = p.z+0.5;
|
|
elseif( dir==3 ) then
|
|
p.x = p.x+0.5;
|
|
end
|
|
end
|
|
|
|
if( default.player_attached[pname] and animation.animation=="sit") then
|
|
-- just changing the animation...
|
|
if( allow_sleep==true ) then
|
|
default.player_set_animation(clicker, "lay", 30)
|
|
clicker:set_eye_offset({x=0,y=-14,z=2}, {x=0,y=0,z=0})
|
|
minetest.chat_send_player( pname, 'You lie down and take a nap. A right-click will wake you up.');
|
|
return;
|
|
-- no sleeping on this place
|
|
else
|
|
default.player_attached[pname] = false
|
|
clicker:setpos({x=pos.x,y=pos.y-0.5,z=pos.z})
|
|
clicker:set_eye_offset({x=0,y=0,z=0}, {x=0,y=0,z=0})
|
|
clicker:set_physics_override({1, 1, 1})
|
|
default.player_set_animation(clicker, "stand", 30)
|
|
minetest.chat_send_player( pname, 'That was enough sitting around for now. You stand up again.');
|
|
return;
|
|
end
|
|
end
|
|
|
|
|
|
clicker:set_eye_offset({x=0,y=-7,z=2}, {x=0,y=0,z=0})
|
|
clicker:setpos( p );
|
|
default.player_set_animation(clicker, new_animation, 30)
|
|
clicker:set_physics_override({0, 0, 0})
|
|
default.player_attached[pname] = true
|
|
|
|
if( allow_sleep==true) then
|
|
minetest.chat_send_player( pname, 'Aaah! What a comftable '..place_name..'. A second right-click will let you sleep.');
|
|
else
|
|
minetest.chat_send_player( pname, 'Comftable, but not good enough for a nap. Right-click again if you want to get back up.');
|
|
end
|
|
end
|
|
|
|
|
|
|
|
end
|
|
--state=true: lay, state=false: stand up
|
|
|