mirror of
https://github.com/sbrl/Minetest-WorldEditAdditions.git
synced 2024-11-30 02:43:00 +00:00
Starbeamrainbowlabs
02d95cec46
....unfortunately, it doesn't work yet. Next up is a frankly ridiculous number of print()s to figure out what's going on here
75 lines
2.6 KiB
Lua
75 lines
2.6 KiB
Lua
local wea_c = worldeditadditions_core
|
|
local Vector3 = wea_c.Vector3
|
|
|
|
---
|
|
-- @module worldeditadditions
|
|
|
|
|
|
|
|
-- ███████ ███████ ████████
|
|
-- ██ ██ ██
|
|
-- ███████ █████ ██
|
|
-- ██ ██ ██
|
|
-- ███████ ███████ ██
|
|
|
|
--- Sets the given parameter to the given value.
|
|
-- This function would pair well with worldeditadditions.nodeapply.
|
|
-- @param pos1 Vector3 Position 1 of the define region to operate on.
|
|
-- @param pos2 Vector3 Position 2 of the define region to operate on.
|
|
-- @param param string="param|param2" The name of the parameter to set. Currently possible values:
|
|
--
|
|
-- - **`param`:** Param1, aka the node id.
|
|
-- - **`param2`:** The supplementary parameter that each node has. See also <https://api.minetest.net/nodes/#node-paramtypes>. The node type is set by the mod or game that provides each node in question.
|
|
-- - **`light`:** Sets the light value of all nodes in the defined region.
|
|
-- @param value string|number The value to set the given parameter to. If `param` is set to "param" and `value` is a `string`, then `value` is converted into a number by calling `minetest.get_content_id()`.
|
|
-- @returns bool,table|string true,statistics_table OR false,error_message.
|
|
function worldeditadditions.set(pos1, pos2, mode, value)
|
|
if mode ~= "param" and mode ~= "param2" and mode ~= "light" then
|
|
return false, "Error: Unknown parameter type "..tostring(mode)..". Supported values: param, param2."
|
|
end
|
|
|
|
pos1, pos2 = Vector3.sort(pos1, pos2)
|
|
-- pos2 will always have the highest co-ordinates now
|
|
|
|
local setvalue = value
|
|
if mode == "param" and type(setvalue) == "string" then
|
|
setvalue = minetest.get_content_id(setvalue)
|
|
end
|
|
|
|
-- Initialise statistics
|
|
local stats = { changed = 0 }
|
|
|
|
-- Fetch the nodes in the specified area
|
|
local manip, area = worldedit.manip_helpers.init(pos1, pos2)
|
|
local data = nil
|
|
if mode == "param" then
|
|
data = manip:get_data()
|
|
elseif mode == "param2" then
|
|
data = manip:get_param2_data()
|
|
elseif mode == "light" then
|
|
-- Shortcut!
|
|
manip:set_lighting({ day = setvalue, night = setvalue }, pos1, pos2)
|
|
manip:write_to_map(false)
|
|
manip:update_map()
|
|
return true, stats
|
|
end
|
|
|
|
for i in area:iterp(pos1, pos2) do
|
|
data[i] = setvalue
|
|
stats.changed = stats.changed + 1
|
|
end
|
|
|
|
if mode == "param" then
|
|
manip:set_data(data)
|
|
else
|
|
manip:set_param2_data(data)
|
|
end
|
|
|
|
|
|
-- Save the modified nodes back to disk & return
|
|
-- Can't use worldedit.manip_helpers.finish 'cause of dynamic param/light setting
|
|
manip:write_to_map()
|
|
manip:update_map()
|
|
|
|
return true, stats
|
|
end
|