first commit

master
Sokomine 2014-02-13 03:36:56 +01:00
commit 7ca5e0df3e
2 changed files with 336 additions and 0 deletions

2
README.md Normal file
View File

@ -0,0 +1,2 @@
Still experimental. Use /giveme apartment:apartment to get a control panel.

334
init.lua Normal file
View File

@ -0,0 +1,334 @@
-- TODO: only one per player
-- TODO: names ought to be ids
apartment = {}
apartment.get_formspec = function( pos, placer )
local meta = minetest.get_meta(pos);
local original_owner = meta:get_string( 'original_owner' );
local owner = meta:get_string( 'owner' );
local descr = meta:get_string( 'descr' );
-- misconfigured
if( not( original_owner ) or original_owner == '' ) then
return 'field[text;;Panel misconfigured. Please dig and place again.] ';
end
-- if a name has been set
if( descr and descr ~= '' ) then
if( original_owner ~= owner and owner ~= '' ) then
return 'size[6,3]'..
'label[2.0,-0.3;Apartment \''..minetest.formspec_escape( descr )..'\']'..
'label[0.5,1.0;This apartment is rented by]'..
'label[3.0,1.0;'..tostring( owner )..'.]'..
'button_exit[3,2.0;2,0.5;unrent;Move out]'..
'button_exit[1,2.0;1,0.5;abort;OK]';
end
return 'size[6,3]'..
'label[2.0,-0.3;Apartment \''..minetest.formspec_escape( descr )..'\']'..
'label[0.5,1.0;Do you want to rent this]'..
'label[3.0,1.0;apartment? It\'s free!]'..
'button_exit[3,2.0;2,0.5;rent;Yes, rent it]'..
'button_exit[1,2.0;1,0.5;abort;No.]';
end
-- defaults that fit to small appartments - change this if needed!
local size_up = 2;
local size_down = 1;
local size_right = 1;
local size_left = 2;
local size_front = 1;
local size_back = 7;
-- show configuration formspec
if( not( owner ) or owner=='' or owner==original_owner ) then
return 'size[7,7]'..
'label[2.0,-0.3;Apartment Configuration]'..
'label[0.5,0.5;Name or number for this apartment:]'..
'field[5.0,1.0;2.0,0.5;descr;;'..tostring( descr )..']'..
'label[0.5,1.2;The apartment shall extend]'..
'label[3.3,1.2;this many blocks from here:]'..
'label[0.5,1.4;(relative to this panel)]'..
'label[1.3,3.5;left:]' ..'field[2.0,4.0;1.0,0.5;size_left;;' ..tostring( size_left )..']'..
'label[4.6,3.5;right]' ..'field[4.0,4.0;1.0,0.5;size_right;;'..tostring( size_right )..']'..
'label[2.8,5.0;front]' ..'field[3.0,5.0;1.0,0.5;size_front;;'..tostring( size_front )..']'..
'label[2.8,2.1;back:]' ..'field[3.0,3.0;1.0,0.5;size_back;;' ..tostring( size_back )..']'..
'label[5.8,2.1;up:]' ..'field[6.0,3.0;1.0,0.5;size_up;;' ..tostring( size_up )..']'..
'label[5.8,5.0;down]' ..'field[6.0,5.0;1.0,0.5;size_down;;' ..tostring( size_down )..']'..
'button_exit[4,6.0;2,0.5;store;Store and offer]'..
'button_exit[1,6.0;1,0.5;abort;Abort]';
end
end
apartment.on_receive_fields = function(pos, formname, fields, player)
local meta = minetest.get_meta(pos);
local pname = player:get_player_name();
local original_owner = meta:get_string( 'original_owner' );
local owner = meta:get_string( 'owner' );
local descr = meta:get_string( 'descr' );
if( not( fields ) or fields.abort or not( original_owner ) or original_owner=='' or not( fields.quit )) then
return;
elseif( not( descr ) or descr=='' ) then
-- only the player who placed the panel can configure it
if( not( fields.store ) or pname ~= original_owner or pname ~= owner) then
if( fields.descr and fields.descr ~= '') then
minetest.chat_send_player( pname, 'Error: Only the owner of this panel can configure it.');
end
return;
end
local size_left = tonumber( fields.size_left or -1);
local size_right = tonumber( fields.size_right or -1);
local size_up = tonumber( fields.size_up or -1);
local size_down = tonumber( fields.size_down or -1);
local size_front = tonumber( fields.size_front or -1);
local size_back = tonumber( fields.size_back or -1);
-- have all fields been filled int?
if( not(fields.store)
or not(size_left ) or size_left < 0 or size_left > 10
or not(size_right ) or size_right< 0 or size_right> 10
or not(size_up ) or size_up < 0 or size_up > 10
or not(size_down ) or size_down < 0 or size_down > 10
or not(size_front ) or size_front< 0 or size_front> 10
or not(size_back ) or size_back < 0 or size_back > 10
or not(fields.descr ) or fields.descr == '') then
minetest.chat_send_player( pname, 'Error: Not all fields have been filled in or the area is too large.');
return;
end
meta:set_int( 'size_up', size_up );
meta:set_int( 'size_down', size_down );
meta:set_int( 'size_right', size_right );
meta:set_int( 'size_left', size_left );
meta:set_int( 'size_front', size_front );
meta:set_int( 'size_back', size_back );
meta:set_string( 'descr', fields.descr );
meta:set_string( 'formspec', apartment.get_formspec( pos, player ));
minetest.chat_send_player( pname, 'Apartment \''..tostring( fields.descr )..'\' is ready for rental.');
return;
elseif( fields.rent and pname == original_owner ) then
minetest.chat_send_player( pname, 'You cannot rent your own appartment. Dig the panel if you no longer want to rent it.');
return;
elseif( fields.rent and owner == pname ) then
minetest.chat_send_player( pname, 'You have already rented this apartment.');
return;
elseif( fields.rent and owner ~= original_owner ) then
minetest.chat_send_player( pname, 'Sorry, this apartment has already been rented to '..tostring( owner )..'.');
return;
-- actually rent the appartment
elseif( fields.rent and not( apartment.rent( pos, pname ))) then
minetest.chat_send_player( pname, 'Sorry. There was an internal error. Please try again later.');
return;
elseif( fields.rent ) then
minetest.chat_send_player( pname, 'You have rented apartment \''..tostring( descr )..'\'. Enjoy your stay!');
meta:set_string( 'formspec', apartment.get_formspec( pos, player ));
return;
elseif( fields.unrent and owner ~= original_owner and owner==pname ) then
if( not( apartment.rent( pos, original_owner ) )) then
minetest.chat_send_player( pname, 'Something wrent wrong when giving back the apartment.');
return;
end
minetest.chat_send_player( pname, 'You have ended your rent of apartment \''..tostring( descr )..'\'. It is free for others to rent again.');
meta:set_string( 'formspec', apartment.get_formspec( pos, player ));
return;
end
end
-- actually rent the apartment (if possible); return true on success
apartment.rent = function( pos, pname )
local node = minetest.env:get_node(pos);
local meta = minetest.get_meta(pos);
local original_owner = meta:get_string( 'original_owner' );
local owner = meta:get_string( 'owner' );
local descr = meta:get_string( 'descr' );
if( not( node ) or not( meta ) or not( original_owner ) or not( owner ) or not( descr )) then
return false;
end
local size_up = meta:get_int( 'size_up' );
local size_down = meta:get_int( 'size_down' );
local size_right = meta:get_int( 'size_right' );
local size_left = meta:get_int( 'size_left' );
local size_front = meta:get_int( 'size_front' );
local size_back = meta:get_int( 'size_back' );
if( not( size_up ) or not( size_down ) or not( size_right ) or not( size_left ) or not( size_front ) or not( size_back )) then
return false;
end
local x1 = pos.x;
local y1 = pos.y;
local z1 = pos.z;
local x2 = pos.x;
local y2 = pos.y;
local z2 = pos.z;
if( node.param2 == 0 ) then -- z gets larger
x1 = x1 - size_left; x2 = x2 + size_right;
z1 = z1 - size_front; z2 = z2 + size_back;
elseif( node.param2 == 1 ) then -- x gets larger
z1 = z1 - size_right; z2 = z2 + size_left;
x1 = x1 - size_front; x2 = x2 + size_back;
elseif( node.param2 == 2 ) then -- z gets smaller
x1 = x1 - size_right; x2 = x2 + size_left;
z1 = z1 - size_back; z2 = z2 + size_front;
elseif( node.param2 == 3 ) then -- x gets smaller
z1 = z1 - size_left; z2 = z2 + size_right;
x1 = x1 - size_back; x2 = x2 + size_front;
end
y1 = y1 - size_down; y2 = y2 + size_up;
local px = x1;
local py = x1;
local pz = z1;
for px = x1, x2 do
for py = y1, y2 do
for pz = z1, z2 do
local m = minetest.get_meta( {x=px, y=py, z=pz});
if( m ) then
local s = m:get_string( 'owner' );
-- doors are diffrent
if( not( s ) or s=='' ) then
s = m:get_string( 'doors_owner' );
end
-- change owner to the new player
if( s and s ~= '' and (s==original_owner or s==owner)) then
-- change the actual owner
m:set_string( 'owner', pname );
-- set a fitting infotext
local itext = "Rented by "..pname;
n = minetest.get_node( {x=px, y=py, z=pz} );
--minetest.chat_send_player( pname, n.name..' found');
if( n.name == 'default:chest_locked' ) then
itext = "Locked Chest (rented by "..pname..")";
elseif( n.name == 'doors:door_steel_b_1' or n.name == 'doors:door_steel_t_1'
or n.name == 'doors:door_steel_b_2' or n.name == 'doors:door_steel_t_2' ) then
itext = "Apartment "..descr.." (rented by "..pname..")";
-- doors use another meta text
m:set_string( 'doors_owner', pname );
elseif( n.name == "technic:iron_locked_chest" ) then
itext = "Iron Locked Chest (rented by "..pname..")";
elseif( n.name == "technic:copper_locked_chest" ) then
itext = "Copper Locked Chest (rented by "..pname..")";
elseif( n.name == "technic:gold_locked_chest" ) then
itext = "Gold Locked Chest (rented by "..pname..")";
end
m:set_string( "infotext", itext );
end
end
end
end
end
return true;
end
minetest.register_node("apartment:apartment", {
drawtype = "nodebox",
description = "apartment management panel",
tiles = {"default_chest_top.png^door_steel.png"},
paramtype = "light",
paramtype2 = "facedir",
light_source = LIGHT_MAX-1,
groups = {cracky=2},
node_box = {
type = "fixed",
fixed = {
{-0.40, -0.4, 0.50, 0.40, 0.40, 0.30},
}
},
selection_box = {
type = "fixed",
fixed = {
{-0.40, -0.4, 0.50, 0.40, 0.40, 0.30},
}
},
on_construct = function(pos)
local meta = minetest.env:get_meta(pos);
meta:set_string('infotext', 'Apartment Management Panel (unconfigured)');
meta:set_string('original_owner', '' );
meta:set_string('owner', '' );
meta:set_string('descr', '' );
meta:set_int( 'size_up', 0 );
meta:set_int( 'size_down', 0 );
meta:set_int( 'size_right', 0 );
meta:set_int( 'size_left', 0 );
meta:set_int( 'size_front', 0 );
meta:set_int( 'size_back', 0 );
end,
after_place_node = function(pos, placer)
local meta = minetest.get_meta(pos);
local pname = (placer:get_player_name() or "");
meta:set_string("original_owner", pname );
meta:set_string("owner", pname );
meta:set_string('infotext', 'Apartment Management Panel (owned by '..pname..')' );
meta:set_string("formspec", apartment.get_formspec( pos, placer ));
end,
on_receive_fields = function( pos, formname, fields, player )
return apartment.on_receive_fields(pos, formname, fields, player);
end,
can_dig = function(pos,player)
local meta = minetest.get_meta(pos);
local owner = meta:get_string('owner');
local original_owner = meta:get_string( 'original_owner' );
local pname = player:get_player_name();
if( original_owner and original_owner ~= pname ) then
minetest.chat_send_player( pname, 'Sorry. Only the original owner of this apartment control panel can dig it.');
return false;
end
if( original_owner and original_owner ~= owner and owner ~= '') then
minetest.chat_send_player( pname, 'The apartment is currently rented to '..tostring( owner )..'. Please end that first.');
return false;
end
return true;
end,
})