spawners env refactored

master
Juraj Vajda 2016-12-07 21:37:36 +01:00
parent 98461a7dd0
commit 24cfe39e30
47 changed files with 444 additions and 916 deletions

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -1,3 +1,2 @@
default
mobs?
creatures?
spawners_mobs

View File

@ -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.")

View File

@ -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)

View File

@ -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

View File

@ -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")

View File

@ -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 = "",
})

View File

@ -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

View File

@ -1,3 +0,0 @@
SPAWN_PYRAMIDS = false
SPAWNERS_GENERATE = false
CHESTS_GENERATE = true

View File

@ -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
--

View File

@ -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.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 499 B

View File

@ -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)

View File

@ -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

View File

@ -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)

View File

@ -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.

View File

@ -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.