diff --git a/mods/ENTITIES/mcl_mobs/spawning.lua b/mods/ENTITIES/mcl_mobs/spawning.lua index cb3ac8985..f915be0a0 100644 --- a/mods/ENTITIES/mcl_mobs/spawning.lua +++ b/mods/ENTITIES/mcl_mobs/spawning.lua @@ -129,7 +129,9 @@ local function count_mobs_all(categorise_by, pos) local mobs_found_close = {} local num = 0 - for _,entity in pairs(minetest.luaentities) do + local luaentities = core.luaentities + for i=1,#luaentities do + local entity = luaentities[i] if entity and entity.is_mob then local add_entry = false local mob_cat = entity[categorise_by] @@ -165,8 +167,10 @@ local function count_mobs_total_cap(mob_type) local num = 0 local hostile = 0 local non_hostile = 0 - for _,l in pairs(minetest.luaentities) do - if l.is_mob then + local luaentities = core.luaentities + for i = 1,#luaentities do + local l = luaentities[i] + if l and l.is_mob then total = total + 1 local nametagged = l.nametag and l.nametag ~= "" if ( mob_type == nil or l.type == mob_type ) and not nametagged then @@ -176,16 +180,9 @@ local function count_mobs_total_cap(mob_type) non_hostile = non_hostile + 1 end num = num + 1 - else - mcl_log("l.name", l.name) - mcl_log("l.nametag", l.nametag) - end end end - mcl_log("Total mobs", total) - mcl_log("hostile", hostile) - mcl_log("non_hostile", non_hostile) return num, non_hostile, hostile end @@ -439,7 +436,8 @@ local function get_next_mob_spawn_pos(pos) -- Select only the locations at a valid distance local valid_positions = {} - for _,check_pos in ipairs(spawning_position_list) do + for i=1,#spawning_position_list do + local check_pos = spawning_position_list[i] local dist = vector.distance(pos, check_pos) if dist >= MOB_SPAWN_ZONE_INNER and dist <= MOB_SPAWN_ZONE_OUTER then valid_positions[#valid_positions + 1] = check_pos @@ -449,12 +447,10 @@ local function get_next_mob_spawn_pos(pos) -- No valid locations, failed to find a position if #spawning_position_list == 0 then - mcl_log("Spawning position isn't good. Do not spawn: " .. minetest.pos_to_string(goal_pos)) return nil end -- Pick a random valid location - mcl_log("Spawning positions available: " .. minetest.pos_to_string(goal_pos)) return spawning_position_list[math_random(1, #spawning_position_list)] end @@ -745,7 +741,6 @@ local function build_state_for_position(pos, parent_state) hash_num = hash_num + (state.spawn_passive and 8192 or 0) + (state.spawn_hostile and 16384 or 0) + 32768 * (state.light or 0) state.hash = hash_num - core.log("hash="..hash_num) return state,node end @@ -868,7 +863,7 @@ minetest.register_chatcommand("spawn_mob",{ }) if mobs_spawn then - local function mob_cap_space (pos, mob_type, mob_counts_close, mob_counts_wide, cap_space_hostile, cap_space_non_hostile) + local function mob_cap_space(mob_type, mob_counts_close, mob_counts_wide, cap_space_hostile, cap_space_non_hostile) -- Some mob examples --type = "monster", spawn_class = "hostile", --type = "animal", spawn_class = "passive", @@ -879,51 +874,32 @@ if mobs_spawn then local mob_total_wide = mob_counts_wide[mob_type] if not mob_total_wide then - --mcl_log("none of type found. set as 0") mob_total_wide = 0 end local cap_space_wide = math_max(type_cap - mob_total_wide, 0) - mcl_log("mob_type", mob_type) - mcl_log("cap_space_wide", cap_space_wide) - local cap_space_available if mob_type == "hostile" then - mcl_log("cap_space_global", cap_space_hostile) cap_space_available = math_min(cap_space_hostile, cap_space_wide) else - mcl_log("cap_space_global", cap_space_non_hostile) cap_space_available = math_min(cap_space_non_hostile, cap_space_wide) end local mob_total_close = mob_counts_close[mob_type] if not mob_total_close then - --mcl_log("none of type found. set as 0") mob_total_close = 0 end local cap_space_close = math_max(close_zone_cap - mob_total_close, 0) cap_space_available = math_min(cap_space_available, cap_space_close) - mcl_log("cap_space_close", cap_space_close) - mcl_log("cap_space_available", cap_space_available) - - if false and mob_type == "water" then - mcl_log("mob_type: " .. mob_type .. " and pos: " .. minetest.pos_to_string(pos)) - mcl_log("wide: " .. mob_total_wide .. "/" .. type_cap) - mcl_log("cap_space_wide: " .. cap_space_wide) - mcl_log("close: " .. mob_total_close .. "/" .. close_zone_cap) - mcl_log("cap_space_close: " .. cap_space_close) - end - return cap_space_available end local function find_spawning_position(pos, max_times) local max_loops = max_times or 1 - --mcl_log("mapgen_limit: " .. SPAWN_MAPGEN_LIMIT) while max_loops > 0 do local spawning_position = get_next_mob_spawn_pos(pos) if spawning_position then return spawning_position end @@ -957,10 +933,10 @@ if mobs_spawn then local function get_spawn_list(pos, hostile_limit, passive_limit) -- Check capacity local mob_counts_close, mob_counts_wide = count_mobs_all("spawn_class", pos) - local cap_space_hostile = mob_cap_space(pos, "hostile", mob_counts_close, mob_counts_wide, hostile_limit, passive_limit ) + local cap_space_hostile = mob_cap_space("hostile", mob_counts_close, mob_counts_wide, hostile_limit, passive_limit ) local spawn_hostile = cap_space_hostile > 0 - local cap_space_passive = mob_cap_space(pos, "passive", mob_counts_close, mob_counts_wide, hostile_limit, passive_limit ) + local cap_space_passive = mob_cap_space("passive", mob_counts_close, mob_counts_wide, hostile_limit, passive_limit ) local spawn_passive = cap_space_passive > 0 and math_random(100) < peaceful_percentage_spawned -- Merge light level checks with cap checks @@ -983,7 +959,8 @@ if mobs_spawn then -- Build a spawn list for this state spawn_list = {} - for _,def in pairs(spawn_dictionary) do + for i = 1,#spawn_dictionary do + local def = spawn_dictionary[i] if initial_spawn_check(state, def) then spawn_list[#spawn_list + 1] = def end @@ -1085,9 +1062,7 @@ if mobs_spawn then break end end - mcl_log("Spawning quantity: " .. amount_to_spawn) amount_to_spawn = math_min(amount_to_spawn, cap_space_available) - mcl_log("throttled spawning quantity: " .. amount_to_spawn) if amount_to_spawn > 1 then if logging then @@ -1106,8 +1081,7 @@ if mobs_spawn then minetest.pos_to_string(spawning_position, 1) ) end - local res = mcl_mobs.spawn(spawning_position, mob_def.name) - return res + return mcl_mobs.spawn(spawning_position, mob_def.name) end local count = 0 @@ -1118,20 +1092,21 @@ if mobs_spawn then local cap_space_hostile = math_max(mob_cap.global_hostile - total_hostile, 0) local cap_space_non_hostile = math_max(mob_cap.global_non_hostile - total_non_hostile, 0) - mcl_log("global cap_space_hostile", cap_space_hostile) - mcl_log("global cap_space_non_hostile", cap_space_non_hostile) if total_mobs > mob_cap.total or total_mobs > #players * mob_cap.player then minetest.log("action","[mcl_mobs] global mob cap reached. no cycle spawning.") return end --mob cap per player - for _, player in pairs(players) do - local pos = player:get_pos() - local dimension = mcl_worlds.pos_to_dimension(pos) - -- ignore void and unloaded area - if dimension ~= "void" and dimension ~= "default" then - spawn_a_mob(pos, cap_space_hostile, cap_space_non_hostile) + for i = 1,#players do + local player = players[i] + if player then + local pos = player:get_pos() + local dimension = mcl_worlds.pos_to_dimension(pos) + -- ignore void and unloaded area + if dimension ~= "void" and dimension ~= "default" then + spawn_a_mob(pos, cap_space_hostile, cap_space_non_hostile) + end end end end