2021-12-31 03:42:32 +01:00
local wea = worldeditadditions
2022-09-19 02:16:22 +02:00
local wea_c = worldeditadditions_core
2021-12-31 03:42:32 +01:00
wea.erode = { }
2020-08-18 03:11:37 +02:00
2021-12-31 03:42:32 +01:00
dofile ( wea.modpath .. " /lib/erode/snowballs.lua " )
dofile ( wea.modpath .. " /lib/erode/river.lua " )
2020-08-21 14:27:40 +02:00
2021-12-31 03:42:32 +01:00
function wea . erode . run ( pos1 , pos2 , algorithm , params )
2020-08-21 14:27:40 +02:00
pos1 , pos2 = worldedit.sort_pos ( pos1 , pos2 )
local manip , area = worldedit.manip_helpers . init ( pos1 , pos2 )
local data = manip : get_data ( )
2021-02-26 03:20:53 +01:00
local heightmap_size = {
z = ( pos2.z - pos1.z ) + 1 ,
x = ( pos2.x - pos1.x ) + 1
}
2020-08-21 14:27:40 +02:00
2020-08-21 21:59:50 +02:00
local region_height = ( pos2.y - pos1.y ) + 1
2022-09-19 02:16:22 +02:00
local heightmap = wea_c.terrain . make_heightmap ( pos1 , pos2 , manip , area , data )
local heightmap_eroded = wea_c.table . shallowcopy ( heightmap )
2020-08-21 14:27:40 +02:00
2020-08-21 21:59:50 +02:00
-- print("[erode.run] algorithm: "..algorithm..", params:");
2022-09-19 02:16:22 +02:00
-- print(wea_c.format.map(params))
-- wea_c.format.array_2d(heightmap, heightmap_size.x)
2020-08-21 23:01:24 +02:00
local success , msg , stats
2020-08-21 14:27:40 +02:00
if algorithm == " snowballs " then
2021-12-31 03:42:32 +01:00
success , msg = wea.erode . snowballs (
2021-05-30 01:02:21 +02:00
heightmap , heightmap_eroded ,
heightmap_size ,
region_height ,
params
)
if not success then return success , msg end
elseif algorithm == " river " then
2021-12-31 03:42:32 +01:00
success , msg = wea.erode . river (
2021-05-30 01:02:21 +02:00
heightmap , heightmap_eroded ,
heightmap_size ,
region_height ,
params
)
2020-08-21 14:27:40 +02:00
if not success then return success , msg end
else
2021-05-22 03:36:56 +02:00
-- FUTURE: Add a new "river" algorithm here that:
2021-05-30 00:20:34 +02:00
-- * Fills in blocks that are surrounded on more than 3 horizontal sides
2021-05-22 03:36:56 +02:00
-- * Destroys blocks that have no horizontal neighbours
-- A bit like cellular automata actually.
2021-05-30 01:02:21 +02:00
return false , " Error: Unknown algorithm ' " .. algorithm .. " '. Currently implemented algorithms: snowballs (2d; hydraulic-like), river (2d; cellular automata-like; fills potholes and lowers towers). Ideas for algorithms to implement are welcome! "
2020-08-21 14:27:40 +02:00
end
2022-09-19 02:16:22 +02:00
success , stats = wea_c.terrain . apply_heightmap_changes (
2020-08-21 14:27:40 +02:00
pos1 , pos2 , area , data ,
heightmap , heightmap_eroded , heightmap_size
)
2020-08-21 16:21:10 +02:00
if not success then return success , stats end
2020-08-21 14:27:40 +02:00
worldedit.manip_helpers . finish ( manip , data )
2020-08-21 23:01:24 +02:00
return true , msg , stats
2020-08-21 14:27:40 +02:00
end