Compare commits

...

4 Commits

1 changed files with 51 additions and 11 deletions

View File

@ -737,7 +737,7 @@ local function get_water_spawn(p)
end
local function has_room(self,pos)
local cb = self.collisionbox
local cb = self.spawnbox or self.collisionbox
local nodes = {}
if self.fly_in then
local t = type(self.fly_in)
@ -748,18 +748,58 @@ local function has_room(self,pos)
end
end
table.insert(nodes,"air")
local x = cb[4] - cb[1]
local y = cb[5] - cb[2]
local z = cb[6] - cb[3]
local r = math.ceil(x * y * z)
local p1 = vector.offset(pos,cb[1],cb[2],cb[3])
local p2 = vector.offset(pos,cb[4],cb[5],cb[6])
local p1 = vector.offset(pos,cb[1],cb[2] + 1,cb[3])
p1.x = math.floor(p1.x)
p1.y = math.floor(p1.y)
p1.z = math.floor(p1.z)
local cb_height = cb[5] - cb[2]
local p2 = vector.offset(p1,cb[4] - cb[1], cb_height, cb[6] - cb[3])
p2.x = math.floor(p2.x)
p2.y = math.floor(p2.y)
p2.z = math.floor(p2.z)
-- Check if the entire spawn volume is free
local dx = p2.x - p1.x + 1
local dy = p2.y - p1.y + 1
local dz = p2.z - p1.z + 1
local n = #minetest.find_nodes_in_area(p1,p2,nodes) or 0
if r > n then
minetest.log("warning","[mcl_mobs] No room for mob "..self.name.." at "..minetest.pos_to_string(vector.round(pos)))
return false
if n == ( dx * dz * dz ) then return true end
-- Make sure the entire volume except for the top level is free before checking the top layer
if dy > 1 then
n = #minetest.find_nodes_in_area(p1, vector.offset(p2, 0, -1, 0), nodes)
if n < (dx * dz * ( dy - 1)) then return false end
end
return true
-- Check the top layer to see if we have enough space to spawn in
local top_layer_height = 1
local processed = {}
for x = p1.x,p2.x do
for z = p1.z,p2.z do
local test_pos = vector.new(x,p2.y,z)
local node = minetest.get_node(test_pos) or { name = "ignore" }
local cache_name = string.format("%s-%d", node.name, node.param2)
if not processed[cache_name] then
-- Calculate node bounding box and select the lowest y value
local boxes = minetest.get_node_boxes("collision_box", test_pos, node)
for i = 1,#boxes do
local box = boxes[i]
local y_test = box[2] + 0.5
if y_test < top_layer_height then top_layer_height = y_test end
local y_test = box[5] + 0.5
if y_test < top_layer_height then top_layer_height = y_test end
end
end
end
end
if top_layer_height + dy - 1 >= cb_height then return true end
-- We don't have room
mcl_log("No room for mob "..self.name.." at "..minetest.pos_to_string(vector.round(pos)))
return false
end
mcl_mobs.custom_biomecheck = nil