From a76fe2b4875fa02e59edda08663a95432f1a6b4f Mon Sep 17 00:00:00 2001 From: kay27 Date: Sun, 11 Apr 2021 01:54:40 +0400 Subject: [PATCH] [mcl_mobs] Replace `goto` to `repeat-break-until true` in spawning.lua --- mods/ENTITIES/mcl_mobs/spawning.lua | 164 ++++++++++++++-------------- 1 file changed, 82 insertions(+), 82 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/spawning.lua b/mods/ENTITIES/mcl_mobs/spawning.lua index 206dfdd41e..ff52128dfb 100644 --- a/mods/ENTITIES/mcl_mobs/spawning.lua +++ b/mods/ENTITIES/mcl_mobs/spawning.lua @@ -535,114 +535,114 @@ end --todo mob limiting --MAIN LOOP + if mobs_spawn then - local timer = 0 - minetest.register_globalstep(function(dtime) - timer = timer + dtime - if timer >= 8 then - timer = 0 - for _,player in ipairs(minetest.get_connected_players()) do - for i = 1,math.random(3,8) do + local timer = 0 + minetest.register_globalstep(function(dtime) + timer = timer + dtime + if timer >= 8 then + timer = 0 + for _,player in pairs(minetest.get_connected_players()) do + for i = 1,math_random(3,8) do + repeat -- after this line each "break" means "continue" + local player_pos = player:get_pos() - local player_pos = player:get_pos() + local _,dimension = mcl_worlds.y_to_layer(player_pos.y) - local _,dimension = mcl_worlds.y_to_layer(player_pos.y) - - if dimension == "void" or dimension == "default" then - goto continue -- ignore void and unloaded area - end + if dimension == "void" or dimension == "default" then + break -- ignore void and unloaded area + end - local min,max = decypher_limits(player_pos.y) + local min,max = decypher_limits(player_pos.y) - local goal_pos = position_calculation(player_pos) + local goal_pos = position_calculation(player_pos) - local spawning_position_list = find_nodes_in_area_under_air(new_vector(goal_pos.x,min,goal_pos.z), vector.new(goal_pos.x,max,goal_pos.z), {"group:solid", "group:water", "group:lava"}) + local spawning_position_list = find_nodes_in_area_under_air(new_vector(goal_pos.x,min,goal_pos.z), vector.new(goal_pos.x,max,goal_pos.z), {"group:solid", "group:water", "group:lava"}) - --couldn't find node - if #spawning_position_list <= 0 then - goto continue - end + --couldn't find node + if #spawning_position_list <= 0 then + break + end - local spawning_position = spawning_position_list[math_random(1,#spawning_position_list)] + local spawning_position = spawning_position_list[math_random(1,#spawning_position_list)] - --Prevent strange behavior/too close to player - if not spawning_position or vector_distance(player_pos, spawning_position) < 15 then - goto continue - end + --Prevent strange behavior/too close to player + if not spawning_position or vector_distance(player_pos, spawning_position) < 15 then + break + end - local gotten_node = get_node(spawning_position).name + local gotten_node = get_node(spawning_position).name - if not gotten_node or gotten_node == "air" then --skip air nodes - goto continue - end + if not gotten_node or gotten_node == "air" then --skip air nodes + break + end - local gotten_biome = minetest.get_biome_data(spawning_position) + local gotten_biome = minetest.get_biome_data(spawning_position) - if not gotten_biome then - goto continue --skip if in unloaded area - end + if not gotten_biome then + break --skip if in unloaded area + end - gotten_biome = get_biome_name(gotten_biome.biome) --makes it easier to work with + gotten_biome = get_biome_name(gotten_biome.biome) --makes it easier to work with - --grab random mob - local mob_def = spawn_dictionary[math.random(1,#spawn_dictionary)] + --grab random mob + local mob_def = spawn_dictionary[math.random(1,#spawn_dictionary)] - if not mob_def then - goto continue --skip if something ridiculous happens (nil mob def) - end + if not mob_def then + break --skip if something ridiculous happens (nil mob def) + end - --skip if not correct dimension - if mob_def.dimension ~= dimension then - goto continue - end + --skip if not correct dimension + if mob_def.dimension ~= dimension then + break + end - --skip if not in correct biome - if not biome_check(mob_def.biomes, gotten_biome) then - goto continue - end + --skip if not in correct biome + if not biome_check(mob_def.biomes, gotten_biome) then + break + end - --add this so mobs don't spawn inside nodes - spawning_position.y = spawning_position.y + 1 + --add this so mobs don't spawn inside nodes + spawning_position.y = spawning_position.y + 1 - if spawning_position.y < mob_def.min_height or spawning_position.y > mob_def.max_height then - goto continue - end + if spawning_position.y < mob_def.min_height or spawning_position.y > mob_def.max_height then + break + end - --only need to poll for node light if everything else worked - local gotten_light = get_node_light(spawning_position) + --only need to poll for node light if everything else worked + local gotten_light = get_node_light(spawning_position) - --don't spawn if not in light limits - if gotten_light < mob_def.min_light or gotten_light > mob_def.max_light then - goto continue - end + --don't spawn if not in light limits + if gotten_light < mob_def.min_light or gotten_light > mob_def.max_light then + break + end - local is_water = get_item_group(gotten_node, "water") ~= 0 - local is_lava = get_item_group(gotten_node, "lava") ~= 0 + local is_water = get_item_group(gotten_node, "water") ~= 0 + local is_lava = get_item_group(gotten_node, "lava") ~= 0 - if mob_def.type_of_spawning == "ground" and is_water then - goto continue - end + if mob_def.type_of_spawning == "ground" and is_water then + break + end - if mob_def.type_of_spawning == "ground" and is_lava then - goto continue - end + if mob_def.type_of_spawning == "ground" and is_lava then + break + end - --finally do the heavy check (for now) of mobs in area - if count_mobs(spawning_position, mob_def.spawn_class) >= mob_def.aoc then - goto continue - end + --finally do the heavy check (for now) of mobs in area + if count_mobs(spawning_position, mob_def.spawn_class) >= mob_def.aoc then + break + end - --adjust the position for water and lava mobs - if mob_def.type_of_spawning == "water" or mob_def.type_of_spawning == "lava" then - spawning_position.y = spawning_position.y - 1 - end + --adjust the position for water and lava mobs + if mob_def.type_of_spawning == "water" or mob_def.type_of_spawning == "lava" then + spawning_position.y = spawning_position.y - 1 + end - --everything is correct, spawn mob - minetest.add_entity(spawning_position, mob_def.name) - - ::continue:: --this is a safety catch - end - end - end - end) + --everything is correct, spawn mob + minetest.add_entity(spawning_position, mob_def.name) + until true --this is a safety catch + end + end + end + end) end