Skip to content

Commit 7b64f5b

Browse files
committed
Add some position validation checks
1 parent 2252859 commit 7b64f5b

File tree

3 files changed

+24
-5
lines changed

3 files changed

+24
-5
lines changed

worldedit/cuboid.lua

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,13 @@ worldedit.cuboid_volumetric_expand = function(name, amount)
1717
delta_dir1, delta_dir2 = worldedit.get_expansion_directions(pos1, pos2)
1818
delta1 = vector.multiply(delta1, delta_dir1)
1919
delta2 = vector.multiply(delta2, delta_dir2)
20-
worldedit.pos1[name] = vector.add(pos1, delta1)
21-
worldedit.pos2[name] = vector.add(pos2, delta2)
20+
local new_pos1 = vector.add(pos1, delta1)
21+
local new_pos2 = vector.add(pos2, delta2)
22+
if not minetest.is_valid_pos(new_pos1) or not minetest.is_valid_pos(new_pos2) then
23+
return false, "Cannot select area outside of the map"
24+
end
25+
worldedit.pos1[name] = new_pos1
26+
worldedit.pos2[name] = new_pos2
2227

2328
return true
2429
end
@@ -91,10 +96,16 @@ worldedit.marker_move = function(name, marker, deltavector)
9196

9297
if marker == 1 then
9398
local pos = worldedit.pos1[name]
94-
worldedit.pos1[name] = vector.add(deltavector, pos)
99+
local new_pos = vector.add(deltavector, pos)
100+
if minetest.is_valid_pos(new_pos) then
101+
worldedit.pos1[name] = new_pos
102+
end
95103
else
96104
local pos = worldedit.pos2[name]
97-
worldedit.pos2[name] = vector.add(deltavector, pos)
105+
local new_pos = vector.add(deltavector, pos)
106+
if minetest.is_valid_pos(new_pos) then
107+
worldedit.pos2[name] = new_pos
108+
end
98109
end
99110

100111
return true

worldedit_commands/init.lua

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,7 @@ worldedit.register_command("pos1", {
526526
if not player then return false end
527527
local pos = player:get_pos()
528528
pos.x, pos.y, pos.z = math.floor(pos.x + 0.5), math.floor(pos.y + 0.5), math.floor(pos.z + 0.5)
529+
if not minetest.is_valid_pos(pos) then return false end
529530
worldedit.pos1[name] = pos
530531
worldedit.mark_pos1(name)
531532
worldedit.player_notify(name, S("position @1 set to @2", 1, minetest.pos_to_string(pos)))
@@ -542,6 +543,7 @@ worldedit.register_command("pos2", {
542543
if not player then return false end
543544
local pos = player:get_pos()
544545
pos.x, pos.y, pos.z = math.floor(pos.x + 0.5), math.floor(pos.y + 0.5), math.floor(pos.z + 0.5)
546+
if not minetest.is_valid_pos(pos) then return false end
545547
worldedit.pos2[name] = pos
546548
worldedit.mark_pos2(name)
547549
worldedit.player_notify(name, S("position @1 set to @2", 2, minetest.pos_to_string(pos)))
@@ -594,7 +596,9 @@ worldedit.register_command("fixedpos", {
594596
if found == nil then
595597
return false
596598
end
597-
return true, flag, vector.new(tonumber(x), tonumber(y), tonumber(z))
599+
local pos = vector.new(tonumber(x), tonumber(y), tonumber(z))
600+
if not minetest.is_valid_pos(pos) then return false end
601+
return true, flag, pos
598602
end,
599603
func = function(name, flag, pos)
600604
if flag == "set1" then

worldedit_commands/safe.lua

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@ minetest.register_chatcommand("/n", {
9090
})
9191

9292
local function safe_area(name, pos1, pos2)
93+
if not minetest.is_valid_pos(pos1) or not minetest.is_valid_pos(pos2) then
94+
return false
95+
end
96+
9397
if abs(pos2.x - pos1.x) + 1 > max_size or abs(pos2.x - pos1.x) + 1 > max_size or
9498
abs(pos2.z - pos1.z) + 1 > max_size then
9599
worldedit.player_notify(name, S("Your selected area is too big, you can only select areas up to @1 × @2 × @3",

0 commit comments

Comments
 (0)