]> git.lizzy.rs Git - worldedit.git/blob - worldedit/code.lua
Fix deserialization of schematics with node names table
[worldedit.git] / worldedit / code.lua
1 --- Lua code execution functions.\r
2 -- @module worldedit.code\r
3 \r
4 --- Executes `code` as a Lua chunk in the global namespace.\r
5 -- @return An error message if the code fails, or nil on success.\r
6 function worldedit.lua(code)\r
7         local func, err = loadstring(code)\r
8         if not func then  -- Syntax error\r
9                 return err\r
10         end\r
11         local good, err = pcall(func)\r
12         if not good then  -- Runtime error\r
13                 return err\r
14         end\r
15         return nil\r
16 end\r
17 \r
18 \r
19 --- Executes `code` as a Lua chunk in the global namespace with the variable\r
20 -- pos available, for each node in a region defined by positions `pos1` and\r
21 -- `pos2`.\r
22 -- @return An error message if the code fails, or nil on success.\r
23 function worldedit.luatransform(pos1, pos2, code)\r
24         pos1, pos2 = worldedit.sort_pos(pos1, pos2)\r
25 \r
26         local factory, err = loadstring("return function(pos) " .. code .. " end")\r
27         if not factory then  -- Syntax error\r
28                 return err\r
29         end\r
30         local func = factory()\r
31 \r
32         worldedit.keep_loaded(pos1, pos2)\r
33 \r
34         local pos = {x=pos1.x, y=0, z=0}\r
35         while pos.x <= pos2.x do\r
36                 pos.y = pos1.y\r
37                 while pos.y <= pos2.y do\r
38                         pos.z = pos1.z\r
39                         while pos.z <= pos2.z do\r
40                                 local good, err = pcall(func, pos)\r
41                                 if not good then -- Runtime error\r
42                                         return err\r
43                                 end\r
44                                 pos.z = pos.z + 1\r
45                         end\r
46                         pos.y = pos.y + 1\r
47                 end\r
48                 pos.x = pos.x + 1\r
49         end\r
50         return nil\r
51 end\r
52 \r