worldedit.marker1 = {}\r
worldedit.marker2 = {}\r
-worldedit.marker = {}\r
-\r
---wip: use this as a huge entity to make a full worldedit region box\r
-minetest.register_entity(":worldedit:region_cube", {\r
- initial_properties = {\r
- visual = "upright_sprite",\r
- visual_size = {x=1.1, y=1.1},\r
- textures = {"worldedit_pos1.png"},\r
- visual_size = {x=10, y=10},\r
- physical = false,\r
- },\r
- on_step = function(self, dtime)\r
- if self.active == nil then\r
- self.object:remove()\r
- end\r
- end,\r
- on_punch = function(self, hitter)\r
- --wip: remove the entire region marker\r
- end,\r
-})\r
+worldedit.marker_region = {}\r
\r
--marks worldedit region position 1\r
worldedit.mark_pos1 = function(name)\r
if pos1 ~= nil then\r
--add marker\r
worldedit.marker1[name] = minetest.add_entity(pos1, "worldedit:pos1")\r
- worldedit.marker1[name]:get_luaentity().active = true\r
- if pos2 ~= nil then --region defined\r
- worldedit.mark_region(pos1, pos2)\r
+ if worldedit.marker1[name] ~= nil then\r
+ worldedit.marker1[name]:get_luaentity().name = name\r
end\r
end\r
+ worldedit.mark_region(name)\r
end\r
\r
--marks worldedit region position 2\r
if pos2 ~= nil then\r
--add marker\r
worldedit.marker2[name] = minetest.add_entity(pos2, "worldedit:pos2")\r
- worldedit.marker2[name]:get_luaentity().active = true\r
- if pos1 ~= nil then --region defined\r
- worldedit.mark_region(pos1, pos2)\r
+ if worldedit.marker2[name] ~= nil then\r
+ worldedit.marker2[name]:get_luaentity().name = name\r
end\r
end\r
+ worldedit.mark_region(name)\r
end\r
\r
-worldedit.mark_region = function(pos1, pos2)\r
- --make area stay loaded\r
- local manip = minetest.get_voxel_manip()\r
- manip:read_from_map(pos1, pos2)\r
+worldedit.mark_region = function(name)\r
+ local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]\r
\r
- if worldedit.marker[name] ~= nil then --marker already exists\r
- --wip: remove markers\r
+ if worldedit.marker_region[name] ~= nil then --marker already exists\r
+ --wip: make the area stay loaded somehow\r
+ for _, entity in ipairs(worldedit.marker_region[name]) do\r
+ entity:remove()\r
+ end\r
+ worldedit.marker_region[name] = nil\r
end\r
if pos1 ~= nil and pos2 ~= nil then\r
- --wip: place markers\r
+ local pos1, pos2 = worldedit.sort_pos(pos1, pos2)\r
+ local thickness = 0.2\r
+ local sizex, sizey, sizez = (1 + pos2.x - pos1.x) / 2, (1 + pos2.y - pos1.y) / 2, (1 + pos2.z - pos1.z) / 2\r
+\r
+ --make area stay loaded\r
+ local manip = minetest.get_voxel_manip()\r
+ manip:read_from_map(pos1, pos2)\r
+\r
+ local markers = {}\r
+\r
+ --XY plane markers\r
+ for _, z in ipairs({pos1.z - 0.5, pos2.z + 0.5}) do\r
+ local marker = minetest.add_entity({x=pos1.x + sizex - 0.5, y=pos1.y + sizey - 0.5, z=z}, "worldedit:region_cube")\r
+ marker:set_properties({\r
+ visual_size={x=sizex * 2, y=sizey * 2},\r
+ collisionbox = {-sizex, -sizey, -thickness, sizex, sizey, thickness},\r
+ })\r
+ marker:get_luaentity().name = name\r
+ table.insert(markers, marker)\r
+ end\r
+\r
+ --YZ plane markers\r
+ for _, x in ipairs({pos1.x - 0.5, pos2.x + 0.5}) do\r
+ local marker = minetest.add_entity({x=x, y=pos1.y + sizey - 0.5, z=pos1.z + sizez - 0.5}, "worldedit:region_cube")\r
+ marker:set_properties({\r
+ visual_size={x=sizez * 2, y=sizey * 2},\r
+ collisionbox = {-thickness, -sizey, -sizez, thickness, sizey, sizez},\r
+ })\r
+ marker:setyaw(math.pi / 2)\r
+ marker:get_luaentity().name = name\r
+ table.insert(markers, marker)\r
+ end\r
+\r
+ worldedit.marker_region[name] = markers\r
end\r
end\r
\r
physical = false,\r
},\r
on_step = function(self, dtime)\r
- if self.active == nil then\r
+ if worldedit.marker1[self.name] == nil then\r
self.object:remove()\r
end\r
end,\r
on_punch = function(self, hitter)\r
self.object:remove()\r
- local name = hitter:get_player_name()\r
- worldedit.marker1[name] = nil\r
+ worldedit.marker1[self.name] = nil\r
end,\r
})\r
\r
physical = false,\r
},\r
on_step = function(self, dtime)\r
- if self.active == nil then\r
+ if worldedit.marker2[self.name] == nil then\r
self.object:remove()\r
end\r
end,\r
on_punch = function(self, hitter)\r
self.object:remove()\r
- local name = hitter:get_player_name()\r
- worldedit.marker2[name] = nil\r
+ worldedit.marker2[self.name] = nil\r
+ end,\r
+})\r
+\r
+minetest.register_entity(":worldedit:region_cube", {\r
+ initial_properties = {\r
+ visual = "upright_sprite",\r
+ visual_size = {x=1.1, y=1.1},\r
+ textures = {"worldedit_cube.png"},\r
+ visual_size = {x=10, y=10},\r
+ physical = false,\r
+ },\r
+ on_step = function(self, dtime)\r
+ if worldedit.marker_region[self.name] == nil then\r
+ self.object:remove()\r
+ return\r
+ end\r
+ end,\r
+ on_punch = function(self, hitter)\r
+ for _, entity in ipairs(worldedit.marker_region[self.name]) do\r
+ entity:remove()\r
+ end\r
+ worldedit.marker_region[self.name] = nil\r
end,\r
})
\ No newline at end of file