diff --git a/spawners_env/api.lua b/spawners_env/api.lua index 260e7ec..4bdbfc3 100644 --- a/spawners_env/api.lua +++ b/spawners_env/api.lua @@ -9,15 +9,17 @@ for k, mob_mod in ipairs(ENABLED_MODS) do if (modpath) then for j, mob in ipairs(MOBS_PROPS[mob_mod]) do local mob_egg = nil - - table.insert(spawners_env.mob_tables, {name=mob.name, mod_prefix=mob_mod, egg_name_custom=mob.egg_name_custom, dummy_size=mob.dummy_size, dummy_offset=mob.dummy_offset, dummy_mesh=mob.dummy_mesh, dummy_texture=mob.dummy_texture, night_only=mob.night_only, sound_custom=mob.sound_custom, env=mob.env}) - - -- use custom egg or create a default egg - if mob.egg_name_custom ~= "" then - mob_egg = mob.egg_name_custom - else - mob_egg = mob_mod..":"..mob.name + -- create only environmental spawners + if mob.env then + table.insert(spawners_env.mob_tables, {name=mob.name, mod_prefix=mob_mod, egg_name_custom=mob.egg_name_custom, dummy_size=mob.dummy_size, dummy_offset=mob.dummy_offset, dummy_mesh=mob.dummy_mesh, dummy_texture=mob.dummy_texture, night_only=mob.night_only, sound_custom=mob.sound_custom, env=mob.env}) + -- use custom egg or create a default egg + if mob.egg_name_custom ~= "" then + mob_egg = mob.egg_name_custom + else + mob_egg = mob_mod..":"..mob.name + end end + end else -- print something ? @@ -26,12 +28,14 @@ end -- start spawning mobs function spawners_env.start_spawning(pos, how_many, mob_name, mod_prefix, sound_custom) - if not (pos or how_many or mob_name) then return end + + if not (pos or mob_name) then + return + end - local sound_name -- remove 'spawners_env:' from the string local mob_name = string.sub(mob_name,14) - + local sound_name -- use custom sounds if sound_custom ~= "" then sound_name = sound_custom @@ -39,18 +43,8 @@ function spawners_env.start_spawning(pos, how_many, mob_name, mod_prefix, sound_ sound_name = mod_prefix.."_"..mob_name end - -- use random colours for sheeps - if mob_name == "sheep_white" then - local mob_name1 = "" - local sheep_colours = {"black", "blue", "brown", "cyan", "dark_green", "dark_grey", "green", "grey", "magenta", "orange", "pink", "red", "violet", "white", "yellow"} - local random_colour = math.random(1, #sheep_colours) - mob_name1 = string.split(mob_name, "_") - mob_name1 = mob_name1[1] - mob_name = mob_name1.."_"..sheep_colours[random_colour] - end - if how_many == nil then - how_many = math.random(0,4) + how_many = math.random(1,2) end for i=1,how_many do @@ -87,7 +81,7 @@ function spawners_env.check_node_status(pos, mob, night_only) local player_near = spawners_env.check_around_radius(pos) if player_near then - local spawn_pos = minetest.find_node_near(pos, 2, {"air"}) + local random_pos = false local min_node_light = 10 local tod = minetest.get_timeofday() * 24000 local node_light = minetest.get_node_light(pos) @@ -96,12 +90,70 @@ function spawners_env.check_node_status(pos, mob, night_only) return false end - -- check the node above and below the found air node - local node_above = minetest.get_node({x=spawn_pos.x, y=spawn_pos.y+1, z=spawn_pos.z}).name - local node_below = minetest.get_node({x=spawn_pos.x, y=spawn_pos.y-1, z=spawn_pos.z}).name - - if not (node_above == "air" or node_below == "air") then + local spawn_positions = {} + local right = minetest.get_node({x=pos.x+1, y=pos.y, z=pos.z}) + local front = minetest.get_node({x=pos.x, y=pos.y, z=pos.z+1}) + local left = minetest.get_node({x=pos.x-1, y=pos.y, z=pos.z}) + local back = minetest.get_node({x=pos.x, y=pos.y, z=pos.z-1}) + local top = minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}) + local bottom = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}) + + -- make sure that at least one side of the spawner is open + if right.name == "air" then + table.insert(spawn_positions, {x=pos.x+1.5, y=pos.y, z=pos.z}) + end + if front.name == "air" then + table.insert(spawn_positions, {x=pos.x, y=pos.y, z=pos.z+1.5}) + end + if left.name == "air" then + table.insert(spawn_positions, {x=pos.x-1.5, y=pos.y, z=pos.z}) + end + if back.name == "air" then + table.insert(spawn_positions, {x=pos.x, y=pos.y, z=pos.z-1.5}) + end + if top.name == "air" then + table.insert(spawn_positions, {x=pos.x, y=pos.y+1.5, z=pos.z}) + end + if bottom.name == "air" then + table.insert(spawn_positions, {x=pos.x, y=pos.y-1.5, z=pos.z}) + end + + -- spawner is closed from all sides + if #spawn_positions < 1 then return false + + -- find random position in all posible places + else + local possible_spawn_pos = {} + local pick_random_key + + -- get a position value from the picked/random key + for k, v in pairs (spawn_positions) do + local node_above = minetest.get_node({x=v.x, y=v.y+1, z=v.z}).name + local node_below = minetest.get_node({x=v.x, y=v.y-1, z=v.z}).name + + -- make super sure there is enough place to spawn mob and collect all possible spawn points + if node_above == "air" or node_below == "air" then + table.insert(possible_spawn_pos, v) + -- print("possible pos: "..minetest.pos_to_string(v)) + end + end + + -- no possible spawn points found - not enough place around the spawner + if #possible_spawn_pos < 1 then + return false + + -- only one possible position ? + elseif #possible_spawn_pos == 1 then + pick_random_key = #possible_spawn_pos + + -- pick random from the possible open sides + else + pick_random_key = math.random(1,#possible_spawn_pos) + end + + random_pos = possible_spawn_pos[pick_random_key] + -- print(minetest.pos_to_string(random_pos)) end if night_only ~= "disable" then @@ -113,15 +165,86 @@ function spawners_env.check_node_status(pos, mob, night_only) -- spawn only at night if night_only then if not (19359 > tod and tod > 5200) or node_light < min_node_light then - return spawn_pos + return random_pos else return false, true end end end - - return spawn_pos, false + -- random_pos, waiting + return random_pos, false else + -- random_pos, waiting return false, true end end + +local chest_stuff = { + {name="default:apple", max = 3}, + {name="default:torch", max = 10}, + {name="default:aspen_sapling", max = 5}, + {name="farming:bread", max = 3}, + {name="default:steel_ingot", max = 2}, + {name="default:gold_ingot", max = 2}, + {name="default:bronze_ingot", max = 2}, + {name="default:copper_ingot", max = 2}, + {name="default:diamond", max = 1}, + {name="default:pick_steel", max = 1}, + {name="default:pick_diamond", max = 1}, + {name="default:pick_bronze", max = 1}, + {name="default:pick_mese", max = 1}, + {name="default:pick_stone", max = 1}, + {name="default:pick_wood", max = 1}, + {name="default:sword_bronze", max = 1}, + {name="default:sword_diamond", max = 1}, + {name="default:sword_mese", max = 1}, + {name="default:sword_steel", max = 1}, + {name="default:sword_stone", max = 1}, + {name="default:sword_wood", max = 1}, + {name="default:shovel_bronze", max = 1}, + {name="default:shovel_diamond", max = 1}, + {name="default:shovel_mese", max = 1}, + {name="default:shovel_steel", max = 1}, + {name="default:shovel_stone", max = 1}, + {name="default:shovel_wood", max = 1}, + {name="default:axe_bronze", max = 1}, + {name="default:axe_diamond", max = 1}, + {name="default:axe_mese", max = 1}, + {name="default:axe_steel", max = 1}, + {name="default:axe_stone", max = 1}, + {name="default:axe_wood", max = 1}, + {name="obsidianmese:mese_apple", max = 1}, +} + +function spawners_env.fill_chest(pos) + minetest.after(2, function() + local n = minetest.get_node(pos) + + if n and n.name and n.name == "default:chest" then + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + inv:set_size("main", 8*4) + + -- if math.random(1,10) < 5 then return end + + for i=0,2,1 do + local stuff = chest_stuff[math.random(1,#chest_stuff)] + + if stuff.name == "farming:bread" and not minetest.get_modpath("farming") then + stuff = chest_stuff[1] + end + + if stuff.name == "obsidianmese:mese_apple" and not minetest.get_modpath("obsidianmese") then + stuff = chest_stuff[1] + end + + local stack = {name=stuff.name, count = math.random(1,stuff.max)} + + if not inv:contains_item("main", stack) then + inv:set_stack("main", math.random(1,32), stack) + end + end + end + end) +end \ No newline at end of file diff --git a/spawners_env/chests_gen.lua b/spawners_env/chests_gen.lua deleted file mode 100644 index fff5d72..0000000 --- a/spawners_env/chests_gen.lua +++ /dev/null @@ -1,34 +0,0 @@ --- Place chests in dungeons and temples -local function place_chest(param) - local tab = param - - local pos = tab[math.random(1, (#tab or 4))] - pos.y = pos.y - 1 - - local n = minetest.get_node_or_nil(pos) - - if n and n.name ~= "air" then - pos.y = pos.y + 1 - - minetest.log("action", "[Mod][Spawners] Chest placed at: "..minetest.pos_to_string(pos)) - - minetest.set_node(pos, {name = "default:chest"}) - - pyramids.fill_chest(pos) - end -end - -minetest.set_gen_notify("dungeon") -minetest.set_gen_notify("temple") - -minetest.register_on_generated(function(minp, maxp, blockseed) - local ntf = minetest.get_mapgen_object("gennotify") - - if ntf and ntf.dungeon then - minetest.after(3, place_chest, table.copy(ntf.dungeon)) - end - - if ntf and ntf.temple then - minetest.after(3, place_chest, table.copy(ntf.temple)) - end -end) \ No newline at end of file diff --git a/spawners_env/config.example.lua b/spawners_env/config.example.lua deleted file mode 100644 index 67cb810..0000000 --- a/spawners_env/config.example.lua +++ /dev/null @@ -1,241 +0,0 @@ --- * [name : string] - Name of the mob used in the mod. - --- [egg_name_custom : string] - Custom name for the egg item. If empty default name will be used i.e. 'mobs:chicken'. - --- * [dummy_size : table] - Size of the rotating dummy inside the node. - --- * [dummy_offset : integer] - Offset on Y axis of the dummy inside the node. - --- * [dummy_mesh : string] - Filename of the model used fot he mob. - --- * [dummy_texture : table] - Textures used for the mob. - --- * [night_only : boolean : string] - If true mobs will spawn only during the night or in dark areas, default:true. Writing "disable" will disable light check and it will spawn in both states (night and day) - --- [sound_custom : string] - Custom name for the sound file name if differ from default: i.e 'mobs_cow'. - --- [env : boolean] - This spawner will become environmental spawner. Environmental spawners have different properties/behaviour (used for map gen) and cannot be crafted. - --- [*] -> MANDATORY - has to be filled in! - --- mods what should be enabled and loded, remove/add the one you want to load -ENABLED_MODS = {"mobs", "pyramids", "creatures"} - --- mobs properties - setup all you mobs here -MOBS_PROPS = { - - ["mobs"] = { -- MOBS REDO CONFIG - { - name="sheep_white", - egg_name_custom="", - dummy_size={x=0.52,y=0.52}, - dummy_offset=0.2, - dummy_mesh="mobs_sheep.b3d", - dummy_texture={"mobs_sheep_wool.png^mobs_sheep_base.png"}, - night_only=false, - sound_custom="mobs_sheep" - }, - { - name="cow", - egg_name_custom="", - dummy_size={x=0.3,y=0.3}, - dummy_offset=-0.3, - dummy_mesh="mobs_cow.x", - dummy_texture={"mobs_cow.png"}, - night_only=false, - sound_custom="" - }, - { - name="chicken", - egg_name_custom="", - dummy_size={x=0.9,y=0.9}, - dummy_offset=0.2, - dummy_mesh="mobs_chicken.x", - dummy_texture={"mobs_chicken.png", "mobs_chicken.png", "mobs_chicken.png", "mobs_chicken.png", "mobs_chicken.png", "mobs_chicken.png", "mobs_chicken.png", "mobs_chicken.png", "mobs_chicken.png"}, - night_only=false, - sound_custom="" - }, - { - name="pumba", - egg_name_custom="", - dummy_size={x=0.62,y=0.62}, - dummy_offset=-0.3, - dummy_mesh="mobs_pumba.x", - dummy_texture={"mobs_pumba.png"}, - night_only=false, - sound_custom="mobs_pig" - }, - { - name="bunny", - egg_name_custom="", - dummy_size={x=1,y=1}, - dummy_offset=0.2, - dummy_mesh="mobs_bunny.b3d", - dummy_texture={"mobs_bunny_brown.png"}, - night_only=false, - sound_custom="spawners_bunny" - }, - { - name="kitten", - egg_name_custom="", - dummy_size={x=0.32,y=0.32}, - dummy_offset=0, - dummy_mesh="mobs_kitten.b3d", - dummy_texture={"mobs_kitten_ginger.png"}, - night_only=false, - sound_custom="" - }, - { - name="spider", - egg_name_custom="", - dummy_size={x=2,y=2}, - dummy_offset=-0.2, - dummy_mesh="mobs_spider.x", - dummy_texture={"mobs_spider.png"}, - night_only=false, - sound_custom="" - }, - { - name="spider", - egg_name_custom="", - dummy_size={x=2,y=2}, - dummy_offset=-0.2, - dummy_mesh="mobs_spider.x", - dummy_texture={"mobs_spider.png"}, - night_only="disable", - sound_custom="", - env = true - }, - { - name="stone_monster", - egg_name_custom="", - dummy_size={x=0.5,y=0.5}, - dummy_offset=0.05, - dummy_mesh="mobs_stone_monster.b3d", - dummy_texture={"mobs_stone_monster.png"}, - night_only=false, - sound_custom="mobs_stonemonster" - }, - { - name="oerkki", - egg_name_custom="", - dummy_size={x=0.5,y=0.5}, - dummy_offset=0.05, - dummy_mesh="mobs_oerkki.b3d", - dummy_texture={"mobs_oerkki.png"}, - night_only=true, - sound_custom="" - }, - { - name="tree_monster", - egg_name_custom="", - dummy_size={x=0.4,y=0.4}, - dummy_offset=0.05, - dummy_mesh="mobs_tree_monster.b3d", - dummy_texture={"mobs_tree_monster.png"}, - night_only=true, - sound_custom="mobs_treemonster" - } - }, - - ["pyramids"] = { -- PYRAMIDS MOD CONFIG - { - name="mummy", - egg_name_custom="pyramids:spawn_egg", - dummy_size={x=3.3,y=3.3}, - dummy_offset=-0.3, - dummy_mesh="pyramids_mummy.x", - dummy_texture={"pyramids_mummy.png"}, - night_only=false, - sound_custom="mummy" - } - }, - - ["creatures"] = { -- CREATURES MOD CONFIG - { - name="chicken", - egg_name_custom="creatures:chicken_spawn_egg", - dummy_size={x=0.9,y=0.9}, - dummy_offset=-0.3, - dummy_mesh="creatures_chicken.b3d", - dummy_texture={"creatures_chicken.png"}, - night_only=false, - sound_custom="" - }, - { - name="ghost", - egg_name_custom="creatures:ghost_spawn_egg", - dummy_size={x=0.7,y=0.7}, - dummy_offset=-0.5, - dummy_mesh="creatures_ghost.b3d", - dummy_texture={"creatures_ghost.png"}, - night_only=true, - sound_custom="" - }, - { - name="sheep", - egg_name_custom="creatures:sheep_spawn_egg", - dummy_size={x=0.6,y=0.6}, - dummy_offset=-0.3, - dummy_mesh="creatures_sheep.b3d", - dummy_texture={"creatures_sheep.png^creatures_sheep_white.png"}, - night_only=false, - sound_custom="" - }, - { - name="zombie", - egg_name_custom="creatures:zombie_spawn_egg", - dummy_size={x=0.5,y=0.5}, - dummy_offset=-0.5, - dummy_mesh="creatures_zombie.b3d", - dummy_texture={"creatures_zombie.png"}, - night_only=false, - sound_custom="" - }, - { - name="oerrki", - egg_name_custom="creatures:oerrki_spawn_egg", - dummy_size={x=0.4,y=0.4}, - dummy_offset=-0.5, - dummy_mesh="creatures_oerrki.b3d", - dummy_texture={"creatures_oerrki.png"}, - night_only=false, - sound_custom="creatures_oerrki_idle" - } - } -} - --- --- check for 3rd party dependencies --- - --- include mummy mobs redo addon (spawner) -if minetest.get_modpath("mobs") ~= nil then - -- enable spawner - table.insert(ENABLED_MODS, "spawners") - - -- configure spawner - MOBS_PROPS["spawners"] = { - { - name="mummy", - egg_name_custom="", - dummy_size={x=0.4,y=0.4}, - dummy_offset=0, - dummy_mesh="spawners_env_mummy.b3d", - dummy_texture={"spawners_env_mummy.png"}, - night_only="disable", - sound_custom="spawners_env_mummy" - }, - { - name="mummy", - egg_name_custom="", - dummy_size={x=0.4,y=0.4}, - dummy_offset=0, - dummy_mesh="spawners_env_mummy.b3d", - dummy_texture={"spawners_env_mummy.png"}, - night_only="disable", - sound_custom="spawners_env_mummy", - env=true - } - } -end \ No newline at end of file diff --git a/spawners_env/depends.txt b/spawners_env/depends.txt index 679dd5c..dcda968 100644 --- a/spawners_env/depends.txt +++ b/spawners_env/depends.txt @@ -1,3 +1,2 @@ default -mobs? -creatures? \ No newline at end of file +spawners_mobs diff --git a/spawners_env/init.lua b/spawners_env/init.lua index c5acfdf..5e65d09 100644 --- a/spawners_env/init.lua +++ b/spawners_env/init.lua @@ -1,42 +1,13 @@ MOD_NAME = minetest.get_current_modname() --- Main settings -dofile(minetest.get_modpath(MOD_NAME).."/settings.txt") - -- Spawners configurations -dofile(minetest.get_modpath(MOD_NAME).."/config.lua") +dofile(minetest.get_modpath("spawners_mobs").."/config.lua") -- API dofile(minetest.get_modpath(MOD_NAME).."/api.lua") -- Spawners for mobs dofile(minetest.get_modpath(MOD_NAME).."/spawners_env.lua") - --- Spawners Pyramids - works best with mapgen v6 -if SPAWN_PYRAMIDS then - dofile(minetest.get_modpath(MOD_NAME).."/pyramids.lua") - - print("[Mod][spawners] Pyramids enabled") -end - --- include mummy mobs redo addon (mob) -if minetest.get_modpath("mobs") then - dofile(minetest.get_modpath(MOD_NAME).."/mob_env_mummy.lua") - dofile(minetest.get_modpath(MOD_NAME).."/nodes_env_additional.lua") -end - --- Add Spawners to dungeons, temples.. -if SPAWNERS_GENERATE then - dofile(minetest.get_modpath(MOD_NAME).."/spawners_gen.lua") - - print("[Mod][spawners] Spawners generate enabled") -end - --- Add Chests to dungeons, temples.. -if CHESTS_GENERATE then - dofile(minetest.get_modpath(MOD_NAME).."/chests_gen.lua") - - print("[Mod][spawners] Chests generate enabled") -end +dofile(minetest.get_modpath(MOD_NAME).."/spawners_gen.lua") print ("[Mod] Spawners Environmental 0.7 Loaded.") \ No newline at end of file diff --git a/spawners_env/mob_env_mummy.lua b/spawners_env/mob_env_mummy.lua deleted file mode 100644 index c0cff1f..0000000 --- a/spawners_env/mob_env_mummy.lua +++ /dev/null @@ -1,65 +0,0 @@ --- modified Sand Monster by PilzAdam with Mummy by BlockMen - -local mummy_def = { - type = "monster", - passive = false, - attack_type = "dogfight", - pathfinding = true, - reach = 2, - damage = 4, - hp_min = 25, - hp_max = 35, - armor = 100, - collisionbox = {-0.4, -1, -0.4, 0.4, 0.8, 0.4}, - visual = "mesh", - mesh = "spawners_env_mummy.b3d", - textures = { - {"spawners_env_mummy.png"}, - }, - makes_footstep_sound = true, - sounds = { - random = "spawners_env_mummy", - damage = "spawners_env_mummy_hit", - }, - walk_velocity = .75, - run_velocity = 1.5, - view_range = 8, - jump = true, - floats = 0, - drops = { - {name = "default:sandstone", chance = 1, min = 1, max = 3}, - {name = "default:sandstonebrick", chance = 2, min = 1, max = 2}, - {name = "spawners_env:deco_stone_eye", chance = 15, min = 1, max = 1}, - {name = "spawners_env:deco_stone_men", chance = 15, min = 1, max = 1}, - {name = "spawners_env:deco_stone_sun", chance = 15, min = 1, max = 1}, - }, - water_damage = 4, - lava_damage = 8, - light_damage = 0, - fear_height = 4, - animation = { - speed_normal = 15, - speed_run = 15, - stand_start = 0, - stand_end = 39, - walk_start = 41, - walk_end = 72, - run_start = 74, - run_end = 105, - punch_start = 74, - punch_end = 105, - }, - on_die = function(self, pos) - minetest.sound_play("spawners_env_mummy_death", { - object = self.object, - pos = pos, - max_hear_distance = 10 - }) - end, -} - -mobs:register_mob("spawners_env:mummy", mummy_def) - -mobs:register_spawn("spawners_env:mummy", {"default:desert_sand", "default:desert_stone"}, 20, 0, 14000, 2, 31000) - -mobs:register_egg("spawners_env:mummy", "Mummy Monster", "default_sandstone_brick.png", 1) diff --git a/spawners_env/models/spawners_env_mummy.b3d b/spawners_env/models/spawners_env_mummy.b3d deleted file mode 100644 index 9782504..0000000 Binary files a/spawners_env/models/spawners_env_mummy.b3d and /dev/null differ diff --git a/spawners_env/nodes_env_additional.lua b/spawners_env/nodes_env_additional.lua deleted file mode 100644 index 0c21ae4..0000000 --- a/spawners_env/nodes_env_additional.lua +++ /dev/null @@ -1,11 +0,0 @@ -local img = {"eye", "men", "sun"} - -for i=1,3 do - minetest.register_node("spawners_env:deco_stone_"..img[i], { - description = "Sandstone with "..img[i], - tiles = {"default_sandstone.png^spawners_env_"..img[i]..".png"}, - is_ground_content = true, - groups = {crumbly=2,cracky=3}, - sounds = default.node_sound_stone_defaults(), - }) -end \ No newline at end of file diff --git a/spawners_env/pyramids.lua b/spawners_env/pyramids.lua deleted file mode 100644 index 74a26a9..0000000 --- a/spawners_env/pyramids.lua +++ /dev/null @@ -1,260 +0,0 @@ --- Pyramids by BlockMen - -pyramids = {} - -dofile(minetest.get_modpath("spawners").."/pyramids_nodes.lua") -dofile(minetest.get_modpath("spawners").."/pyramids_room.lua") - -local chest_stuff = { - {name="default:apple", max = 3}, - {name="default:torch", max = 10}, - {name="default:aspen_sapling", max = 5}, - {name="farming:bread", max = 3}, - {name="default:steel_ingot", max = 2}, - {name="default:gold_ingot", max = 2}, - {name="default:bronze_ingot", max = 2}, - {name="default:copper_ingot", max = 2}, - {name="default:diamond", max = 1}, - {name="default:pick_steel", max = 1}, - {name="default:pick_diamond", max = 1}, - {name="default:pick_bronze", max = 1}, - {name="default:pick_mese", max = 1}, - {name="default:pick_stone", max = 1}, - {name="default:pick_wood", max = 1}, - {name="default:sword_bronze", max = 1}, - {name="default:sword_diamond", max = 1}, - {name="default:sword_mese", max = 1}, - {name="default:sword_steel", max = 1}, - {name="default:sword_stone", max = 1}, - {name="default:sword_wood", max = 1}, - {name="default:shovel_bronze", max = 1}, - {name="default:shovel_diamond", max = 1}, - {name="default:shovel_mese", max = 1}, - {name="default:shovel_steel", max = 1}, - {name="default:shovel_stone", max = 1}, - {name="default:shovel_wood", max = 1}, - {name="default:axe_bronze", max = 1}, - {name="default:axe_diamond", max = 1}, - {name="default:axe_mese", max = 1}, - {name="default:axe_steel", max = 1}, - {name="default:axe_stone", max = 1}, - {name="default:axe_wood", max = 1}, - {name="diamonds:diamond_apple", max = 1}, -} - -function pyramids.fill_chest(pos) - minetest.after(2, function() - local n = minetest.get_node(pos) - - if n and n.name and n.name == "default:chest" then - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - - inv:set_size("main", 8*4) - - -- if math.random(1,10) < 5 then return end - - for i=0,2,1 do - local stuff = chest_stuff[math.random(1,#chest_stuff)] - - if stuff.name == "farming:bread" and not minetest.get_modpath("farming") then - stuff = chest_stuff[1] - end - - if stuff.name == "diamonds:diamond_apple" and not minetest.get_modpath("diamonds") then - stuff = chest_stuff[1] - end - - local stack = {name=stuff.name, count = math.random(1,stuff.max)} - - if not inv:contains_item("main", stack) then - inv:set_stack("main", math.random(1,32), stack) - end - end - end - end) -end - -function pyramids.spawn_mummy(pos, number) - -- needs mobs redo - if minetest.get_modpath("mobs") ~= nil then - for i=0,number do - minetest.add_entity(pos,"spawners_env:mummy") - end - end -end - -local function add_spawner(pos) - -- needs mobs redo - if minetest.get_modpath("mobs") ~= nil then - minetest.set_node(pos, {name="spawners_env:spawners_mummy_spawner_env"}) - - if not minetest.setting_getbool("only_peaceful_mobs") then pyramids.spawn_mummy({x=pos.x,y=pos.y,z=pos.z-2},2) - end - end -end - -local function can_replace(pos) - local n = minetest.get_node_or_nil(pos) - if n and n.name and minetest.registered_nodes[n.name] and not minetest.registered_nodes[n.name].walkable then - return true - elseif not n then - return true - else - return false - end -end - -local function underground(pos) - local p2 = pos - local cnt = 0 - local mat = "desert_sand" - p2.y = p2.y-1 - while can_replace(p2)==true do - cnt = cnt+1 - if cnt > 25 then break end - if cnt>math.random(2,4) then mat = "desert_stone"end - minetest.set_node(p2, {name="default:"..mat}) - p2.y = p2.y-1 - end -end - -local function make_entrance(pos) - local gang = {x=pos.x+10,y=pos.y, z=pos.z} - for iy=2,3,1 do - for iz=0,6,1 do - minetest.remove_node({x=gang.x+1,y=gang.y+iy,z=gang.z+iz}) - if iz >=3 and iy == 3 then - minetest.set_node({x=gang.x,y=gang.y+iy+1,z=gang.z+iz}, {name="default:sandstonebrick"}) - minetest.set_node({x=gang.x+1,y=gang.y+iy+1,z=gang.z+iz}, {name="default:sandstonebrick"}) - minetest.set_node({x=gang.x+2,y=gang.y+iy+1,z=gang.z+iz}, {name="default:sandstonebrick"}) - end - end - end -end - -local function make(pos) - minetest.log("action", "Created pyramid at ("..pos.x..","..pos.y..","..pos.z..")") - for iy=0,10,1 do - for ix=iy,22-iy,1 do - for iz=iy,22-iy,1 do - if iy <1 then underground({x=pos.x+ix,y=pos.y,z=pos.z+iz}) end - minetest.set_node({x=pos.x+ix,y=pos.y+iy,z=pos.z+iz}, {name="default:sandstonebrick"}) - for yy=1,10-iy,1 do - local n = minetest.get_node({x=pos.x+ix,y=pos.y+iy+yy,z=pos.z+iz}) - if n and n.name and n.name == "default:desert_stone" then minetest.set_node({x=pos.x+ix,y=pos.y+iy+yy,z=pos.z+iz},{name="default:desert_sand"}) end - end - end - end - end - - pyramids.make_room(pos) - minetest.after(2, pyramids.make_traps, pos) - - -- needs mobs redo - if minetest.get_modpath("mobs") ~= nil then - add_spawner({x=pos.x+11,y=pos.y+2, z=pos.z+16}) - end - - make_entrance({x=pos.x,y=pos.y, z=pos.z}) -end - -local perl1 = {SEED1 = 9130, OCTA1 = 3, PERS1 = 0.5, SCAL1 = 250} -- Values should match minetest mapgen V6 desert noise - -if minetest.get_modpath("simplev7") ~= nil then - perl1 = {SEED1 = 5349, OCTA1 = 3, PERS1 = 0.7, SCAL1 = 500} -end - -local function hlp_fnct(pos, name) - local n = minetest.get_node_or_nil(pos) - if n and n.name and n.name == name then - return true - else - return false - end -end -local function ground(pos, old) - local p2 = pos - while hlp_fnct(p2, "air") do - p2.y = p2.y -1 - end - if p2.y < old.y then - return p2 - else - return old - end -end - -minetest.register_on_generated(function(minp, maxp, seed) - if maxp.y < 0 then return end - math.randomseed(seed) - local cnt = 0 - - local perlin1 = minetest.get_perlin(perl1.SEED1, perl1.OCTA1, perl1.PERS1, perl1.SCAL1) - local noise1 = perlin1:get2d({x=minp.x,y=minp.y})--,z=minp.z}) - - if noise1 > 0.25 or noise1 < -0.26 then - local mpos = {x=math.random(minp.x,maxp.x), y=math.random(minp.y,maxp.y), z=math.random(minp.z,maxp.z)} - - local p2 = minetest.find_node_near(mpos, 25, {"default:desert_sand"}) - while p2 == nil and cnt < 5 do - cnt = cnt+1 - mpos = {x=math.random(minp.x,maxp.x), y=math.random(minp.y,maxp.y), z=math.random(minp.z,maxp.z)} - p2 = minetest.find_node_near(mpos, 25, {"default:desert_sand"}) - end - if p2 == nil then return end - if p2.y < 0 then return end - - local off = 0 - local opos1 = {x=p2.x+22,y=p2.y-1,z=p2.z+22} - local opos2 = {x=p2.x+22,y=p2.y-1,z=p2.z} - local opos3 = {x=p2.x,y=p2.y-1,z=p2.z+22} - local opos1_n = minetest.get_node_or_nil(opos1) - local opos2_n = minetest.get_node_or_nil(opos2) - local opos3_n = minetest.get_node_or_nil(opos3) - if opos1_n and opos1_n.name and opos1_n.name == "air" then - p2 = ground(opos1, p2) - end - if opos2_n and opos2_n.name and opos2_n.name == "air" then - p2 = ground(opos2, p2) - end - if opos3_n and opos3_n.name and opos3_n.name == "air" then - p2 = ground(opos3, p2) - end - p2.y = p2.y - 3 - if p2.y < 0 then p2.y = 0 end - if minetest.find_node_near(p2, 25, {"default:water_source"}) ~= nil or minetest.find_node_near(p2, 22, {"default:dirt_with_grass"}) ~= nil or minetest.find_node_near(p2, 52, {"default:sandstonebrick"}) ~= nil then return end - - if math.random(0,10) > 7 then return end - minetest.after(0.8,make,p2) - end -end) - --- --- backwards compatibility --- - --- spawner mummy -minetest.register_alias("pyramids:spawner_mummy", "spawners_env:spawners_mummy_spawner_env") --- minetest.register_alias("pyramids:mummy_spawner", "spawners_env:spawners_mummy_spawner_env") - --- spawn egg -minetest.register_alias("pyramids:spawn_egg", "spawners_env:mummy") - --- mummy entity -minetest.register_alias("pyramids:mummy", "spawners_env:mummy") - --- deco stone 1 -minetest.register_alias("pyramids:deco_stone1", "spawners_env:deco_stone1") - --- deco stone 2 -minetest.register_alias("pyramids:deco_stone2", "spawners_env:deco_stone2") - --- deco stone 3 -minetest.register_alias("pyramids:deco_stone3", "spawners_env:deco_stone3") - --- deco trap -minetest.register_alias("pyramids:trap", "spawners_env:trap") - --- deco trap 2 -minetest.register_alias("pyramids:trap_2", "spawners_env:trap_2") diff --git a/spawners_env/pyramids_nodes.lua b/spawners_env/pyramids_nodes.lua deleted file mode 100644 index a8198f9..0000000 --- a/spawners_env/pyramids_nodes.lua +++ /dev/null @@ -1,50 +0,0 @@ -local img = {"eye", "men", "sun"} - -for i=1,3 do - minetest.register_node("spawners_env:deco_stone"..i, { - description = "Sandstone with "..img[i], - tiles = {"default_sandstone.png^pyramids_"..img[i]..".png"}, - is_ground_content = true, - groups = {crumbly=2,cracky=3}, - sounds = default.node_sound_stone_defaults(), - }) -end - -trap_on_timer = function (pos, elapsed) - local objs = minetest.get_objects_inside_radius(pos, 2) - for i, obj in pairs(objs) do - if obj:is_player() then - local n = minetest.get_node(pos) - if n and n.name then - if minetest.registered_nodes[n.name].crack and minetest.registered_nodes[n.name].crack < 2 then - minetest.set_node(pos, {name="spawners_env:trap_2"}) - check_for_falling(pos) - end - end - end - end - return true -end - -minetest.register_node("spawners_env:trap", { - description = "Cracked sandstone brick", - tiles = {"default_sandstone_brick.png^pyramids_crack.png"}, - is_ground_content = true, - groups = {crumbly=2,cracky=3}, - sounds = default.node_sound_stone_defaults(), - on_construct = function(pos) - minetest.get_node_timer(pos):start(0.1) - end, - crack = 1, - on_timer = trap_on_timer, - drop = "", -}) - -minetest.register_node("spawners_env:trap_2", { - description = "trapstone", - tiles = {"default_sandstone_brick.png^pyramids_crack.png^[transformR90"}, - is_ground_content = true, - groups = {crumbly=2,cracky=3,falling_node=1,not_in_creative_inventory=1}, - sounds = default.node_sound_stone_defaults(), - drop = "", -}) diff --git a/spawners_env/pyramids_room.lua b/spawners_env/pyramids_room.lua deleted file mode 100644 index 211c99c..0000000 --- a/spawners_env/pyramids_room.lua +++ /dev/null @@ -1,78 +0,0 @@ -local room = {"a","a","a","a","a","a","a","a","a", - "a","c","a","c","a","c","a","c","a", - "a","s","a","s","a","s","a","s","a", - "a","a","a","a","a","a","a","a","a", - "a","a","a","a","a","a","a","a","a", - "a","a","a","a","a","a","a","a","a", - "a","s","a","s","a","s","a","s","a", - "a","c","a","c","a","c","a","c","a", - "a","a","a","a","a","a","a","a","a"} - -local trap = {"b","b","b","b","b","b","b","b","b", - "l","b","l","b","l","b","l","b","b", - "l","b","l","b","l","b","l","b","b", - "l","b","l","l","l","b","l","l","b", - "l","l","b","l","b","l","l","b","b", - "l","b","l","l","l","l","l","l","b", - "l","b","l","b","l","b","l","b","b", - "l","b","l","b","l","b","l","b","b", - "b","b","b","b","b","b","b","b","b"} - -local code = {} -code["s"] = "sandstone" -code["eye"] = "deco_stone1" -code["men"] = "deco_stone2" -code["sun"] = "deco_stone3" -code["c"] = "chest" -code["b"] = "sandstonebrick" -code["a"] = "air" -code["l"] = "lava_source" -code["t"] = "trap" - -local function replace(str,iy) - local out = "default:" - if iy < 4 and str == "c" then str = "a" end - if iy == 0 and str == "s" then out = "spawners_env:" str = "sun" end - if iy == 3 and str == "s" then out = "spawners_env:" str = "men" end - if str == "a" then out = "" end - return out..code[str] -end - -local function replace2(str,iy) - local out = "default:" - if iy == 0 and str == "l" then out = "spawners_env:" str = "t" - elseif iy < 3 and str == "l" then str = "a" end - - if str == "a" then out = "" end - return out..code[str] -end - -function pyramids.make_room(pos) - local loch = {x=pos.x+7,y=pos.y+5, z=pos.z+7} - for iy=0,4,1 do - for ix=0,8,1 do - for iz=0,8,1 do - local n_str = room[tonumber(ix*9+iz+1)] - local p2 = 0 - if n_str == "c" then - if ix < 3 then p2 = 1 else p2 = 3 end - pyramids.fill_chest({x=loch.x+ix,y=loch.y-iy,z=loch.z+iz}) - end - minetest.set_node({x=loch.x+ix,y=loch.y-iy,z=loch.z+iz}, {name=replace(n_str,iy), param2=p2}) - end - end - end -end - -function pyramids.make_traps(pos) - local loch = {x=pos.x+7,y=pos.y, z=pos.z+7} - for iy=0,4,1 do - for ix=0,8,1 do - for iz=0,8,1 do - local n_str = trap[tonumber(ix*9+iz+1)] - local p2 = 0 - minetest.set_node({x=loch.x+ix,y=loch.y-iy,z=loch.z+iz}, {name=replace2(n_str,iy), param2=p2}) - end - end - end -end diff --git a/spawners_env/settings.example.txt b/spawners_env/settings.example.txt deleted file mode 100644 index 3a88ba0..0000000 --- a/spawners_env/settings.example.txt +++ /dev/null @@ -1,3 +0,0 @@ -SPAWN_PYRAMIDS = false -SPAWNERS_GENERATE = false -CHESTS_GENERATE = true diff --git a/spawners_env/sounds/spawners_env_bunny.ogg b/spawners_env/sounds/spawners_env_bunny.ogg deleted file mode 100644 index 0fa0f46..0000000 Binary files a/spawners_env/sounds/spawners_env_bunny.ogg and /dev/null differ diff --git a/spawners_env/sounds/spawners_env_mummy.1.ogg b/spawners_env/sounds/spawners_env_mummy.1.ogg deleted file mode 100644 index cc9ae67..0000000 Binary files a/spawners_env/sounds/spawners_env_mummy.1.ogg and /dev/null differ diff --git a/spawners_env/sounds/spawners_env_mummy.2.ogg b/spawners_env/sounds/spawners_env_mummy.2.ogg deleted file mode 100644 index 2fcb5fa..0000000 Binary files a/spawners_env/sounds/spawners_env_mummy.2.ogg and /dev/null differ diff --git a/spawners_env/sounds/spawners_env_mummy_death.1.ogg b/spawners_env/sounds/spawners_env_mummy_death.1.ogg deleted file mode 100644 index 03902e1..0000000 Binary files a/spawners_env/sounds/spawners_env_mummy_death.1.ogg and /dev/null differ diff --git a/spawners_env/sounds/spawners_env_mummy_hit.1.ogg b/spawners_env/sounds/spawners_env_mummy_hit.1.ogg deleted file mode 100644 index 6548fa7..0000000 Binary files a/spawners_env/sounds/spawners_env_mummy_hit.1.ogg and /dev/null differ diff --git a/spawners_env/spawners_env.lua b/spawners_env/spawners_env.lua index 4deab18..76e3482 100644 --- a/spawners_env/spawners_env.lua +++ b/spawners_env/spawners_env.lua @@ -1,5 +1,3 @@ -local max_obj_per_mapblock = tonumber(minetest.setting_get("max_objects_per_block")) - -- -- * CREATE ALL SPAWNERS NODES * -- @@ -58,21 +56,25 @@ function spawners_env.create(mob_name, mod_prefix, size, offset, mesh, texture, sunlight_propagates = true, tiles = { { - name = "spawners_env_spawner_animated.png", + name = "spawners_env_spawner_animated_16.png", animation = { type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, + aspect_w = 16, + aspect_h = 16, length = 2.0 }, } }, is_ground_content = true, groups = {cracky=1,level=2,igniter=1,not_in_creative_inventory=1}, + on_timer = function(pos, elapsed) + spawners_env.check_for_spawning_timer(pos, mob_name, night_only, mod_prefix, sound_custom) + return false + end, drop = { max_items = 1, items = { - {items = {"spawners_env:"..mod_prefix.."_"..mob_name.."_spawner"}, rarity = 20} + {items = {"spawners_mobs:"..mod_prefix.."_"..mob_name.."_spawner"}, rarity = 20} } }, on_construct = function(pos) @@ -96,21 +98,25 @@ function spawners_env.create(mob_name, mod_prefix, size, offset, mesh, texture, sunlight_propagates = true, tiles = { { - name = "spawners_env_spawner_waiting_animated.png", + name = "spawners_env_spawner_waiting_animated_16.png", animation = { type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, + aspect_w = 16, + aspect_h = 16, length = 2.0 }, } }, is_ground_content = true, groups = {cracky=1,level=2,not_in_creative_inventory=1}, + on_timer = function(pos, elapsed) + spawners_env.check_for_spawning_timer(pos, mob_name, night_only, mod_prefix, sound_custom) + return false + end, drop = { max_items = 1, items = { - {items = {"spawners_env:"..mod_prefix.."_"..mob_name.."_spawner"}, rarity = 20} + {items = {"spawners_mobs:"..mod_prefix.."_"..mob_name.."_spawner"}, rarity = 20} } }, }) @@ -126,124 +132,100 @@ function spawners_env.create(mob_name, mod_prefix, size, offset, mesh, texture, walkable = true, sounds = default.node_sound_metal_defaults(), sunlight_propagates = true, - tiles = {"spawners_env_spawner.png"}, + tiles = {"spawners_env_spawner_16.png"}, is_ground_content = true, groups = {cracky=1,level=2,not_in_creative_inventory=1}, stack_max = 1, drop = { max_items = 1, items = { - {items = {"spawners_env:"..mod_prefix.."_"..mob_name.."_spawner"}, rarity = 20} + {items = {"spawners_mobs:"..mod_prefix.."_"..mob_name.."_spawner"}, rarity = 20} } }, on_construct = function(pos) - local random_pos, waiting = spawners_env.check_node_status(pos, mob_name, night_only) - - if random_pos then - minetest.set_node(pos, {name="spawners_env:"..mod_prefix.."_"..mob_name.."_spawner_active"}) - elseif waiting then - minetest.set_node(pos, {name="spawners_env:"..mod_prefix.."_"..mob_name.."_spawner_waiting"}) - else - end + spawners_env.check_for_spawning_timer(pos, mob_name, night_only, mod_prefix, sound_custom) end, }) -- - -- OVERHEATED SPAWNER ENV + -- * LBM * -- - minetest.register_node("spawners_env:"..mod_prefix.."_"..mob_name.."_spawner_overheat", { - description = mod_prefix.."_"..mob_name.." spawner overheated env", - paramtype = "light", - light_source = 2, - drawtype = "allfaces", - walkable = true, - sounds = default.node_sound_metal_defaults(), - damage_per_second = 4, - sunlight_propagates = true, - tiles = {"spawners_env_spawner.png^[colorize:#FF000030"}, - is_ground_content = true, - groups = {cracky=1,level=2,igniter=1,not_in_creative_inventory=1}, - drop = { - max_items = 1, - items = { - {items = {"spawners_env:"..mod_prefix.."_"..mob_name.."_spawner"}, rarity = 20} - } - }, - on_construct = function(pos) - minetest.get_node_timer(pos):start(60) - end, - on_timer = function(pos, elapsed) - minetest.set_node(pos, {name="spawners_env:"..mod_prefix.."_"..mob_name.."_spawner"}) - end, - }) - - -- - -- * ABM * - -- - - minetest.register_abm({ + minetest.register_lbm({ + name = "spawners_env:check_for_spawning_timer", nodenames = { "spawners_env:"..mod_prefix.."_"..mob_name.."_spawner", "spawners_env:"..mod_prefix.."_"..mob_name.."_spawner_active", - "spawners_env:"..mod_prefix.."_"..mob_name.."_spawner_overheat", "spawners_env:"..mod_prefix.."_"..mob_name.."_spawner_waiting" }, - neighbors = {"air"}, - interval = 3.0, - chance = 3, - catch_up = false, - action = function(pos, node, active_object_count, active_object_count_wider) + action = function(pos) + spawners_env.check_for_spawning_timer(pos, mob_name, night_only, mod_prefix, sound_custom) + end + }) +end - local random_pos, waiting = spawners_env.check_node_status(pos, mob_name, night_only) +-- +-- * check for spawning * +-- +function spawners_env.check_for_spawning_timer(pos, mob_name, night_only, mod_prefix, sound_custom) - -- minetest.log("action", "[Mod][Spawners] checking for: "..mob_name.." at "..minetest.pos_to_string(pos)) + local random_pos, waiting = spawners_env.check_node_status(pos, mob_name, night_only) - if random_pos then + local node = minetest.get_node_or_nil(pos) - -- do not spawn if too many active entities in map block and call cooldown - if active_object_count_wider > max_obj_per_mapblock then + -- minetest.log("action", "[Mod][Spawners] checking for: "..mob_name.." at "..minetest.pos_to_string(pos)) - -- make sure the right node status is shown - if node.name ~= "spawners_env:"..mob_name.."_spawner_overheat" then - minetest.set_node(pos, {name="spawners_env:"..mod_prefix.."_"..mob_name.."_spawner_overheat"}) - end + if random_pos then + -- print('try to spawn another mob at: '..minetest.pos_to_string(random_pos)) - -- extend the timeout if still too many entities in map block - if node.name == "spawners_env:"..mod_prefix.."_"..mob_name.."_spawner_overheat" then - minetest.get_node_timer(pos):stop() - minetest.get_node_timer(pos):start(60) - end + local mobs_counter_table = {} + mobs_counter_table[mob_name] = 0 + + -- collect all spawned mobs around area + for _,obj in ipairs(minetest.get_objects_inside_radius(pos, 10)) do + + if obj:get_luaentity() ~= nil then + + -- get entity name + local name_split = string.split(obj:get_luaentity().name, ":") + + if name_split[2] == mob_name then + + mobs_counter_table[mob_name]=mobs_counter_table[mob_name]+1 - return - end - -- make sure the right node status is shown - if node.name ~= "spawners_env:"..mod_prefix.."_"..mob_name.."_spawner_active" then - minetest.set_node(pos, {name="spawners_env:"..mod_prefix.."_"..mob_name.."_spawner_active"}) end - -- enough place to spawn more mobs - spawners_env.start_spawning(random_pos, 1, "spawners_env:"..mob_name, mod_prefix, sound_custom) - - elseif waiting then - -- waiting status - if node.name ~= "spawners_env:"..mod_prefix.."_"..mob_name.."_spawner_waiting" then - minetest.set_node(pos, {name="spawners_env:"..mod_prefix.."_"..mob_name.."_spawner_waiting"}) - end - else - -- no random_pos found - if minetest.get_node_timer(pos):is_started() then - minetest.get_node_timer(pos):stop() - end - - if node.name ~= "spawners_env:"..mod_prefix.."_"..mob_name.."_spawner" then - minetest.set_node(pos, {name="spawners_env:"..mod_prefix.."_"..mob_name.."_spawner"}) - end end end - }) + -- print(mob_name.." : "..mobs_counter_table[mob_name]) + + -- enough place to spawn more mobs + if mobs_counter_table[mob_name] < 3 then + -- make sure the right node status is shown + if node.name ~= "spawners_env:"..mod_prefix.."_"..mob_name.."_spawner_active" then + minetest.set_node(pos, {name="spawners_env:"..mod_prefix.."_"..mob_name.."_spawner_active"}) + end + + spawners_env.start_spawning(random_pos, 1, "spawners_env:"..mob_name, mod_prefix, sound_custom) + else + -- print("too many mobs: waiting") + -- waiting status + if node.name ~= "spawners_env:"..mod_prefix.."_"..mob_name.."_spawner_waiting" then + minetest.set_node(pos, {name="spawners_env:"..mod_prefix.."_"..mob_name.."_spawner_waiting"}) + end + end + + else + -- print("no random_pos found: waiting") + -- waiting status + if node.name ~= "spawners_env:"..mod_prefix.."_"..mob_name.."_spawner_waiting" then + minetest.set_node(pos, {name="spawners_env:"..mod_prefix.."_"..mob_name.."_spawner_waiting"}) + end + end + + minetest.get_node_timer(pos):start(math.random(5, 15)) end -- diff --git a/spawners_env/spawners_gen.lua b/spawners_env/spawners_gen.lua index 3994886..e9a47c5 100644 --- a/spawners_env/spawners_gen.lua +++ b/spawners_env/spawners_gen.lua @@ -1,9 +1,15 @@ --- Place spawners in dungeons -local function place_spawner(param) - local tab = param[1] - local gen_obj = param[2] +-- Place chests in dungeons and temples +local function place_chest(param) + local skip = math.random(0,1) - local pos = tab[math.random(1, (#tab or 3))] + -- skip chest + if skip == 1 then + return + end + + local tab = param + + local pos = tab[math.random(1, (#tab or 4))] pos.y = pos.y - 1 local n = minetest.get_node_or_nil(pos) @@ -11,10 +17,45 @@ local function place_spawner(param) if n and n.name ~= "air" then pos.y = pos.y + 1 + minetest.log("action", "[Mod][Spawners] Chest placed at: "..minetest.pos_to_string(pos)) + + minetest.set_node(pos, {name = "default:chest"}) + + spawners_env.fill_chest(pos) + end +end + +-- Place spawners in dungeons +local function place_spawner(param) + local skip = math.random(0,1) + + -- skip spawner + if skip == 1 then + return + end + + local tab = param[1] + local gen_obj = param[2] + + local pos = tab[math.random(1, (#tab or 4))] + pos.y = pos.y - 1 + + local n = minetest.get_node_or_nil(pos) + local n2 = minetest.get_node_or_nil({x=pos.x, y=pos.y+1, z=pos.z}) + + if n and n.name ~= "air" then + pos.y = pos.y + 1 + + -- pos the same as chest, putting spawner above the chest + if n2 and n2.name == "default:chest" then + -- print("pos the same as chest, putting spawner above the chest") + pos.y = pos.y + 1 + end + if gen_obj == "dungeon" then minetest.log("action", "[Mod][Spawners] dungeon spawner placed at: "..minetest.pos_to_string(pos)) - minetest.set_node(pos, {name = "spawners_env:spawners_env_mummy_spawner"}) + minetest.set_node(pos, {name = "spawners_env:spawners_mobs_uruk_hai_spawner"}) else minetest.log("action", "[Mod][Spawners] temple spawner placed at: "..minetest.pos_to_string(pos)) @@ -28,13 +69,15 @@ minetest.set_gen_notify("dungeon") minetest.set_gen_notify("temple") minetest.register_on_generated(function(minp, maxp, blockseed) - local ntf = minetest.get_mapgen_object("gennotify") + local notify = minetest.get_mapgen_object("gennotify") - if ntf and ntf.dungeon then - minetest.after(3, place_spawner, {table.copy(ntf.dungeon), "dungeon"}) + if notify and notify.dungeon then + minetest.after(2, place_chest, table.copy(notify.dungeon)) + minetest.after(3, place_spawner, {table.copy(notify.dungeon), "dungeon"}) end - if ntf and ntf.temple then - minetest.after(3, place_spawner, {table.copy(ntf.temple), "temple"}) + if notify and notify.temple then + minetest.after(2, place_chest, table.copy(notify.temple)) + minetest.after(3, place_spawner, {table.copy(notify.temple), "temple"}) end end) \ No newline at end of file diff --git a/spawners_env/textures/spawners_env_crack.png b/spawners_env/textures/spawners_env_crack.png deleted file mode 100644 index 9ff12fb..0000000 Binary files a/spawners_env/textures/spawners_env_crack.png and /dev/null differ diff --git a/spawners_env/textures/spawners_env_eye.png b/spawners_env/textures/spawners_env_eye.png deleted file mode 100644 index 4445dff..0000000 Binary files a/spawners_env/textures/spawners_env_eye.png and /dev/null differ diff --git a/spawners_env/textures/spawners_env_men.png b/spawners_env/textures/spawners_env_men.png deleted file mode 100644 index 69cd4de..0000000 Binary files a/spawners_env/textures/spawners_env_men.png and /dev/null differ diff --git a/spawners_env/textures/spawners_env_mummy.png b/spawners_env/textures/spawners_env_mummy.png deleted file mode 100644 index 351383a..0000000 Binary files a/spawners_env/textures/spawners_env_mummy.png and /dev/null differ diff --git a/spawners_env/textures/spawners_env_spawner_animated_16.png b/spawners_env/textures/spawners_env_spawner_animated_16.png new file mode 100644 index 0000000..3ede881 Binary files /dev/null and b/spawners_env/textures/spawners_env_spawner_animated_16.png differ diff --git a/spawners_env/textures/spawners_env_spawner_normal.png b/spawners_env/textures/spawners_env_spawner_normal.png deleted file mode 100644 index b102aa7..0000000 Binary files a/spawners_env/textures/spawners_env_spawner_normal.png and /dev/null differ diff --git a/spawners_env/textures/spawners_env_spawner_waiting_animated_16.png b/spawners_env/textures/spawners_env_spawner_waiting_animated_16.png new file mode 100644 index 0000000..9df39a7 Binary files /dev/null and b/spawners_env/textures/spawners_env_spawner_waiting_animated_16.png differ diff --git a/spawners_env/textures/spawners_env_sun.png b/spawners_env/textures/spawners_env_sun.png deleted file mode 100644 index 63d3b95..0000000 Binary files a/spawners_env/textures/spawners_env_sun.png and /dev/null differ diff --git a/spawners_mobs/api.lua b/spawners_mobs/api.lua index 77631e1..a2b9912 100644 --- a/spawners_mobs/api.lua +++ b/spawners_mobs/api.lua @@ -114,11 +114,15 @@ end -- start spawning mobs function spawners_mobs.start_spawning(random_pos, how_many, mob_name, mod_prefix, sound_custom) + print(mod_prefix) + print(mob_name) if not (random_pos or how_many or mob_name) then return end local sound_name -- remove 'spawners_mobs:' from the string local mob_name = string.sub(mob_name,15) + print(mod_prefix) + print(mob_name) -- use custom sounds if sound_custom ~= "" then @@ -144,6 +148,8 @@ function spawners_mobs.start_spawning(random_pos, how_many, mob_name, mod_prefix local obj + print(mod_prefix) + print(mob_name) minetest.after(1, function() obj = minetest.add_entity(random_pos, mod_prefix..":"..mob_name) diff --git a/spawners_mobs/init.lua b/spawners_mobs/init.lua index fdec174..18a31de 100644 --- a/spawners_mobs/init.lua +++ b/spawners_mobs/init.lua @@ -13,6 +13,7 @@ dofile(minetest.get_modpath(MOD_NAME).."/spawners_mobs.lua") if minetest.get_modpath("mobs") then dofile(minetest.get_modpath(MOD_NAME).."/mob_mummy.lua") dofile(minetest.get_modpath(MOD_NAME).."/mob_bunny_evil.lua") + dofile(minetest.get_modpath(MOD_NAME).."/mob_uruk_hai.lua") dofile(minetest.get_modpath(MOD_NAME).."/nodes_additional.lua") end diff --git a/spawners_mobs/mob_balrog.lua b/spawners_mobs/mob_balrog.lua new file mode 100644 index 0000000..83c3b39 --- /dev/null +++ b/spawners_mobs/mob_balrog.lua @@ -0,0 +1,73 @@ +-- modified Sand Monster by PilzAdam with Mummy by BlockMen + +local mummy_def = { + type = "monster", + passive = false, + rotate = 180, + hp_min = 5, + hp_max = 10, + pathfinding = true, + attack_type = "dogfight", + shoot_interval = 2, + dogshoot_switch = 1, + dogshoot_count_max = 10, + arrow = "spawners_mobs:black_skull", + shoot_offset = 2, + reach = 3, + damage = 10, + armor = 100, + collisionbox = {-0.8, -2.1, -0.8, 0.8, 2.6, 0.8}, + visual_size = {x=2, y=2}, + visual = "mesh", + mesh = "spawners_mobs_balrog.b3d", + drawtype = "front", + textures = { + {"spawners_mobs_balrog.png"}, + }, + makes_footstep_sound = true, + sounds = { + war_cry = "spawners_mobs_howl", + death = "spawners_mobs_howl", + attack = "spawners_mobs_stone_death", + }, + walk_velocity = 1, + run_velocity = 3, + view_range = 15, + jump = true, + floats = 1, + drops = { + {name = "default:sandstone", chance = 5, min = 1, max = 2}, + {name = "default:sandstonebrick", chance = 5, min = 1, max = 2}, + {name = "spawners_mobs:deco_stone_eye", chance = 25, min = 1, max = 1}, + {name = "spawners_mobs:deco_stone_men", chance = 25, min = 1, max = 1}, + {name = "spawners_mobs:deco_stone_sun", chance = 25, min = 1, max = 1}, + }, + water_damage = 0, + lava_damage = 0, + light_damage = 0, + fear_height = 4, + animation = { + stand_start = 0, + stand_end = 240, + walk_start = 240, + walk_end = 300, + punch_start = 300, + punch_end = 380, + speed_normal = 15, + speed_run = 15, + }, +} + +mobs:register_mob("spawners_mobs:balrog", mummy_def) + +mobs:spawn({ + name = "spawners_mobs:balrog", + nodes = {"default:desert_sand", "default:desert_stone", "default:sand", "default:sandstone", "default:silver_sand"}, + min_light = 0, + max_light = 20, + chance = 2000, + active_object_count = 2, + day_toggle = false, +}) + +mobs:register_egg("spawners_mobs:balrog", "balrog", "default_sandstone_brick.png", 1) diff --git a/spawners_mobs/mob_uruk_hai.lua b/spawners_mobs/mob_uruk_hai.lua new file mode 100644 index 0000000..a4f73ce --- /dev/null +++ b/spawners_mobs/mob_uruk_hai.lua @@ -0,0 +1,72 @@ +-- uruk_hai + +local uruk_hai_def = { + type = "monster", + docile_by_day = true, + passive = false, + hp_min = 25, + hp_max = 45, + pathfinding = true, + attack_type = "dogfight", + group_attack = true, + reach = 2, + damage = 4, + armor = 100, + collisionbox = {-0.3,-1.0,-0.3, 0.3,0.8,0.3}, + visual = "mesh", + mesh = "spawners_mobs_character.b3d", + drawtype = "front", + textures = { + {"spawners_mobs_uruk_hai.png", "spawners_mobs_trans.png","spawners_mobs_galvornsword.png", "spawners_mobs_trans.png"}, + {"spawners_mobs_uruk_hai_1.png", "spawners_mobs_trans.png","spawners_mobs_galvornsword.png", "spawners_mobs_trans.png"}, + {"spawners_mobs_uruk_hai_2.png", "spawners_mobs_trans.png","spawners_mobs_galvornsword.png", "spawners_mobs_trans.png"}, + {"spawners_mobs_uruk_hai_3.png", "spawners_mobs_trans.png","spawners_mobs_galvornsword.png", "spawners_mobs_trans.png"}, + }, + makes_footstep_sound = true, + sounds = { + random = "spawners_mobs_barbarian_yell2", + death = "spawners_mobs_death2", + attack = "spawners_mobs_slash_attack", + }, + walk_velocity = 1, + run_velocity = 3, + view_range = 15, + jump = true, + floats = 1, + drops = { + {name = "default:apple", chance = 10, min = 1, max = 2}, + {name = "default:wood", chance = 15, min = 1, max = 2}, + {name = "default:stick", chance = 10, min = 1, max = 2}, + {name = "default:torch", chance = 10, min = 1, max = 2}, + }, + water_damage = 0, + lava_damage = 0, + light_damage = 0, + fear_height = 4, + animation = { + speed_normal = 15, + speed_run = 15, + stand_start = 0, + stand_end = 79, + walk_start = 168, + walk_end = 187, + run_start = 168, + run_end = 187, + punch_start = 189, + punch_end = 198, + }, +} + +mobs:register_mob("spawners_mobs:uruk_hai", uruk_hai_def) + +-- mobs:spawn({ +-- name = "spawners_mobs:uruk_hai", +-- nodes = {"default:desert_sand", "default:desert_stone", "default:sand", "default:sandstone", "default:silver_sand"}, +-- min_light = 0, +-- max_light = 20, +-- chance = 2000, +-- active_object_count = 2, +-- day_toggle = false, +-- }) + +mobs:register_egg("spawners_mobs:uruk_hai", "uruk_hai", "spawners_mobs_uruk_hai_egg.png", 0, true) diff --git a/spawners_mobs/models/spawners_mobs_balrog.b3d b/spawners_mobs/models/spawners_mobs_balrog.b3d new file mode 100644 index 0000000..5fa371e Binary files /dev/null and b/spawners_mobs/models/spawners_mobs_balrog.b3d differ diff --git a/spawners_mobs/models/spawners_mobs_character.b3d b/spawners_mobs/models/spawners_mobs_character.b3d new file mode 100644 index 0000000..33801f9 Binary files /dev/null and b/spawners_mobs/models/spawners_mobs_character.b3d differ diff --git a/spawners_mobs/sounds/spawners_mobs_barbarian_yell2.ogg b/spawners_mobs/sounds/spawners_mobs_barbarian_yell2.ogg new file mode 100644 index 0000000..3873385 Binary files /dev/null and b/spawners_mobs/sounds/spawners_mobs_barbarian_yell2.ogg differ diff --git a/spawners_mobs/sounds/spawners_mobs_death2.ogg b/spawners_mobs/sounds/spawners_mobs_death2.ogg new file mode 100644 index 0000000..7ad53cf Binary files /dev/null and b/spawners_mobs/sounds/spawners_mobs_death2.ogg differ diff --git a/spawners_mobs/sounds/spawners_mobs_howl.ogg b/spawners_mobs/sounds/spawners_mobs_howl.ogg new file mode 100644 index 0000000..de7d8e8 Binary files /dev/null and b/spawners_mobs/sounds/spawners_mobs_howl.ogg differ diff --git a/spawners_mobs/sounds/spawners_mobs_slash_attack.ogg b/spawners_mobs/sounds/spawners_mobs_slash_attack.ogg new file mode 100644 index 0000000..752360a Binary files /dev/null and b/spawners_mobs/sounds/spawners_mobs_slash_attack.ogg differ diff --git a/spawners_mobs/sounds/spawners_mobs_stone_death.ogg b/spawners_mobs/sounds/spawners_mobs_stone_death.ogg new file mode 100644 index 0000000..8ff976e Binary files /dev/null and b/spawners_mobs/sounds/spawners_mobs_stone_death.ogg differ diff --git a/spawners_mobs/spawners_mobs.lua b/spawners_mobs/spawners_mobs.lua index 48bf712..e64cc5f 100644 --- a/spawners_mobs/spawners_mobs.lua +++ b/spawners_mobs/spawners_mobs.lua @@ -134,8 +134,8 @@ function spawners_mobs.create(mob_name, mod_prefix, size, offset, mesh, texture, name = "spawners_mobs_spawner_waiting_animated_16.png", animation = { type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, + aspect_w = 16, + aspect_h = 16, length = 2.0 }, } @@ -176,7 +176,7 @@ function spawners_mobs.create(mob_name, mod_prefix, size, offset, mesh, texture, elseif waiting then minetest.set_node(pos, {name="spawners_mobs:"..mod_prefix.."_"..mob_name.."_spawner_waiting"}) else - print("no position and not waiting") + -- print("no position and not waiting") end end, }) @@ -236,7 +236,7 @@ function spawners_mobs.create(mob_name, mod_prefix, size, offset, mesh, texture, "spawners_mobs:"..mod_prefix.."_"..mob_name.."_spawner_waiting" }, neighbors = {"air"}, - interval = 20.0, + interval = 20, chance = 20, catch_up = false, action = function(pos, node, active_object_count, active_object_count_wider) diff --git a/spawners_mobs/textures/spawners_mobs_balrog.png b/spawners_mobs/textures/spawners_mobs_balrog.png new file mode 100644 index 0000000..1366302 Binary files /dev/null and b/spawners_mobs/textures/spawners_mobs_balrog.png differ diff --git a/spawners_mobs/textures/spawners_mobs_galvornsword.png b/spawners_mobs/textures/spawners_mobs_galvornsword.png new file mode 100644 index 0000000..000d4ab Binary files /dev/null and b/spawners_mobs/textures/spawners_mobs_galvornsword.png differ diff --git a/spawners_mobs/textures/spawners_mobs_trans.png b/spawners_mobs/textures/spawners_mobs_trans.png new file mode 100644 index 0000000..e215ca2 Binary files /dev/null and b/spawners_mobs/textures/spawners_mobs_trans.png differ diff --git a/spawners_mobs/textures/spawners_mobs_uruk_hai.png b/spawners_mobs/textures/spawners_mobs_uruk_hai.png new file mode 100644 index 0000000..e4704b4 Binary files /dev/null and b/spawners_mobs/textures/spawners_mobs_uruk_hai.png differ diff --git a/spawners_mobs/textures/spawners_mobs_uruk_hai_1.png b/spawners_mobs/textures/spawners_mobs_uruk_hai_1.png new file mode 100644 index 0000000..0527ee0 Binary files /dev/null and b/spawners_mobs/textures/spawners_mobs_uruk_hai_1.png differ diff --git a/spawners_mobs/textures/spawners_mobs_uruk_hai_2.png b/spawners_mobs/textures/spawners_mobs_uruk_hai_2.png new file mode 100644 index 0000000..ef0af44 Binary files /dev/null and b/spawners_mobs/textures/spawners_mobs_uruk_hai_2.png differ diff --git a/spawners_mobs/textures/spawners_mobs_uruk_hai_3.png b/spawners_mobs/textures/spawners_mobs_uruk_hai_3.png new file mode 100644 index 0000000..a8860b1 Binary files /dev/null and b/spawners_mobs/textures/spawners_mobs_uruk_hai_3.png differ diff --git a/spawners_mobs/textures/spawners_mobs_uruk_hai_egg.png b/spawners_mobs/textures/spawners_mobs_uruk_hai_egg.png new file mode 100644 index 0000000..4d56128 Binary files /dev/null and b/spawners_mobs/textures/spawners_mobs_uruk_hai_egg.png differ