forked from mtcontrib/Minetest-WorldEdit
Add //homogenize, //lua, and //luatransform commands, as well as their documentation.
This commit is contained in:
parent
c27ab877f1
commit
e2f1c4ef17
@ -239,3 +239,17 @@ Load nodes and metadata from "(world folder)/schems/<file>.wem" with position 1
|
||||
|
||||
//metaload some random filename
|
||||
//metaload huge_base
|
||||
|
||||
### //lua <code>
|
||||
|
||||
Executes <code> as a Lua chunk in the global namespace.
|
||||
|
||||
//lua worldedit.pos1["singleplayer"] = {x=0, y=0, z=0}
|
||||
//lua worldedit.rotate(worldedit.pos1["singleplayer"], worldedit.pos2["singleplayer"], "y", 90)
|
||||
|
||||
### //luatransform <code>
|
||||
|
||||
Executes <code> as a Lua chunk in the global namespace with the variable pos available, for each node in the current WorldEdit region.
|
||||
|
||||
//luatransform minetest.env:add_node(pos, {name="default:stone"})
|
||||
//luatransform if minetest.env:get_node(pos).name == "air" then minetest.env:add_node(pos, {name="default:water_source"})
|
@ -183,3 +183,19 @@ Returns the number of nodes saved.
|
||||
Loads the nodes and meta from `file` to position `pos1`.
|
||||
|
||||
Returns the number of nodes loaded.
|
||||
|
||||
Code
|
||||
----
|
||||
Contained in code.lua, this module allows arbitrary Lua code to be used with WorldEdit.
|
||||
|
||||
### error = worldedit.lua(code)
|
||||
|
||||
Executes `code` as a Lua chunk in the global namespace.
|
||||
|
||||
Returns an error if the code fails or nil otherwise.
|
||||
|
||||
### error = worldedit.luatransform(pos1, pos2, code)
|
||||
|
||||
Executes `code` as a Lua chunk in the global namespace with the variable pos available, for each node in a region defined by positions `pos1` and `pos2`.
|
||||
|
||||
Returns an error if the code fails or nil otherwise.
|
43
worldedit/code.lua
Normal file
43
worldedit/code.lua
Normal file
@ -0,0 +1,43 @@
|
||||
worldedit = worldedit or {}
|
||||
|
||||
--executes `code` as a Lua chunk in the global namespace, returning an error if the code fails or nil otherwise
|
||||
worldedit.lua = function(code)
|
||||
local operation, message = loadstring(code)
|
||||
if operation == nil then --code parsing failed
|
||||
return message
|
||||
end
|
||||
local status, message = pcall(operation)
|
||||
if status == nil then --operation failed
|
||||
return message
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
--executes `code` as a Lua chunk in the global namespace with the variable pos available, for each node in a region defined by positions `pos1` and `pos2`, returning an error if the code fails or nil otherwise
|
||||
worldedit.luatransform = function(pos1, pos2, code)
|
||||
local pos1, pos2 = worldedit.sort_pos(pos1, pos2)
|
||||
|
||||
local factory, message = loadstring("return function(pos) " .. code .. " end")
|
||||
if factory == nil then --code parsing failed
|
||||
return message
|
||||
end
|
||||
local operation = factory()
|
||||
|
||||
local pos = {x=pos1.x, y=0, z=0}
|
||||
while pos.x <= pos2.x do
|
||||
pos.y = pos1.y
|
||||
while pos.y <= pos2.y do
|
||||
pos.z = pos1.z
|
||||
while pos.z <= pos2.z do
|
||||
local status, message = pcall(operation, pos)
|
||||
if status == nil then --operation failed
|
||||
return message
|
||||
end
|
||||
pos.z = pos.z + 1
|
||||
end
|
||||
pos.y = pos.y + 1
|
||||
end
|
||||
pos.x = pos.x + 1
|
||||
end
|
||||
return nil
|
||||
end
|
@ -1,4 +1,6 @@
|
||||
dofile(minetest.get_modpath("worldedit") .. "/manipulations.lua")
|
||||
dofile(minetest.get_modpath("worldedit") .. "/primitives.lua")
|
||||
dofile(minetest.get_modpath("worldedit") .. "/visualization.lua")
|
||||
dofile(minetest.get_modpath("worldedit") .. "/serialization.lua")
|
||||
local path = minetest.get_modpath("worldedit")
|
||||
dofile(path .. "/manipulations.lua")
|
||||
dofile(path .. "/primitives.lua")
|
||||
dofile(path .. "/visualization.lua")
|
||||
dofile(path .. "/serialization.lua")
|
||||
dofile(path .. "/code.lua")
|
@ -169,7 +169,7 @@ minetest.register_chatcommand("/set", {
|
||||
|
||||
minetest.register_chatcommand("/replace", {
|
||||
params = "<search node> <replace node>",
|
||||
description = "Replace all instances of <search node> with <place node> in the current WorldEdit region",
|
||||
description = "Replace all instances of <search node> with <replace node> in the current WorldEdit region",
|
||||
privs = {worldedit=true},
|
||||
func = function(name, param)
|
||||
local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]
|
||||
@ -197,6 +197,27 @@ minetest.register_chatcommand("/replace", {
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_chatcommand("/homogenize", {
|
||||
params = "<node>",
|
||||
description = "Replace all non-air nodes with <node> in the current WorldEdit region",
|
||||
privs = {worldedit=true},
|
||||
func = function(name, param)
|
||||
local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]
|
||||
if pos1 == nil or pos2 == nil then
|
||||
minetest.chat_send_player(name, "No WorldEdit region selected")
|
||||
return
|
||||
end
|
||||
|
||||
if not worldedit.node_is_valid(param) then
|
||||
minetest.chat_send_player(name, "Invalid node name: " .. param)
|
||||
return
|
||||
end
|
||||
|
||||
local count = worldedit.homogenize(pos1, pos2, param)
|
||||
minetest.chat_send_player(name, count .. " nodes homogenized")
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_chatcommand("/hollowsphere", {
|
||||
params = "<radius> <node>",
|
||||
description = "Add hollow sphere at WorldEdit position 1 with radius <radius>, composed of <node>",
|
||||
@ -811,9 +832,43 @@ minetest.register_chatcommand("/metaload", {
|
||||
end
|
||||
local count, err = worldedit.metaload(pos1, param)
|
||||
if err then
|
||||
minetest.chat_send_player(name, "error loading file: " .. err)
|
||||
minetest.chat_send_player(name, "Error loading file: " .. err)
|
||||
else
|
||||
minetest.chat_send_player(name, count .. " nodes loaded")
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_chatcommand("/lua", {
|
||||
params = "<code>",
|
||||
description = "Executes <code> as a Lua chunk in the global namespace",
|
||||
privs = {worldedit=true},
|
||||
func = function(name, param)
|
||||
local err = worldedit.lua(param)
|
||||
if err then
|
||||
minetest.chat_send_player(name, "Code error: " .. err)
|
||||
else
|
||||
minetest.chat_send_player(name, "Code successfully executed")
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_chatcommand("/luatransform", {
|
||||
params = "<code>",
|
||||
description = "Executes <code> as a Lua chunk in the global namespace with the variable pos available, for each node in the current WorldEdit region",
|
||||
privs = {worldedit=true},
|
||||
func = function(name, param)
|
||||
local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]
|
||||
if pos1 == nil or pos2 == nil then
|
||||
minetest.chat_send_player(name, "No WorldEdit region selected")
|
||||
return
|
||||
end
|
||||
|
||||
local err = worldedit.luatransform(pos1, pos2, param)
|
||||
if err then
|
||||
minetest.chat_send_player(name, "Code error: " .. err)
|
||||
else
|
||||
minetest.chat_send_player(name, "Code successfully executed")
|
||||
end
|
||||
end,
|
||||
})
|
Loading…
Reference in New Issue
Block a user