forked from Mirrorlandia_minetest/minetest
Dungeongen: Fix out-of-voxelmanip access segfault
My recent dungeon commit allowed stairs to be placed across the full width of corridors, but some of the new node positions accessed were missing checks for being within the voxelmanip, causing occasional segfaults near dungeons with corridors wider than 1 node. Add 'vm->m_area.contains(pos)' checks just before stair position voxelmanip access. This allows an earlier check to be removed as it is now redundant.
This commit is contained in:
parent
08911160aa
commit
9f108b56d3
@ -415,8 +415,8 @@ void DungeonGen::makeCorridor(v3s16 doorplace, v3s16 doordir,
|
|||||||
if (partcount != 0)
|
if (partcount != 0)
|
||||||
p.Y += make_stairs;
|
p.Y += make_stairs;
|
||||||
|
|
||||||
if (vm->m_area.contains(p) && vm->m_area.contains(p + v3s16(0, 1, 0)) &&
|
// Check segment of minimum size corridor is in voxelmanip
|
||||||
vm->m_area.contains(v3s16(p.X - dir.X, p.Y - 1, p.Z - dir.Z))) {
|
if (vm->m_area.contains(p) && vm->m_area.contains(p + v3s16(0, 1, 0))) {
|
||||||
if (make_stairs) {
|
if (make_stairs) {
|
||||||
makeFill(p + v3s16(-1, -1, -1),
|
makeFill(p + v3s16(-1, -1, -1),
|
||||||
dp.holesize + v3s16(2, 3, 2),
|
dp.holesize + v3s16(2, 3, 2),
|
||||||
@ -444,11 +444,13 @@ void DungeonGen::makeCorridor(v3s16 doorplace, v3s16 doordir,
|
|||||||
|
|
||||||
for (u16 st = 0; st < stair_width; st++) {
|
for (u16 st = 0; st < stair_width; st++) {
|
||||||
u32 vi = vm->m_area.index(ps.X - dir.X, ps.Y - 1, ps.Z - dir.Z);
|
u32 vi = vm->m_area.index(ps.X - dir.X, ps.Y - 1, ps.Z - dir.Z);
|
||||||
if (vm->m_data[vi].getContent() == dp.c_wall)
|
if (vm->m_area.contains(ps + v3s16(-dir.X, -1, -dir.Z)) &&
|
||||||
|
vm->m_data[vi].getContent() == dp.c_wall)
|
||||||
vm->m_data[vi] = MapNode(dp.c_stair, 0, facedir);
|
vm->m_data[vi] = MapNode(dp.c_stair, 0, facedir);
|
||||||
|
|
||||||
vi = vm->m_area.index(ps.X, ps.Y, ps.Z);
|
vi = vm->m_area.index(ps.X, ps.Y, ps.Z);
|
||||||
if (vm->m_data[vi].getContent() == dp.c_wall)
|
if (vm->m_area.contains(ps) &&
|
||||||
|
vm->m_data[vi].getContent() == dp.c_wall)
|
||||||
vm->m_data[vi] = MapNode(dp.c_stair, 0, facedir);
|
vm->m_data[vi] = MapNode(dp.c_stair, 0, facedir);
|
||||||
|
|
||||||
ps += swv;
|
ps += swv;
|
||||||
|
Loading…
Reference in New Issue
Block a user