diff --git a/api.lua b/api.lua index c0f358b..09f7c8a 100644 --- a/api.lua +++ b/api.lua @@ -266,11 +266,9 @@ function mob_class:collision() local prop = self.object:get_properties() local width = -prop.collisionbox[1] + prop.collisionbox[4] + 0.5 - for _,object in pairs(minetest.get_objects_inside_radius(pos, width)) do - - if is_player(object) then - - local pos2 = object:get_pos() + for _,player in pairs(minetest.get_connected_players()) do + local pos2 = player:get_pos() + if pos2:distance(pos) < width then local vec = {x = pos.x - pos2.x, z = pos.z - pos2.z} local force = (width + 0.5) - vector.distance( {x = pos.x, y = 0, z = pos.z}, @@ -2243,12 +2241,11 @@ function mob_class:do_states(dtime) local lp local s = self.object:get_pos() - local objs = minetest.get_objects_inside_radius(s, 3) - for n = 1, #objs do - - if is_player(objs[n]) then - lp = objs[n]:get_pos() + for _,player in pairs(minetest.get_connected_players()) do + local player_pos = player:get_pos() + if player_pos:distance(s) <= 3 then + lp = player_pos break end end @@ -3334,14 +3331,9 @@ function mob_class:mob_expire(pos, dtime) if self.lifetimer <= 0 then -- only despawn away from player - local objs = minetest.get_objects_inside_radius(pos, 15) - - for n = 1, #objs do - - if is_player(objs[n]) then - + for _,player in pairs(minetest.get_connected_players()) do + if player:get_pos():distance(pos) <= 15 then self.lifetimer = 20 - return end end @@ -4064,11 +4056,8 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, inter end -- only spawn a set distance away from player - local objs = minetest.get_objects_inside_radius(pos, mob_nospawn_range) - - for n = 1, #objs do - - if is_player(objs[n]) then + for _,player in pairs(minetest.get_connected_players()) do + if player:get_pos():distance(pos) <= mob_nospawn_range then --print("--- player too close", name) return end diff --git a/spawner.lua b/spawner.lua index ddf6979..86fed39 100644 --- a/spawner.lua +++ b/spawner.lua @@ -153,21 +153,19 @@ minetest.register_abm({ -- spawn mob if player detected and in range if pla > 0 then - local in_range = 0 - local objsp = minetest.get_objects_inside_radius(pos, pla) - - for _, oir in pairs(objsp) do - - if is_player(oir) then - - in_range = 1 + local in_range = false + local players = minetest.get_connected_players() + for i = 1, #players do + local player = players[i] + if player:get_pos():distance(pos) <= pla then + in_range = true break end end -- player not found - if in_range == 0 then + if in_range then return end end