spawners env refactored
parent
98461a7dd0
commit
24cfe39e30
|
@ -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
|
|
@ -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)
|
|
@ -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
|
|
@ -1,3 +1,2 @@
|
|||
default
|
||||
mobs?
|
||||
creatures?
|
||||
spawners_mobs
|
|
@ -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.")
|
|
@ -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)
|
Binary file not shown.
|
@ -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
|
|
@ -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")
|
|
@ -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 = "",
|
||||
})
|
|
@ -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
|
|
@ -1,3 +0,0 @@
|
|||
SPAWN_PYRAMIDS = false
|
||||
SPAWNERS_GENERATE = false
|
||||
CHESTS_GENERATE = true
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -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
|
||||
|
||||
--
|
|
@ -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)
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 499 B |
Binary file not shown.
|
@ -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)
|
||||
|
|
@ -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
|
||||
|
|
@ -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)
|
|
@ -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)
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -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)
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue