X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;ds=sidebyside;f=mods%2Fmob%2Fspawning.lua;h=908136cc6a4f5e92c2b2b76a85d476c92e2b214b;hb=f52c93ddb4fa3e65ce292100c7e4442b74a9fc35;hp=8da7ec90cd0273ac634f5b31bf19bd3bd866e3d7;hpb=419873cf89577037ec5759756525b76073b8597d;p=Crafter.git diff --git a/mods/mob/spawning.lua b/mods/mob/spawning.lua index 8da7ec9..908136c 100644 --- a/mods/mob/spawning.lua +++ b/mods/mob/spawning.lua @@ -1,86 +1,104 @@ --this is where mob spawning is defined --spawn mob in a square doughnut shaped radius -local chance = 20 -local tick = 0.2 -local timer = 0 +local timer = 6 +--the amount of mobs that the game will try to spawn +local spawn_goal = 10 +--the amount of mobs that the spawner will cap out at +local mob_limit = 100 --inner and outer part of square donut radius local inner = 24 -local outer = 128 +local outer = 80 +--the height in which the game will search the x and z chosen (NUMBER up, NUMBER down) +local find_node_height = 32 --for debug testing to isolate mobs local spawn = true -local spawn_table = {"pig"} -local dark_spawn_table = {"slime","creepig"} -local aether_spawn_table = {"flying_pig"} +local spawn_table = {"pig","chicken","sheep"} +local snow_spawn_table = {"snowman","snoider","sneeper",} +local dark_spawn_table = {"creeper","creeper","creeper","spider","spider","spider","big_slime","medium_slime","small_slime"} +local nether_spawn_table = {"nitro_creeper"} +local aether_spawn_table = {"phyg"} -minetest.register_globalstep(function(dtime) - if spawn then - timer = timer + dtime - if timer >= tick and math.random(1,chance) == chance then - --print("ticking") - timer = 0 +local function spawn_mobs() + --print("---------------------------------------------") + if spawn and global_mob_amount < mob_limit then --check through players - for _,player in ipairs(minetest.get_connected_players()) do - --don't spawn near dead players - if player:get_hp() > 0 then + for _,player in ipairs(minetest.get_connected_players()) do + local int = {-1,1} + local pos = vector.floor(vector.add(player:get_pos(),0.5)) - --local mob_number = math.random(0,2) - - local int = {-1,1} - local pos = vector.floor(vector.add(player:getpos(),0.5)) - - local x,z - - --this is used to determine the axis buffer from the player - local axis = math.random(0,1) - - --cast towards the direction - if axis == 0 then --x - x = pos.x + math.random(inner,outer)*int[math.random(1,2)] - z = pos.z + math.random(-outer,outer) - else --z - z = pos.z + math.random(inner,outer)*int[math.random(1,2)] - x = pos.x + math.random(-outer,outer) - end - - local spawner - if pos.y >= 21000 then - spawner = minetest.find_nodes_in_area_under_air(vector.new(x,pos.y-32,z), vector.new(x,pos.y+32,z), {"aether:grass"}) + local x,z + + --this is used to determine the axis buffer from the player + local axis = math.random(0,1) + + --cast towards the direction + if axis == 0 then --x + x = pos.x + math.random(inner,outer)*int[math.random(1,2)] + z = pos.z + math.random(-outer,outer) + else --z + z = pos.z + math.random(inner,outer)*int[math.random(1,2)] + x = pos.x + math.random(-outer,outer) + end + + local spawner = {} + if pos.y >= 21000 then + spawner = minetest.find_nodes_in_area_under_air(vector.new(x,pos.y-find_node_height,z), vector.new(x,pos.y+find_node_height,z), {"aether:grass"}) + elseif pos.y <= -10033 and pos.y >= -20112 then + spawner = minetest.find_nodes_in_area_under_air(vector.new(x,pos.y-find_node_height,z), vector.new(x,pos.y+find_node_height,z), {"nether:netherrack"}) + else + spawner = minetest.find_nodes_in_area_under_air(vector.new(x,pos.y-find_node_height,z), vector.new(x,pos.y+find_node_height,z), {"main:grass","main:sand","main:water"}) + end + + --print(dump(spawner)) + if table.getn(spawner) > 0 then + local mob_pos = spawner[1] + mob_pos.y = mob_pos.y + 1 + --aether spawning + if mob_pos.y >= 21000 then + local mob_spawning = aether_spawn_table[math.random(1,table.getn(aether_spawn_table))] + --print("Aether Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos)) + minetest.add_entity(mob_pos,"mob:"..mob_spawning) + elseif mob_pos.y <= -10033 and mob_pos.y >= -20112 then + local mob_spawning = nether_spawn_table[math.random(1,table.getn(nether_spawn_table))] + --print("Nether Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos)) + minetest.add_entity(mob_pos,"mob:"..mob_spawning) else - spawner = minetest.find_nodes_in_area_under_air(vector.new(x,pos.y-32,z), vector.new(x,pos.y+32,z), {"main:grass","main:sand","main:water"}) - end - - --print(dump(spawner)) - if table.getn(spawner) > 0 then - local mob_pos = spawner[1] - --aether spawning - if mob_pos.y >= 21000 then - mob_pos.y = mob_pos.y + 1 - local mob_spawning = aether_spawn_table[math.random(1,table.getn(spawn_table))] - print("Aether Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos)) + local light_level = minetest.get_node_light(spawner[1]) + if weather_type == 1 then + local mob_spawning = snow_spawn_table[math.random(1,table.getn(snow_spawn_table))] + --print("Snow Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos)) + minetest.add_entity(mob_pos,"mob:"..mob_spawning) + elseif light_level < 10 then + local mob_spawning = dark_spawn_table[math.random(1,table.getn(dark_spawn_table))] + --print("Dark Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos)) minetest.add_entity(mob_pos,"mob:"..mob_spawning) - else - local light_level = minetest.get_node_light(spawner[1]) - if light_level < 10 then - mob_pos.y = mob_pos.y + 1 - local mob_spawning = dark_spawn_table[math.random(1,table.getn(dark_spawn_table))] - print("Dark Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos)) - minetest.add_entity(mob_pos,"mob:"..mob_spawning) - else - mob_pos.y = mob_pos.y + 1 - local mob_spawning = spawn_table[math.random(1,table.getn(spawn_table))] - print("Light Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos)) - minetest.add_entity(mob_pos,"mob:"..mob_spawning) - end + local mob_spawning = spawn_table[math.random(1,table.getn(spawn_table))] + --print("Light Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos)) + minetest.add_entity(mob_pos,"mob:"..mob_spawning) end end end end - elseif timer > tick then - timer = 0 end + + --fine tune mobs + local after_timer = global_mob_amount/spawn_goal + if after_timer > timer then + after_timer = timer end -end) + + minetest.after(after_timer, function() + spawn_mobs() + end) +end +if spawning then + minetest.register_on_mods_loaded(function() + minetest.after(0,function() + spawn_mobs() + end) + end) +end