build_over fix and tests
This commit is contained in:
parent
03db7c71ce
commit
6e7ccca254
19
build.lua
19
build.lua
@ -35,15 +35,14 @@ function building_lib.can_build(mapblock_pos, _, building_name, rotation)
|
|||||||
return false, message or "size check '" .. building_def.placement .. "' failed"
|
return false, message or "size check '" .. building_def.placement .. "' failed"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- true if the existing building can be built over
|
||||||
|
local build_over_mode = false
|
||||||
|
|
||||||
-- check if we can build over other buildings
|
-- check if we can build over other buildings
|
||||||
if building_def.build_over then
|
if building_def.build_over then
|
||||||
local other_building_info, origin = building_lib.get_placed_building_info(mapblock_pos)
|
local other_building_info, origin = building_lib.get_placed_building_info(mapblock_pos)
|
||||||
if other_building_info then
|
if other_building_info then
|
||||||
-- other building exists, check if it matches
|
-- other building exists, check if it matches
|
||||||
if not vector.equals(other_building_info.size or {x=1,y=1,z=1}, size) then
|
|
||||||
return false, "Existing building has different size"
|
|
||||||
end
|
|
||||||
|
|
||||||
if not vector.equals(origin, mapblock_pos) then
|
if not vector.equals(origin, mapblock_pos) then
|
||||||
return false, "Placement-origin mismatch"
|
return false, "Placement-origin mismatch"
|
||||||
end
|
end
|
||||||
@ -74,8 +73,9 @@ function building_lib.can_build(mapblock_pos, _, building_name, rotation)
|
|||||||
|
|
||||||
if not matches then
|
if not matches then
|
||||||
-- can't build over pointed building
|
-- can't build over pointed building
|
||||||
-- TODO: proper pointed position
|
|
||||||
return false, "Existing building can't be built over"
|
return false, "Existing building can't be built over"
|
||||||
|
else
|
||||||
|
build_over_mode = true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -87,9 +87,12 @@ function building_lib.can_build(mapblock_pos, _, building_name, rotation)
|
|||||||
break
|
break
|
||||||
end
|
end
|
||||||
|
|
||||||
local is_free = check_free(offset_mapblock_pos)
|
if not build_over_mode then
|
||||||
if not is_free then
|
-- check if the area is free
|
||||||
return false, "Space already occupied at " .. minetest.pos_to_string(offset_mapblock_pos)
|
local is_free = check_free(offset_mapblock_pos)
|
||||||
|
if not is_free then
|
||||||
|
return false, "Space already occupied at " .. minetest.pos_to_string(offset_mapblock_pos)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local success
|
local success
|
||||||
|
@ -9,6 +9,13 @@ building_lib.register_building("building_lib:dummy", {
|
|||||||
placement = "dummy"
|
placement = "dummy"
|
||||||
})
|
})
|
||||||
|
|
||||||
|
building_lib.register_building("building_lib:dummy_v2", {
|
||||||
|
placement = "dummy",
|
||||||
|
build_over = {
|
||||||
|
names = {"building_lib:dummy"}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
mtt.register("build", function(callback)
|
mtt.register("build", function(callback)
|
||||||
local mapblock_pos = {x=0, y=0, z=0}
|
local mapblock_pos = {x=0, y=0, z=0}
|
||||||
local building_name = "building_lib:dummy"
|
local building_name = "building_lib:dummy"
|
||||||
@ -34,6 +41,11 @@ mtt.register("build", function(callback)
|
|||||||
assert(err)
|
assert(err)
|
||||||
assert(not success)
|
assert(not success)
|
||||||
|
|
||||||
|
-- try to build over with v2 building
|
||||||
|
success, err = building_lib.can_build(mapblock_pos, playername, building_name .. "_v2", rotation)
|
||||||
|
assert(not err, err)
|
||||||
|
assert(success)
|
||||||
|
|
||||||
-- check
|
-- check
|
||||||
local info = building_lib.get_placed_building_info(mapblock_pos)
|
local info = building_lib.get_placed_building_info(mapblock_pos)
|
||||||
assert(info.name == building_name)
|
assert(info.name == building_name)
|
||||||
|
@ -91,6 +91,14 @@ minetest.register_tool("building_lib:place", {
|
|||||||
on_step = function(itemstack, player)
|
on_step = function(itemstack, player)
|
||||||
local playername = player:get_player_name()
|
local playername = player:get_player_name()
|
||||||
local mapblock_pos1 = building_lib.get_pointed_mapblock(player)
|
local mapblock_pos1 = building_lib.get_pointed_mapblock(player)
|
||||||
|
local rotation = building_lib.get_build_rotation(player)
|
||||||
|
|
||||||
|
local placed_building_info, placed_building_origin = building_lib.get_placed_building_info(mapblock_pos1)
|
||||||
|
if placed_building_info then
|
||||||
|
-- use origin and rotation of existing pointed-at building
|
||||||
|
mapblock_pos1 = placed_building_origin
|
||||||
|
rotation = placed_building_info.rotation
|
||||||
|
end
|
||||||
|
|
||||||
local meta = itemstack:get_meta()
|
local meta = itemstack:get_meta()
|
||||||
local buildingname = meta:get_string("buildingname")
|
local buildingname = meta:get_string("buildingname")
|
||||||
@ -100,7 +108,6 @@ minetest.register_tool("building_lib:place", {
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local rotation = building_lib.get_build_rotation(player)
|
|
||||||
local size = building_lib.get_building_size(building_def, rotation)
|
local size = building_lib.get_building_size(building_def, rotation)
|
||||||
local mapblock_pos2 = vector.add(mapblock_pos1, vector.subtract(size, 1))
|
local mapblock_pos2 = vector.add(mapblock_pos1, vector.subtract(size, 1))
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user