diff options
| author | Sokomine <wegwerf@anarres.dyndns.org> | 2013-12-30 22:56:49 +0100 | 
|---|---|---|
| committer | Sokomine <wegwerf@anarres.dyndns.org> | 2013-12-30 22:56:49 +0100 | 
| commit | ce166cbba64002e34bc6af6e8341ef6e7240dd25 (patch) | |
| tree | d97e4af95be89d0dfa58b5575ee613df12304caa | |
| parent | af64c0bc4d022b152d354819d37ac299e63c2f17 (diff) | |
added change owner on menu level plus some menu buttons
| -rw-r--r-- | areas.lua | 127 | 
1 files changed, 98 insertions, 29 deletions
| @@ -1,4 +1,6 @@ +-- TODO: offer teleport button? +  -- taken from mobf  local COLOR_RED   = "#FF0000";  local COLOR_GREEN = "#00FF00"; @@ -127,9 +129,31 @@ markers.get_area_list_formspec = function( player, mode, pos, mode_data, selecte        and areas.areas[ id_list[ selected ]] ) then        local this_area = areas.areas[ id_list[ selected ]]; + +      local subareas = {}; +      for i,v in pairs( areas.areas ) do +         if( v.parent and v.parent == id_list[ selected ]) then +            table.insert( subareas, i ); +         end +      end +        formspec = formspec..                 markers.show_compass_marker( 8.5, 3.0, false, pos, this_area.pos1, this_area.pos2 ); + +      if( this_area.parent) then +         formspec = formspec.. +               'button[8.0,0.5;2,0.5;show_parent;'..  +			minetest.formspec_escape( areas.areas[ this_area.parent ].name )..']'; +      end + +      if( #subareas > 0 ) then +         formspec = formspec.. +               'button[8.0,1.0;2,0.5;list_subareas;'.. +                        minetest.formspec_escape( 'List subareas ('..tostring( #subareas )..')')..']'; +      end +  +        if( mode=='player' ) then           formspec = formspec..                 'label[8.0,1.5;'.. @@ -139,6 +163,7 @@ markers.get_area_list_formspec = function( player, mode, pos, mode_data, selecte                 'button[8.0,1.5;2,0.5;list_player_areas;'..  			minetest.formspec_escape( this_area.owner..'\'s areas')..']';        end +     end     -- we need to remember especially the id_list - else it would be impossible to know what the @@ -174,7 +199,7 @@ markers.get_area_desc_formspec = function( id, player, pos )     -- show some buttons only if area is owned by the player     local is_owner  = false; -   -- TODO: offer same view/options for players with the appropriate privs? +     if( this_area.owner == pname ) then        is_owner     = true;     end @@ -183,9 +208,6 @@ markers.get_area_desc_formspec = function( id, player, pos )  	'label[2.5,0.0;Area information and management]'..  	'button_exit[4.7,7.0;1,0.5;abort;OK]'; --- TODO: BUTTON change_owner - -     -- general information about the area     formspec = formspec..  	'label[0.5,1.0;This is area number ]'.. @@ -201,10 +223,10 @@ markers.get_area_desc_formspec = function( id, player, pos )     -- these functions are only available to the owner of the area     if( is_owner ) then        formspec = formspec.. +        'button_exit[8.0,0.0;2,0.5;change_owner;Change owner]'..          'button_exit[8.0,1.0;2,0.5;delete;Delete]'..          'button_exit[8.0,1.5;2,0.5;rename;Rename]'..          'button_exit[8.0,2.0;2,0.5;list_player_areas;My areas]'; ---        'button_exit[8.0,2.0;2,0.5;change_owner;Change owner]'; -- TODO: place that menu button somewhere     -- subareas of own areas can be deleted (but not renamed)     elseif( not( is_owner ) @@ -222,6 +244,16 @@ markers.get_area_desc_formspec = function( id, player, pos )     end +   -- players with the areas priv get an extra menu +   if( minetest.check_player_privs(pname, {areas=true})) then +      formspec = formspec.. +              'label[8.0,6.0;Admin commands:]'.. +        'button_exit[8.0,6.5;2,0.5;change_owner;Change owner]'.. +        'button_exit[8.0,7.0;2,0.5;delete;Delete]'.. +        'button_exit[8.0,7.5;2,0.5;rename;Rename]'; +   end + +     -- show subowners and areas with the same coordinates     formspec = formspec..  	'label[0.5,2.5;Further owners of the entire area:]'; @@ -400,15 +432,16 @@ end  -- formspec input needs to be handled diffrently  markers.form_input_handler_areas = function( player, formname, fields) +   local pname = player:get_player_name();     if( formname ~= "markers:info"        or not( player ) -      or not(  markers.menu_data_by_player[ player:get_player_name() ] )) then +      or not(  markers.menu_data_by_player[ pname ] )) then        return false;     end -   local menu_data = markers.menu_data_by_player[ player:get_player_name() ]; +   local menu_data = markers.menu_data_by_player[ pname ];     local formspec = ''; @@ -416,7 +449,7 @@ markers.form_input_handler_areas = function( player, formname, fields)     if( fields.rename             and menu_data.selected            and areas.areas[ menu_data.selected ] -          and areas.areas[ menu_data.selected ].owner == player:get_player_name() ) then +          and areas.areas[ menu_data.selected ].owner == pname ) then        local area = areas.areas[ menu_data.selected ];        if( not( area.name )) then @@ -426,8 +459,9 @@ markers.form_input_handler_areas = function( player, formname, fields)     elseif( fields.rename_new_name             and menu_data.selected -          and areas.areas[ menu_data.selected ] -          and areas.areas[ menu_data.selected ].owner == player:get_player_name() ) then +          and  areas.areas[ menu_data.selected ] +          and ((areas.areas[ menu_data.selected ].owner == pname )  +            or minetest.check_player_privs(pname, {areas=true}))) then        local area = areas.areas[ menu_data.selected ]; @@ -435,39 +469,72 @@ markers.form_input_handler_areas = function( player, formname, fields)        areas.areas[ menu_data.selected ].name = fields.rename_new_name;        areas:save(); -      minetest.chat_send_player( area.owner, 'Area successfully renamed.'); +      minetest.chat_send_player( pname, 'Area successfully renamed.');        -- shwo the renamed area        formspec = markers.get_area_desc_formspec( menu_data.selected, player, menu_data.pos ); +   -- change owner the area +   elseif( fields.change_owner +          and menu_data.selected +          and areas.areas[ menu_data.selected ] ) then +    +      -- there are no checks here - those happen when the area is transferred +      local area = areas.areas[ menu_data.selected ]; +      formspec = 'field[change_owner_name;Give area \"'..minetest.formspec_escape( area.name )..'\" to player:;-enter name of NEW OWNER-]'; + +   elseif( fields.change_owner_name +          and menu_data.selected +          and areas.areas[ menu_data.selected ] ) then + +      local area = areas.areas[ menu_data.selected ]; + +      -- only own areas can be transfered to another player (or if the areas priv is there) +      if( area.owner ~= pname  +        and not( minetest.check_player_privs(pname, {areas=true}))) then +  +         minetest.chat_send_player( pname, 'Permission denied. You do not own the area.'); + +      elseif( not( areas:player_exists( fields.change_owner_name ))) then + +         minetest.chat_send_player( pname, 'That player does not exist.'); + +      else +         minetest.chat_send_player( pname, 'Your area '..tostring( area.name )..' has been transfered to '..tostring( fields.change_owner_name )..'.'); +   -- TODO: implement change_owner  +      end + +      formspec = markers.get_area_desc_formspec( menu_data.selected, player, menu_data.pos ); + +     -- add an owner to the entire area     elseif( fields.add_owner            and menu_data.selected            and areas.areas[ menu_data.selected ] -          and areas.areas[ menu_data.selected ].owner == player:get_player_name() ) then +          and areas.areas[ menu_data.selected ].owner == pname ) then        local area = areas.areas[ menu_data.selected ];        formspec = 'field[add_owner_name;Grant access to area \"'..minetest.formspec_escape( area.name )..'\" to player:;-enter player name-]';     elseif( fields.add_owner_name                 -- the player has to own the area already; we need a diffrent name here -          and fields.add_owner_name ~= player:get_player_name() +          and fields.add_owner_name ~= pname            and menu_data.selected            and areas.areas[ menu_data.selected ] -          and areas.areas[ menu_data.selected ].owner == player:get_player_name() ) then +          and areas.areas[ menu_data.selected ].owner == pname ) then        local area = areas.areas[ menu_data.selected ];        -- does the player exist?        if( not( areas:player_exists( fields.add_owner_name ))) then -         minetest.chat_send_player( area.owner, 'That player does not exist.'); +         minetest.chat_send_player( pname, 'That player does not exist.');           -- show the formspec           formspec = markers.get_area_desc_formspec( menu_data.selected, player, menu_data.pos );        else           -- log the creation of the new area -         minetest.log("action", player:get_player_name().." runs /add_owner through the markers-mod. Owner = "..fields.add_owner_name.. +         minetest.log("action", pname.." runs /add_owner through the markers-mod. Owner = "..fields.add_owner_name..                                  " AreaName = "..area.name.." ParentID = "..menu_data.selected..                                  " StartPos = "..area.pos1.x..","..area.pos1.y..","..area.pos1.z..                                  " EndPos = "  ..area.pos2.x..","..area.pos2.y..","..area.pos2.z) @@ -481,9 +548,9 @@ markers.form_input_handler_areas = function( player, formname, fields)                                  "You have been granted control over area #"..                                  new_id..". Type /list_areas to show your areas.") -         minetest.chat_send_player( area.owner, 'The player may now build and dig in your area.'); +         minetest.chat_send_player( pname, 'The player may now build and dig in your area.');           -- shwo the new area -         markers.menu_data_by_player[ player:get_player_name() ].selected = new_id; +         markers.menu_data_by_player[ pname ].selected = new_id;           formspec = markers.get_area_desc_formspec( new_id, player, menu_data.pos );        end @@ -497,14 +564,15 @@ markers.form_input_handler_areas = function( player, formname, fields)        local area = areas.areas[ menu_data.selected ];        -- a player can only delete own areas or subareas of own areas -      if( area.owner ~= player:get_player_name()  +      if( area.owner ~= pname           and not(     area.parent                    and areas.areas[ area.parent ]                    and areas.areas[ area.parent ].owner -                 and areas.areas[ area.parent ].owner == player:get_player_name() )) then +                 and areas.areas[ area.parent ].owner == pname ) +        and not( minetest.check_player_privs(pname, {areas=true}))) then -         minetest.chat_send_player( area.owner, 'Permission denied. You own neither the area itshelf nor its parent area.'); -         -- shwo the renamed area +         minetest.chat_send_player( pname, 'Permission denied. You own neither the area itshelf nor its parent area.'); +         -- shwo the area where the renaming failed           formspec = markers.get_area_desc_formspec( menu_data.selected, player, menu_data.pos );        else @@ -530,30 +598,31 @@ markers.form_input_handler_areas = function( player, formname, fields)        end        -- a player can only delete own areas or subareas of own areas -      if( area.owner ~= player:get_player_name()  +      if( area.owner ~= pname           and not(     area.parent                    and areas.areas[ area.parent ]                    and areas.areas[ area.parent ].owner -                 and areas.areas[ area.parent ].owner == player:get_player_name() )) then +                 and areas.areas[ area.parent ].owner == pname ) +        and not( minetest.check_player_privs(pname, {areas=true}))) then -         minetest.chat_send_player( player:get_player_name(), 'Permission denied. You own neither the area itshelf nor its parent area.'); +         minetest.chat_send_player( pname, 'Permission denied. You own neither the area itshelf nor its parent area.');           -- shwo the renamed area           formspec = markers.get_area_desc_formspec( menu_data.selected, player, menu_data.pos );        -- avoid accidents        elseif( fields.delete_confirm ~= 'YES' ) then -         minetest.chat_send_player( player:get_player_name(), 'Delition of area \"'..tostring( area.name )..'\" (owned by '..old_owner..') aborted.'); +         minetest.chat_send_player( pname, 'Delition of area \"'..tostring( area.name )..'\" (owned by '..old_owner..') aborted.');           formspec = markers.get_area_desc_formspec( menu_data.selected, player, menu_data.pos );        -- only areas without subareas can be deleted        elseif( #subareas > 0 ) then  -         minetest.chat_send_player( player:get_player_name(), 'The area has '..tostring( #subareas )..' subarea(s). Please delete those first!'); +         minetest.chat_send_player( pname, 'The area has '..tostring( #subareas )..' subarea(s). Please delete those first!');           formspec = markers.get_area_desc_formspec( menu_data.selected, player, menu_data.pos );        else           -- TODO: really delete -         minetest.chat_send_player( player:get_player_name(), 'Area \"'..tostring( area.name )..'\" (owned by '..old_owner..') deleted.'); +         minetest.chat_send_player( pname, 'Area \"'..tostring( area.name )..'\" (owned by '..old_owner..') deleted.');           -- show the list of areas owned by the previous owner           formspec = markers.get_area_list_formspec( player, 'player',   menu_data.pos, old_owner, nil );        end @@ -615,6 +684,6 @@ markers.form_input_handler_areas = function( player, formname, fields)        return false;     end -   minetest.show_formspec( player:get_player_name(), "markers:info", formspec ) +   minetest.show_formspec( pname, "markers:info", formspec )     return true;  end | 
