2015-07-02 16:38:02 +02:00
local function mapfix ( minp , maxp )
local vm = minetest.get_voxel_manip ( minp , maxp )
vm : update_liquids ( )
vm : write_to_map ( )
vm : update_map ( )
2017-02-22 18:24:35 +01:00
local emin , emax = vm : get_emerged_area ( )
print ( minetest.pos_to_string ( emin ) , minetest.pos_to_string ( emax ) )
2015-07-02 16:38:02 +02:00
end
2015-10-04 23:01:59 +02:00
local previous = os.time ( )
2015-07-02 16:38:02 +02:00
2017-02-22 17:54:43 +01:00
local default_size = tonumber ( minetest.setting_get ( " mapfix_default_size " ) ) or 24
local max_size = tonumber ( minetest.setting_get ( " mapfix_max_size " ) ) or 32
2015-07-02 16:38:02 +02:00
local delay = tonumber ( minetest.setting_get ( " mapfix_delay " ) ) or 15
2014-11-30 20:19:22 +01:00
minetest.register_chatcommand ( " mapfix " , {
params = " <size> " ,
2014-11-30 21:57:35 +01:00
description = " Recalculate the flowing liquids and the light of a chunk " ,
2014-11-30 20:19:22 +01:00
func = function ( name , param )
2017-02-22 17:54:43 +01:00
local pos = vector.round ( minetest.get_player_by_name ( name ) : getpos ( ) )
2015-10-04 23:01:59 +02:00
local size = tonumber ( param ) or default_size
2017-02-22 18:24:35 +01:00
if size >= 121 then
return false , " Radius is too big "
end
2015-07-02 16:38:02 +02:00
local privs = minetest.check_player_privs ( name , { server = true } )
2015-10-04 15:22:48 +02:00
local time = os.time ( )
2014-11-30 21:57:35 +01:00
2015-07-02 16:38:02 +02:00
if not privs then
2015-10-04 23:01:59 +02:00
if size > max_size then
2015-07-02 16:38:02 +02:00
return false , " You need the server privilege to exceed the radius of " .. max_size .. " blocks "
2015-10-04 15:22:48 +02:00
elseif time - previous < delay then
2015-07-02 16:38:02 +02:00
return false , " Wait at least " .. delay .. " seconds from the previous \" /mapfix \" . "
end
previous = time
2014-11-30 20:19:22 +01:00
end
2014-11-30 21:57:35 +01:00
2017-02-22 18:24:35 +01:00
minetest.log ( " action " , name .. " uses mapfix at " .. minetest.pos_to_string ( vector.round ( pos ) ) .. " with radius " .. size )
2017-02-22 17:54:43 +01:00
size = math.max ( math.floor ( size - 8 ) , 0 ) -- When passed to get_voxel_manip, positions are rounded up, to a multiple of 16 nodes in each direction. By subtracting 8 it's rounded to the nearest chunk border. max is used to avoid negative radius.
local minp = vector.subtract ( pos , size )
local maxp = vector.add ( pos , size )
2014-11-30 21:57:35 +01:00
2015-07-02 16:38:02 +02:00
mapfix ( minp , maxp )
2014-11-30 20:19:22 +01:00
return true , " Done. "
end ,
} )