From 7ca5e0df3e90261a074b27adb8e5b100e98bc827 Mon Sep 17 00:00:00 2001 From: Sokomine Date: Thu, 13 Feb 2014 03:36:56 +0100 Subject: first commit --- init.lua | 334 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 334 insertions(+) create mode 100644 init.lua (limited to 'init.lua') diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..016d709 --- /dev/null +++ b/init.lua @@ -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, + +}) -- cgit v1.2.3