X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=mods%2Fmob%2Fspawning.lua;h=1c4423d71dbf6eaa948a11c212016dfa46a2fe58;hb=48aa89197636250b3e494e9124c7c5c6e2d63dea;hp=660a82735629f14e3cfe7b77dc2bb48a1f1b8ad8;hpb=715aa48b0d3b1e9df92e22dc791871848d09122b;p=Crafter.git diff --git a/mods/mob/spawning.lua b/mods/mob/spawning.lua index 660a827..1c4423d 100644 --- a/mods/mob/spawning.lua +++ b/mods/mob/spawning.lua @@ -1,12 +1,12 @@ +local minetest,vector,math,table = minetest,vector,math,table + --this is where mob spawning is defined --spawn mob in a square doughnut shaped radius -local timer = 6 ---the amount of mobs that the game will try to spawn -local spawn_goal = 30 ---inner and outer part of square donut radius -local inner = 24 -local outer = 80 +--the amount of mobs that the game will try to spawn per player +local spawn_goal_per_player = 10 +--the amount of mobs that the spawner will cap out at + --the height in which the game will search the x and z chosen (NUMBER up, NUMBER down) local find_node_height = 32 @@ -14,80 +14,138 @@ local find_node_height = 32 local spawn = true 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 snow_dark_spawn_table = {"snoider","sneeper","zombie","zombie"} +local snow_light_spawn_table = {"snowman"} +local dark_spawn_table = {"creeper","creeper","creeper","spider","spider","spider","small_slime","small_slime","zombie","zombie","zombie"} local nether_spawn_table = {"nitro_creeper"} local aether_spawn_table = {"phyg"} -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 - local int = {-1,1} - local pos = vector.floor(vector.add(player:get_pos(),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-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"}) + +local axis +--inner and outer part of square donut radius +local inner = 18 +local outer = 50 +local int = {-1,1} +local position_calculation = function(pos) + --this is used to determine the axis buffer from the player + axis = math.random(0,1) + + --cast towards the direction + if axis == 0 then --x + pos.x = pos.x + math.random(inner,outer)*int[math.random(1,2)] + pos.z = pos.z + math.random(-outer,outer) + else --z + pos.z = pos.z + math.random(inner,outer)*int[math.random(1,2)] + pos.x = pos.x + math.random(-outer,outer) + end + return(pos) +end + + +local object_list +local entity +local counter +local get_mobs_in_radius = function(pos) + counter = 0 + object_list = minetest.get_objects_inside_radius(pos, outer) + for _,object in ipairs(object_list) do + if not object:is_player() then + if object:get_luaentity().mobname then + counter = counter + 1 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)) + end + end + return(counter) +end + + +local pos +local mobs +local spawner +local mob_spawning +local light_level +local mob_pos +local function spawn_mobs(player) + pos = player:get_pos() + mobs = get_mobs_in_radius(pos) + if mobs > spawn_goal_per_player then + return + end + + for i = 1,math.random(2,5) do + + pos = position_calculation(pos) + + spawner = {} + if pos.y >= 21000 then + spawner = minetest.find_nodes_in_area_under_air(vector.new(pos.x,pos.y-find_node_height,pos.z), vector.new(pos.x,pos.y+find_node_height,pos.z), {"aether:grass"}) + elseif pos.y <= -10033 and pos.y >= -20112 then + spawner = minetest.find_nodes_in_area_under_air(vector.new(pos.x,pos.y-find_node_height,pos.z), vector.new(pos.x,pos.y+find_node_height,pos.z), {"nether:netherrack"}) + else + spawner = minetest.find_nodes_in_area_under_air(vector.new(pos.x,pos.y-find_node_height,pos.z), vector.new(pos.x,pos.y+find_node_height,pos.z), {"main:grass","main:sand","main:water"}) + end + + --print(dump(spawner)) + if table.getn(spawner) > 0 then + mob_pos = spawner[math.random(1,table.getn(spawner))] + mob_pos.y = mob_pos.y + 1 + --print("spawning", dump(mob_pos)) + + --aether spawning + if mob_pos.y >= 21000 then + 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 + 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 + light_level = minetest.get_node_light(mob_pos) + + if weather_type == 1 then + if light_level < 7 then + mob_spawning = snow_dark_spawn_table[math.random(1,table.getn(snow_dark_spawn_table))] + --print("Snow 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)) + else + local mob_spawning = snow_light_spawn_table[math.random(1,table.getn(snow_light_spawn_table))] + --print("Snow Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos)) + minetest.add_entity(mob_pos,"mob:"..mob_spawning) + end + else + if light_level < 7 then + 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 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 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 + 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 - minetest.after(global_mob_amount/spawn_goal, function() - spawn_mobs() + end +end + +local function per_player_handling() + --check through players + for _,player in ipairs(minetest.get_connected_players()) do + spawn_mobs(player) + end + + minetest.after(10, function() + per_player_handling() end) end -minetest.register_on_mods_loaded(function() - minetest.after(0,function() - spawn_mobs() + +if spawn then + minetest.register_on_mods_loaded(function() + minetest.after(0,function() + per_player_handling() + end) end) -end) \ No newline at end of file +end + +