1
1
worldedit .marker1 = {}
2
2
worldedit .marker2 = {}
3
- worldedit .marker = {}
4
-
5
- -- wip: use this as a huge entity to make a full worldedit region box
6
- minetest .register_entity (" :worldedit:region_cube" , {
7
- initial_properties = {
8
- visual = " upright_sprite" ,
9
- visual_size = {x = 1.1 , y = 1.1 },
10
- textures = {" worldedit_pos1.png" },
11
- visual_size = {x = 10 , y = 10 },
12
- physical = false ,
13
- },
14
- on_step = function (self , dtime )
15
- if self .active == nil then
16
- self .object :remove ()
17
- end
18
- end ,
19
- on_punch = function (self , hitter )
20
- -- wip: remove the entire region marker
21
- end ,
22
- })
3
+ worldedit .marker_region = {}
23
4
24
5
-- marks worldedit region position 1
25
6
worldedit .mark_pos1 = function (name )
@@ -37,11 +18,11 @@ worldedit.mark_pos1 = function(name)
37
18
if pos1 ~= nil then
38
19
-- add marker
39
20
worldedit .marker1 [name ] = minetest .add_entity (pos1 , " worldedit:pos1" )
40
- worldedit .marker1 [name ]:get_luaentity ().active = true
41
- if pos2 ~= nil then -- region defined
42
- worldedit .mark_region (pos1 , pos2 )
21
+ if worldedit .marker1 [name ] ~= nil then
22
+ worldedit .marker1 [name ]:get_luaentity ().name = name
43
23
end
44
24
end
25
+ worldedit .mark_region (name )
45
26
end
46
27
47
28
-- marks worldedit region position 2
@@ -60,23 +41,58 @@ worldedit.mark_pos2 = function(name)
60
41
if pos2 ~= nil then
61
42
-- add marker
62
43
worldedit .marker2 [name ] = minetest .add_entity (pos2 , " worldedit:pos2" )
63
- worldedit .marker2 [name ]:get_luaentity ().active = true
64
- if pos1 ~= nil then -- region defined
65
- worldedit .mark_region (pos1 , pos2 )
44
+ if worldedit .marker2 [name ] ~= nil then
45
+ worldedit .marker2 [name ]:get_luaentity ().name = name
66
46
end
67
47
end
48
+ worldedit .mark_region (name )
68
49
end
69
50
70
- worldedit .mark_region = function (pos1 , pos2 )
71
- -- make area stay loaded
72
- local manip = minetest .get_voxel_manip ()
73
- manip :read_from_map (pos1 , pos2 )
51
+ worldedit .mark_region = function (name )
52
+ local pos1 , pos2 = worldedit .pos1 [name ], worldedit .pos2 [name ]
74
53
75
- if worldedit .marker [name ] ~= nil then -- marker already exists
76
- -- wip: remove markers
54
+ if worldedit .marker_region [name ] ~= nil then -- marker already exists
55
+ -- wip: make the area stay loaded somehow
56
+ for _ , entity in ipairs (worldedit .marker_region [name ]) do
57
+ entity :remove ()
58
+ end
59
+ worldedit .marker_region [name ] = nil
77
60
end
78
61
if pos1 ~= nil and pos2 ~= nil then
79
- -- wip: place markers
62
+ local pos1 , pos2 = worldedit .sort_pos (pos1 , pos2 )
63
+ local thickness = 0.2
64
+ local sizex , sizey , sizez = (1 + pos2 .x - pos1 .x ) / 2 , (1 + pos2 .y - pos1 .y ) / 2 , (1 + pos2 .z - pos1 .z ) / 2
65
+
66
+ -- make area stay loaded
67
+ local manip = minetest .get_voxel_manip ()
68
+ manip :read_from_map (pos1 , pos2 )
69
+
70
+ local markers = {}
71
+
72
+ -- XY plane markers
73
+ for _ , z in ipairs ({pos1 .z - 0.5 , pos2 .z + 0.5 }) do
74
+ local marker = minetest .add_entity ({x = pos1 .x + sizex - 0.5 , y = pos1 .y + sizey - 0.5 , z = z }, " worldedit:region_cube" )
75
+ marker :set_properties ({
76
+ visual_size = {x = sizex * 2 , y = sizey * 2 },
77
+ collisionbox = {- sizex , - sizey , - thickness , sizex , sizey , thickness },
78
+ })
79
+ marker :get_luaentity ().name = name
80
+ table.insert (markers , marker )
81
+ end
82
+
83
+ -- YZ plane markers
84
+ for _ , x in ipairs ({pos1 .x - 0.5 , pos2 .x + 0.5 }) do
85
+ local marker = minetest .add_entity ({x = x , y = pos1 .y + sizey - 0.5 , z = pos1 .z + sizez - 0.5 }, " worldedit:region_cube" )
86
+ marker :set_properties ({
87
+ visual_size = {x = sizez * 2 , y = sizey * 2 },
88
+ collisionbox = {- thickness , - sizey , - sizez , thickness , sizey , sizez },
89
+ })
90
+ marker :setyaw (math.pi / 2 )
91
+ marker :get_luaentity ().name = name
92
+ table.insert (markers , marker )
93
+ end
94
+
95
+ worldedit .marker_region [name ] = markers
80
96
end
81
97
end
82
98
@@ -91,14 +107,13 @@ minetest.register_entity(":worldedit:pos1", {
91
107
physical = false ,
92
108
},
93
109
on_step = function (self , dtime )
94
- if self .active == nil then
110
+ if worldedit . marker1 [ self .name ] == nil then
95
111
self .object :remove ()
96
112
end
97
113
end ,
98
114
on_punch = function (self , hitter )
99
115
self .object :remove ()
100
- local name = hitter :get_player_name ()
101
- worldedit .marker1 [name ] = nil
116
+ worldedit .marker1 [self .name ] = nil
102
117
end ,
103
118
})
104
119
@@ -113,13 +128,34 @@ minetest.register_entity(":worldedit:pos2", {
113
128
physical = false ,
114
129
},
115
130
on_step = function (self , dtime )
116
- if self .active == nil then
131
+ if worldedit . marker2 [ self .name ] == nil then
117
132
self .object :remove ()
118
133
end
119
134
end ,
120
135
on_punch = function (self , hitter )
121
136
self .object :remove ()
122
- local name = hitter :get_player_name ()
123
- worldedit .marker2 [name ] = nil
137
+ worldedit .marker2 [self .name ] = nil
138
+ end ,
139
+ })
140
+
141
+ minetest .register_entity (" :worldedit:region_cube" , {
142
+ initial_properties = {
143
+ visual = " upright_sprite" ,
144
+ visual_size = {x = 1.1 , y = 1.1 },
145
+ textures = {" worldedit_cube.png" },
146
+ visual_size = {x = 10 , y = 10 },
147
+ physical = false ,
148
+ },
149
+ on_step = function (self , dtime )
150
+ if worldedit .marker_region [self .name ] == nil then
151
+ self .object :remove ()
152
+ return
153
+ end
154
+ end ,
155
+ on_punch = function (self , hitter )
156
+ for _ , entity in ipairs (worldedit .marker_region [self .name ]) do
157
+ entity :remove ()
158
+ end
159
+ worldedit .marker_region [self .name ] = nil
124
160
end ,
125
161
})
0 commit comments