Merge pull request 'Several mob spawning and mob api fixes' (#2452) from mob_fixes into master

Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/2452
Reviewed-by: MysticTempest <mystictempest@noreply.git.minetest.land>
This commit is contained in:
cora 2022-07-18 03:23:17 +00:00
commit 396b65ca04
27 changed files with 124 additions and 97 deletions

View file

@ -1905,11 +1905,10 @@ local specific_attack = function(list, what)
return false return false
end end
-- monster find someone to attack -- find someone to attack
local monster_attack = function(self) local monster_attack = function(self)
if self.type ~= "monster" if not damage_enabled
or not damage_enabled
or minetest.is_creative_enabled("") or minetest.is_creative_enabled("")
or self.passive or self.passive
or self.state == "attack" or self.state == "attack"
@ -1927,10 +1926,9 @@ local monster_attack = function(self)
for n = 1, #objs do for n = 1, #objs do
if objs[n]:is_player() then if objs[n]:is_player() then
if mcl_mobs.invis[ objs[n]:get_player_name() ] or (not object_in_range(self, objs[n])) then if mcl_mobs.invis[ objs[n]:get_player_name() ] or (not object_in_range(self, objs[n])) then
type = "" type = ""
else elseif (self.type == "monster" or self._aggro) then
player = objs[n] player = objs[n]
type = "player" type = "player"
name = "player" name = "player"
@ -3346,11 +3344,11 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir)
and (self.child == false or self.type == "monster") and (self.child == false or self.type == "monster")
and hitter:get_player_name() ~= self.owner and hitter:get_player_name() ~= self.owner
and not mcl_mobs.invis[ name ] then and not mcl_mobs.invis[ name ] then
if not die then if not die then
-- attack whoever punched mob -- attack whoever punched mob
self.state = "" self.state = ""
do_attack(self, hitter) do_attack(self, hitter)
self._aggro= true
end end
-- alert others to the attack -- alert others to the attack
@ -3362,7 +3360,6 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir)
obj = objs[n]:get_luaentity() obj = objs[n]:get_luaentity()
if obj then if obj then
-- only alert members of same mob or friends -- only alert members of same mob or friends
if obj.group_attack if obj.group_attack
and obj.state ~= "attack" and obj.state ~= "attack"
@ -3372,6 +3369,7 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir)
elseif type(obj.group_attack) == "table" then elseif type(obj.group_attack) == "table" then
for i=1, #obj.group_attack do for i=1, #obj.group_attack do
if obj.name == obj.group_attack[i] then if obj.name == obj.group_attack[i] then
obj._aggro = true
do_attack(obj, hitter) do_attack(obj, hitter)
break break
end end
@ -4037,6 +4035,7 @@ minetest.register_entity(name, {
fire_damage_resistant = def.fire_damage_resistant or false, fire_damage_resistant = def.fire_damage_resistant or false,
ignited_by_sunlight = def.ignited_by_sunlight or false, ignited_by_sunlight = def.ignited_by_sunlight or false,
spawn_in_group = def.spawn_in_group, spawn_in_group = def.spawn_in_group,
spawn_in_group_min = def.spawn_in_group_min,
-- End of MCL2 extensions -- End of MCL2 extensions
on_spawn = def.on_spawn, on_spawn = def.on_spawn,

View file

@ -15,7 +15,7 @@ local math_cos = math.cos
local math_sin = math.sin local math_sin = math.sin
local math_round = function(x) return (x > 0) and math_floor(x + 0.5) or math_ceil(x - 0.5) end local math_round = function(x) return (x > 0) and math_floor(x + 0.5) or math_ceil(x - 0.5) end
--local vector_distance = vector.distance local vector_distance = vector.distance
local vector_new = vector.new local vector_new = vector.new
local vector_floor = vector.floor local vector_floor = vector.floor
@ -25,7 +25,15 @@ local table_remove = table.remove
local pairs = pairs local pairs = pairs
-- range for mob count -- range for mob count
local aoc_range = 32 local aoc_range = 136
local mob_cap = {
monster = 70,
animal =10,
ambient =15,
water = 5, --currently unused
water_ambient = 20, --currently unused
}
--do mobs spawn? --do mobs spawn?
local mobs_spawn = minetest.settings:get_bool("mobs_spawn", true) ~= false local mobs_spawn = minetest.settings:get_bool("mobs_spawn", true) ~= false
@ -153,6 +161,10 @@ local list_of_all_biomes = {
-- dimension biome: -- dimension biome:
"Nether", "Nether",
"BasaltDelta",
"CrimsonForest",
"WarpedForest",
"SoulsandValley",
"End", "End",
-- Overworld regular: -- Overworld regular:
@ -162,6 +174,8 @@ local list_of_all_biomes = {
"Swampland", "Swampland",
"Taiga", "Taiga",
"ExtremeHills", "ExtremeHills",
"ExtremeHillsM",
"ExtremeHills+_snowtop",
"Jungle", "Jungle",
"Savanna", "Savanna",
"BirchForest", "BirchForest",
@ -180,7 +194,6 @@ local list_of_all_biomes = {
"ExtremeHills+_snowtop", "ExtremeHills+_snowtop",
"MesaPlateauFM_grasstop", "MesaPlateauFM_grasstop",
"JungleEdgeM", "JungleEdgeM",
"ExtremeHillsM",
"JungleM", "JungleM",
"BirchForestM", "BirchForestM",
"MesaPlateauF", "MesaPlateauF",
@ -189,17 +202,29 @@ local list_of_all_biomes = {
"MesaBryce", "MesaBryce",
"JungleEdge", "JungleEdge",
"SavannaM", "SavannaM",
"Nether",
"WarpedForest",
"SoulsandValley"
} }
-- count how many mobs are in an area -- count how many mobs are in an area
local function count_mobs(pos) local function count_mobs(pos,r,mob_type)
local num = 0 local num = 0
for _,object in pairs(get_objects_inside_radius(pos, aoc_range)) do for _,l in pairs(minetest.luaentities) do
if object and object:get_luaentity() and object:get_luaentity().is_mob then if l and l.is_mob and (mob_type == nil or l.type == mob_type) then
num = num + 1 local p = l.object:get_pos()
if p and vector_distance(p,pos) < r then
num = num + 1
end
end
end
return num
end
local function count_mobs_total(mob_type)
local num = 0
for _,l in pairs(minetest.luaentities) do
if l.is_mob then
if mob_type == nil or l.type == mob_type then
num = num + 1
end
end end
end end
return num return num
@ -292,7 +317,7 @@ function mcl_mobs:spawn_setup(def)
spawn_dictionary[#spawn_dictionary + 1] = { spawn_dictionary[#spawn_dictionary + 1] = {
name = name, name = name,
dimension = dimension, dimension = dimension,
type_of_spawning = type_of_spawning, type_of_spawning = type_of_spawning,
biomes = biomes, biomes = biomes,
min_light = min_light, min_light = min_light,
max_light = max_light, max_light = max_light,
@ -386,22 +411,45 @@ local function get_water_spawn(p)
end end
end end
local function spawn_group(p,mob,spawn_on,group_max) local dbg_spawn_attempts = 0
local nn = minetest.find_nodes_in_area(vector.offset(p,-3,-3,-3),vector.offset(p,3,3,3),spawn_on) local dbg_spawn_succ = 0
local function spawn_group(p,mob,spawn_on,group_max,group_min)
if not group_min then group_min = 1 end
local nn= minetest.find_nodes_in_area_under_air(vector.offset(p,-5,-3,-5),vector.offset(p,5,3,5),spawn_on)
local o
if not nn or #nn < 1 then if not nn or #nn < 1 then
nn = {} nn = {}
table.insert(nn,p) table.insert(nn,p)
end end
for i = 1, math.random(group_max) do for i = 1, math.random(group_min,group_max) do
minetest.add_entity(nn[math.random(#nn)],mob) local sp = vector.offset(nn[math.random(#nn)],0,1,0)
if mob.type_of_spawning == "water" then
sp = get_water_spawn(sp)
end
o = minetest.add_entity(sp,mob.name)
if o then dbg_spawn_succ = dbg_spawn_succ + 1 end
end end
return o
end end
minetest.register_chatcommand("mobstats",{
privs = { debug = true },
func = function(n,param)
local pos = minetest.get_player_by_name(n):get_pos()
minetest.chat_send_player(n,"mobs within 32 radius of player:"..count_mobs(pos,32))
minetest.chat_send_player(n,"total mobs:"..count_mobs_total())
minetest.chat_send_player(n,"spawning attempts since server start:"..dbg_spawn_attempts)
minetest.chat_send_player(n,"successful spawns since server start:"..dbg_spawn_succ)
end
})
if mobs_spawn then if mobs_spawn then
local perlin_noise local perlin_noise
local function spawn_a_mob(pos, dimension, y_min, y_max) local function spawn_a_mob(pos, dimension, y_min, y_max)
dbg_spawn_attempts = dbg_spawn_attempts + 1
local dimension = dimension or mcl_worlds.pos_to_dimension(pos) local dimension = dimension or mcl_worlds.pos_to_dimension(pos)
local goal_pos = get_next_mob_spawn_pos(pos) local goal_pos = get_next_mob_spawn_pos(pos)
local spawning_position_list = find_nodes_in_area_under_air( local spawning_position_list = find_nodes_in_area_under_air(
@ -412,9 +460,6 @@ if mobs_spawn then
if #spawning_position_list <= 0 then return end if #spawning_position_list <= 0 then return end
local spawning_position = spawning_position_list[math_random(1, #spawning_position_list)] local spawning_position = spawning_position_list[math_random(1, #spawning_position_list)]
--hard code mob limit in area to 5 for now
if count_mobs(spawning_position) >= 5 then return end
local gotten_node = get_node(spawning_position).name local gotten_node = get_node(spawning_position).name
local gotten_biome = minetest.get_biome_data(spawning_position) local gotten_biome = minetest.get_biome_data(spawning_position)
if not gotten_node or not gotten_biome then return end if not gotten_node or not gotten_biome then return end
@ -429,6 +474,7 @@ if mobs_spawn then
local is_water = get_item_group(gotten_node, "water") ~= 0 local is_water = get_item_group(gotten_node, "water") ~= 0
local is_lava = get_item_group(gotten_node, "lava") ~= 0 local is_lava = get_item_group(gotten_node, "lava") ~= 0
local is_leaf = get_item_group(gotten_node, "leaves") ~= 0 local is_leaf = get_item_group(gotten_node, "leaves") ~= 0
local is_bedrock = gotten_node == "mcl_core:bedrock"
local is_ground = not (is_water or is_lava) local is_ground = not (is_water or is_lava)
local is_grass = minetest.get_item_group(gotten_node,"grass_block") ~= 0 local is_grass = minetest.get_item_group(gotten_node,"grass_block") ~= 0
local has_bed = minetest.find_node_near(pos,25,{"group:bed"}) local has_bed = minetest.find_node_near(pos,25,{"group:bed"})
@ -461,8 +507,12 @@ if mobs_spawn then
end end
local mob_def = mob_library_worker_table[mob_index] local mob_def = mob_library_worker_table[mob_index]
local mob_type = minetest.registered_entities[mob_def.name].type local mob_type = minetest.registered_entities[mob_def.name].type
local spawn_in_group = minetest.registered_entities[mob_def.name].spawn_in_group local spawn_in_group = minetest.registered_entities[mob_def.name].spawn_in_group or 4
local mob_count_wide = count_mobs(pos,aoc_range,mob_type)
local mob_count = count_mobs(spawning_position,32,mob_type)
if mob_def if mob_def
and mob_count_wide < (mob_cap[mob_type] or 15)
and mob_count < 5
and spawning_position.y >= mob_def.min_height and spawning_position.y >= mob_def.min_height
and spawning_position.y <= mob_def.max_height and spawning_position.y <= mob_def.max_height
and mob_def.dimension == dimension and mob_def.dimension == dimension
@ -475,6 +525,7 @@ if mobs_spawn then
and (not is_farm_animal(mob_def.name) or is_grass) and (not is_farm_animal(mob_def.name) or is_grass)
and (mob_type ~= "npc" or has_bed) and (mob_type ~= "npc" or has_bed)
and (mob_def.type_of_spawning ~= "water" or is_water) and (mob_def.type_of_spawning ~= "water" or is_water)
and not is_bedrock
then then
if mob_def.type_of_spawning == "water" then if mob_def.type_of_spawning == "water" then
spawning_position = get_water_spawn(spawning_position) spawning_position = get_water_spawn(spawning_position)
@ -483,10 +534,13 @@ if mobs_spawn then
end end
end end
--everything is correct, spawn mob --everything is correct, spawn mob
local object = minetest.add_entity(spawning_position, mob_def.name) local object
if spawn_in_group then if spawn_in_group then
spawn_group(spawning_position,mob_def.name,{gotten_node},spawn_in_group) object = spawn_group(spawning_position,mob_def,{gotten_node},spawn_in_group,spawn_in_group_min)
else object = minetest.add_entity(spawning_position, mob_def.name)
end end
if object then if object then
return mob_def.on_spawn and mob_def.on_spawn(object, spawning_position) return mob_def.on_spawn and mob_def.on_spawn(object, spawning_position)
end end

View file

@ -7,6 +7,7 @@ mcl_mobs:register_mob("mobs_mc:bat", {
type = "animal", type = "animal",
spawn_class = "ambient", spawn_class = "ambient",
can_despawn = true, can_despawn = true,
spawn_in_group = 8,
passive = true, passive = true,
hp_min = 6, hp_min = 6,
hp_max = 6, hp_max = 6,

View file

@ -16,6 +16,8 @@ mcl_mobs:register_mob("mobs_mc:blaze", {
description = S("Blaze"), description = S("Blaze"),
type = "monster", type = "monster",
spawn_class = "hostile", spawn_class = "hostile",
spawn_in_group_min = 2,
spawn_in_group = 3,
hp_min = 20, hp_min = 20,
hp_max = 20, hp_max = 20,
xp_min = 10, xp_min = 10,

View file

@ -122,8 +122,6 @@ mcl_mobs:spawn_specific(
"ExtremeHills_beach", "ExtremeHills_beach",
"ExtremeHillsM", "ExtremeHillsM",
"ExtremeHills+", "ExtremeHills+",
"ExtremeHills+_snowtop",
"StoneBeach",
"Plains", "Plains",
"Plains_beach", "Plains_beach",
"SunflowerPlains", "SunflowerPlains",

View file

@ -40,7 +40,8 @@ local cod = {
xp_max = 3, xp_max = 3,
armor = 100, armor = 100,
rotate = 180, rotate = 180,
spawn_in_group = 10, spawn_in_group_min = 3,
spawn_in_group = 8,
tilt_swim = true, tilt_swim = true,
collisionbox = {-0.3, 0.0, -0.3, 0.3, 0.79, 0.3}, collisionbox = {-0.3, 0.0, -0.3, 0.3, 0.79, 0.3},
visual = "mesh", visual = "mesh",

View file

@ -83,6 +83,8 @@ mcl_mobs:register_mob("mobs_mc:cow", cow_def)
local mooshroom_def = table.copy(cow_def) local mooshroom_def = table.copy(cow_def)
mooshroom_def.description = S("Mooshroom") mooshroom_def.description = S("Mooshroom")
mooshroom_def.mesh = "mobs_mc_cow.b3d" mooshroom_def.mesh = "mobs_mc_cow.b3d"
mooshroom_def.spawn_in_group_min = 4
mooshroom_def.spawn_in_group = 8
mooshroom_def.textures = { {"mobs_mc_mooshroom.png", "mobs_mc_mushroom_red.png"}, {"mobs_mc_mooshroom_brown.png", "mobs_mc_mushroom_brown.png" } } mooshroom_def.textures = { {"mobs_mc_mooshroom.png", "mobs_mc_mushroom_red.png"}, {"mobs_mc_mooshroom_brown.png", "mobs_mc_mushroom_brown.png" } }
mooshroom_def.on_rightclick = function(self, clicker) mooshroom_def.on_rightclick = function(self, clicker)
if mcl_mobs:feed_tame(self, clicker, 1, true, true) then return end if mcl_mobs:feed_tame(self, clicker, 1, true, true) then return end
@ -151,17 +153,12 @@ mcl_mobs:spawn_specific(
"ground", "ground",
{ {
"flat", "flat",
"IcePlainsSpikes",
"ColdTaiga",
"ColdTaiga_beach",
"ColdTaiga_beach_water",
"MegaTaiga", "MegaTaiga",
"MegaSpruceTaiga", "MegaSpruceTaiga",
"ExtremeHills", "ExtremeHills",
"ExtremeHills_beach", "ExtremeHills_beach",
"ExtremeHillsM", "ExtremeHillsM",
"ExtremeHills+", "ExtremeHills+",
"ExtremeHills+_snowtop",
"StoneBeach", "StoneBeach",
"Plains", "Plains",
"Plains_beach", "Plains_beach",

View file

@ -274,7 +274,6 @@ mcl_mobs:spawn_specific(
"Plains", "Plains",
"Desert", "Desert",
"ColdTaiga", "ColdTaiga",
"MushroomIsland",
"IcePlainsSpikes", "IcePlainsSpikes",
"SunflowerPlains", "SunflowerPlains",
"IcePlains", "IcePlains",
@ -301,7 +300,6 @@ mcl_mobs:spawn_specific(
"ExtremeHills_beach", "ExtremeHills_beach",
"ColdTaiga_beach", "ColdTaiga_beach",
"Swampland_shore", "Swampland_shore",
"MushroomIslandShore",
"JungleM_shore", "JungleM_shore",
"Jungle_shore", "Jungle_shore",
"MesaPlateauFM_sandlevel", "MesaPlateauFM_sandlevel",
@ -340,7 +338,6 @@ mcl_mobs:spawn_specific(
"Forest_deep_ocean", "Forest_deep_ocean",
"JungleM_deep_ocean", "JungleM_deep_ocean",
"FlowerForest_deep_ocean", "FlowerForest_deep_ocean",
"MushroomIsland_ocean",
"MegaTaiga_ocean", "MegaTaiga_ocean",
"StoneBeach_deep_ocean", "StoneBeach_deep_ocean",
"IcePlainsSpikes_deep_ocean", "IcePlainsSpikes_deep_ocean",
@ -350,7 +347,6 @@ mcl_mobs:spawn_specific(
"MesaBryce_deep_ocean", "MesaBryce_deep_ocean",
"ExtremeHills+_deep_ocean", "ExtremeHills+_deep_ocean",
"ExtremeHills_ocean", "ExtremeHills_ocean",
"MushroomIsland_deep_ocean",
"Forest_ocean", "Forest_ocean",
"MegaTaiga_deep_ocean", "MegaTaiga_deep_ocean",
"JungleEdge_ocean", "JungleEdge_ocean",
@ -376,7 +372,6 @@ mcl_mobs:spawn_specific(
"RoofedForest_underground", "RoofedForest_underground",
"Jungle_underground", "Jungle_underground",
"Swampland_underground", "Swampland_underground",
"MushroomIsland_underground",
"BirchForest_underground", "BirchForest_underground",
"Plains_underground", "Plains_underground",
"MesaPlateauF_underground", "MesaPlateauF_underground",

View file

@ -30,7 +30,7 @@ local S = minetest.get_translator(minetest.get_current_modname())
--################### --###################
local dolphin = { local dolphin = {
type = "monster", type = "animal",
spawn_class = "water", spawn_class = "water",
can_despawn = true, can_despawn = true,
passive = true, passive = true,
@ -42,7 +42,8 @@ local dolphin = {
walk_chance = 100, walk_chance = 100,
breath_max = 120, breath_max = 120,
rotate = 180, rotate = 180,
spawn_in_group = 3, spawn_in_group_min = 3,
spawn_in_group = 5,
tilt_swim = true, tilt_swim = true,
collisionbox = {-0.3, 0.0, -0.3, 0.3, 0.79, 0.3}, collisionbox = {-0.3, 0.0, -0.3, 0.3, 0.79, 0.3},
visual = "mesh", visual = "mesh",
@ -136,7 +137,6 @@ mcl_mobs:spawn_specific(
"FlowerForest_beach", "FlowerForest_beach",
"Forest_beach", "Forest_beach",
"StoneBeach", "StoneBeach",
"ColdTaiga_beach_water",
"Taiga_beach", "Taiga_beach",
"Savanna_beach", "Savanna_beach",
"Plains_beach", "Plains_beach",

View file

@ -627,7 +627,6 @@ mcl_mobs:spawn_specific(
"Plains", "Plains",
"Desert", "Desert",
"ColdTaiga", "ColdTaiga",
"MushroomIsland",
"IcePlainsSpikes", "IcePlainsSpikes",
"SunflowerPlains", "SunflowerPlains",
"IcePlains", "IcePlains",
@ -654,7 +653,6 @@ mcl_mobs:spawn_specific(
"ExtremeHills_beach", "ExtremeHills_beach",
"ColdTaiga_beach", "ColdTaiga_beach",
"Swampland_shore", "Swampland_shore",
"MushroomIslandShore",
"JungleM_shore", "JungleM_shore",
"Jungle_shore", "Jungle_shore",
"MesaPlateauFM_sandlevel", "MesaPlateauFM_sandlevel",
@ -693,7 +691,6 @@ mcl_mobs:spawn_specific(
"Forest_deep_ocean", "Forest_deep_ocean",
"JungleM_deep_ocean", "JungleM_deep_ocean",
"FlowerForest_deep_ocean", "FlowerForest_deep_ocean",
"MushroomIsland_ocean",
"MegaTaiga_ocean", "MegaTaiga_ocean",
"StoneBeach_deep_ocean", "StoneBeach_deep_ocean",
"IcePlainsSpikes_deep_ocean", "IcePlainsSpikes_deep_ocean",
@ -703,7 +700,6 @@ mcl_mobs:spawn_specific(
"MesaBryce_deep_ocean", "MesaBryce_deep_ocean",
"ExtremeHills+_deep_ocean", "ExtremeHills+_deep_ocean",
"ExtremeHills_ocean", "ExtremeHills_ocean",
"MushroomIsland_deep_ocean",
"Forest_ocean", "Forest_ocean",
"MegaTaiga_deep_ocean", "MegaTaiga_deep_ocean",
"JungleEdge_ocean", "JungleEdge_ocean",
@ -729,7 +725,6 @@ mcl_mobs:spawn_specific(
"RoofedForest_underground", "RoofedForest_underground",
"Jungle_underground", "Jungle_underground",
"Swampland_underground", "Swampland_underground",
"MushroomIsland_underground",
"BirchForest_underground", "BirchForest_underground",
"Plains_underground", "Plains_underground",
"MesaPlateauF_underground", "MesaPlateauF_underground",
@ -767,10 +762,10 @@ mcl_mobs:spawn_specific(
"ground", "ground",
{ {
"Nether", "Nether",
"SoulsandValley", "SoulsandVall3ey",
}, },
0, 0,
minetest.LIGHT_MAX+1, 11,
30, 30,
27500, 27500,
4, 4,
@ -786,7 +781,7 @@ mcl_mobs:spawn_specific(
"WarpedForest" "WarpedForest"
}, },
0, 0,
minetest.LIGHT_MAX+1, 11,
30, 30,
5000, 5000,
4, 4,

View file

@ -23,6 +23,7 @@ mcl_mobs:register_mob("mobs_mc:ghast", {
collisionbox = {-2, 5, -2, 2, 9, 2}, collisionbox = {-2, 5, -2, 2, 9, 2},
visual = "mesh", visual = "mesh",
mesh = "mobs_mc_ghast.b3d", mesh = "mobs_mc_ghast.b3d",
spawn_in_group = 1,
textures = { textures = {
{"mobs_mc_ghast.png"}, {"mobs_mc_ghast.png"},
}, },

View file

@ -8,12 +8,14 @@ mcl_mobs:register_mob("mobs_mc:guardian", {
description = S("Guardian"), description = S("Guardian"),
type = "monster", type = "monster",
spawn_class = "hostile", spawn_class = "hostile",
spawn_in_group_min = 2,
spawn_in_group = 4,
hp_min = 30, hp_min = 30,
hp_max = 30, hp_max = 30,
xp_min = 10, xp_min = 10,
xp_max = 10, xp_max = 10,
breath_max = -1, breath_max = -1,
passive = false, passive = false,
attack_type = "dogfight", attack_type = "dogfight",
pathfinding = 1, pathfinding = 1,
view_range = 16, view_range = 16,

View file

@ -100,6 +100,8 @@ local horse = {
description = S("Horse"), description = S("Horse"),
type = "animal", type = "animal",
spawn_class = "passive", spawn_class = "passive",
spawn_in_group_min = 2,
spawn_in_group = 6,
visual = "mesh", visual = "mesh",
mesh = "mobs_mc_horse.b3d", mesh = "mobs_mc_horse.b3d",
visual_size = {x=3.0, y=3.0}, visual_size = {x=3.0, y=3.0},
@ -490,6 +492,8 @@ local d = 0.86 -- donkey scale
local donkey = table.copy(horse) local donkey = table.copy(horse)
donkey.description = S("Donkey") donkey.description = S("Donkey")
donkey.textures = {{"blank.png", "mobs_mc_donkey.png", "blank.png"}} donkey.textures = {{"blank.png", "mobs_mc_donkey.png", "blank.png"}}
donkey.spawn_in_group = 3
donkey.spawn_in_group_min = 1
donkey.animation = { donkey.animation = {
speed_normal = 25, speed_normal = 25,
stand_start = 0, stand_end = 0, stand_start = 0, stand_end = 0,
@ -574,7 +578,7 @@ mcl_mobs:spawn_specific(
"Savanna_beach", "Savanna_beach",
"Plains_beach", "Plains_beach",
}, },
0, 9,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
15000, 15000,

View file

@ -28,6 +28,8 @@ mcl_mobs:register_mob("mobs_mc:llama", {
description = S("Llama"), description = S("Llama"),
type = "animal", type = "animal",
spawn_class = "passive", spawn_class = "passive",
spawn_in_group_min = 4,
spawn_in_group = 6,
hp_min = 15, hp_min = 15,
hp_max = 30, hp_max = 30,
xp_min = 1, xp_min = 1,
@ -217,18 +219,16 @@ mcl_mobs:spawn_specific(
"overworld", "overworld",
"ground", "ground",
{ {
"Mesa", "Savanna",
"MesaPlateauFM_grasstop", "SavannaM",
"MesaPlateauF", "SavannaM_beach",
"MesaPlateauFM", "Savanna_beach",
"MesaPlateauF_grasstop", "Savanna_ocean",
"MesaBryce",
"Jungle",
"Jungle_shore",
"JungleM",
"JungleM_shore",
"JungleEdge", "JungleEdge",
"JungleEdgeM", "JungleEdgeM",
"ExtremeHills",
"ExtremeHills_beach",
"ExtremeHillsM",
}, },
0, 0,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,

View file

@ -30,6 +30,8 @@ local ocelot = {
type = "animal", type = "animal",
spawn_class = "passive", spawn_class = "passive",
can_despawn = true, can_despawn = true,
spawn_in_group = 3,
spawn_in_group_min = 1,
hp_min = 10, hp_min = 10,
hp_max = 10, hp_max = 10,
xp_min = 1, xp_min = 1,

View file

@ -194,17 +194,12 @@ mcl_mobs:spawn_specific(
"ground", "ground",
{ {
"flat", "flat",
"IcePlainsSpikes",
"ColdTaiga",
"ColdTaiga_beach",
"ColdTaiga_beach_water",
"MegaTaiga", "MegaTaiga",
"MegaSpruceTaiga", "MegaSpruceTaiga",
"ExtremeHills", "ExtremeHills",
"ExtremeHills_beach", "ExtremeHills_beach",
"ExtremeHillsM", "ExtremeHillsM",
"ExtremeHills+", "ExtremeHills+",
"ExtremeHills+_snowtop",
"StoneBeach", "StoneBeach",
"Plains", "Plains",
"Plains_beach", "Plains_beach",

View file

@ -6,9 +6,10 @@ local rabbit = {
description = S("Rabbit"), description = S("Rabbit"),
type = "animal", type = "animal",
spawn_class = "passive", spawn_class = "passive",
spawn_in_group_min = 2,
spawn_in_group = 3,
passive = true, passive = true,
reach = 1, reach = 1,
hp_min = 3, hp_min = 3,
hp_max = 3, hp_max = 3,
xp_min = 1, xp_min = 1,

View file

@ -346,7 +346,7 @@ mcl_mobs:spawn_specific(
"Swampland", "Swampland",
"Swampland_shore" "Swampland_shore"
}, },
0, 9,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,
30, 30,
15000, 15000,

View file

@ -162,7 +162,6 @@ mcl_mobs:spawn_specific(
"Plains", "Plains",
"Desert", "Desert",
"ColdTaiga", "ColdTaiga",
"MushroomIsland",
"IcePlainsSpikes", "IcePlainsSpikes",
"SunflowerPlains", "SunflowerPlains",
"IcePlains", "IcePlains",
@ -189,7 +188,6 @@ mcl_mobs:spawn_specific(
"ExtremeHills_beach", "ExtremeHills_beach",
"ColdTaiga_beach", "ColdTaiga_beach",
"Swampland_shore", "Swampland_shore",
"MushroomIslandShore",
"JungleM_shore", "JungleM_shore",
"Jungle_shore", "Jungle_shore",
"MesaPlateauFM_sandlevel", "MesaPlateauFM_sandlevel",
@ -228,7 +226,6 @@ mcl_mobs:spawn_specific(
"Forest_deep_ocean", "Forest_deep_ocean",
"JungleM_deep_ocean", "JungleM_deep_ocean",
"FlowerForest_deep_ocean", "FlowerForest_deep_ocean",
"MushroomIsland_ocean",
"MegaTaiga_ocean", "MegaTaiga_ocean",
"StoneBeach_deep_ocean", "StoneBeach_deep_ocean",
"IcePlainsSpikes_deep_ocean", "IcePlainsSpikes_deep_ocean",
@ -238,7 +235,6 @@ mcl_mobs:spawn_specific(
"MesaBryce_deep_ocean", "MesaBryce_deep_ocean",
"ExtremeHills+_deep_ocean", "ExtremeHills+_deep_ocean",
"ExtremeHills_ocean", "ExtremeHills_ocean",
"MushroomIsland_deep_ocean",
"Forest_ocean", "Forest_ocean",
"MegaTaiga_deep_ocean", "MegaTaiga_deep_ocean",
"JungleEdge_ocean", "JungleEdge_ocean",
@ -264,7 +260,6 @@ mcl_mobs:spawn_specific(
"RoofedForest_underground", "RoofedForest_underground",
"Jungle_underground", "Jungle_underground",
"Swampland_underground", "Swampland_underground",
"MushroomIsland_underground",
"BirchForest_underground", "BirchForest_underground",
"Plains_underground", "Plains_underground",
"MesaPlateauF_underground", "MesaPlateauF_underground",

View file

@ -101,7 +101,8 @@ mcl_mobs:spawn_specific(
"nether", "nether",
"ground", "ground",
{ {
"Nether" "Nether",
"SoulsandValley",
}, },
0, 0,
7, 7,

View file

@ -446,11 +446,6 @@ minetest.LIGHT_MAX+1,
mmin, mmin,
mmax) mmax)
--mcl_mobs:spawn_specific("mobs_mc:magma_cube_tiny", { "mcl_nether:nether_brick", "mcl_nether:netherrack" }, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 11000, 4, mmin, mmax)
--mcl_mobs:spawn_specific("mobs_mc:magma_cube_small", { "mcl_nether:nether_brick", "mcl_nether:netherrack" }, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 11100, 4, mmin, mmax)
--mcl_mobs:spawn_specific("mobs_mc:magma_cube_big", { "mcl_nether:nether_brick", "mcl_nether:netherrack" }, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 11200, 4, mmin, mmax)
-- spawn eggs -- spawn eggs
mcl_mobs:register_egg("mobs_mc:magma_cube_big", S("Magma Cube"), "mobs_mc_spawn_icon_magmacube.png") mcl_mobs:register_egg("mobs_mc:magma_cube_big", S("Magma Cube"), "mobs_mc_spawn_icon_magmacube.png")
mcl_mobs:register_egg("mobs_mc:slime_big", S("Slime"), "mobs_mc_spawn_icon_slime.png") mcl_mobs:register_egg("mobs_mc:slime_big", S("Slime"), "mobs_mc_spawn_icon_slime.png")

View file

@ -109,7 +109,6 @@ mcl_mobs:spawn_specific(
"Plains", "Plains",
"Desert", "Desert",
"ColdTaiga", "ColdTaiga",
"MushroomIsland",
"IcePlainsSpikes", "IcePlainsSpikes",
"SunflowerPlains", "SunflowerPlains",
"IcePlains", "IcePlains",
@ -136,7 +135,6 @@ mcl_mobs:spawn_specific(
"ExtremeHills_beach", "ExtremeHills_beach",
"ColdTaiga_beach", "ColdTaiga_beach",
"Swampland_shore", "Swampland_shore",
"MushroomIslandShore",
"JungleM_shore", "JungleM_shore",
"Jungle_shore", "Jungle_shore",
"MesaPlateauFM_sandlevel", "MesaPlateauFM_sandlevel",
@ -175,7 +173,6 @@ mcl_mobs:spawn_specific(
"Forest_deep_ocean", "Forest_deep_ocean",
"JungleM_deep_ocean", "JungleM_deep_ocean",
"FlowerForest_deep_ocean", "FlowerForest_deep_ocean",
"MushroomIsland_ocean",
"MegaTaiga_ocean", "MegaTaiga_ocean",
"StoneBeach_deep_ocean", "StoneBeach_deep_ocean",
"IcePlainsSpikes_deep_ocean", "IcePlainsSpikes_deep_ocean",
@ -185,7 +182,6 @@ mcl_mobs:spawn_specific(
"MesaBryce_deep_ocean", "MesaBryce_deep_ocean",
"ExtremeHills+_deep_ocean", "ExtremeHills+_deep_ocean",
"ExtremeHills_ocean", "ExtremeHills_ocean",
"MushroomIsland_deep_ocean",
"Forest_ocean", "Forest_ocean",
"MegaTaiga_deep_ocean", "MegaTaiga_deep_ocean",
"JungleEdge_ocean", "JungleEdge_ocean",
@ -211,7 +207,6 @@ mcl_mobs:spawn_specific(
"RoofedForest_underground", "RoofedForest_underground",
"Jungle_underground", "Jungle_underground",
"Swampland_underground", "Swampland_underground",
"MushroomIsland_underground",
"BirchForest_underground", "BirchForest_underground",
"Plains_underground", "Plains_underground",
"MesaPlateauF_underground", "MesaPlateauF_underground",

View file

@ -29,6 +29,7 @@ mcl_mobs:register_mob("mobs_mc:villager_zombie", {
description = S("Zombie Villager"), description = S("Zombie Villager"),
type = "monster", type = "monster",
spawn_class = "hostile", spawn_class = "hostile",
spawn_in_group = 1,
hp_min = 20, hp_min = 20,
hp_max = 20, hp_max = 20,
xp_min = 5, xp_min = 5,
@ -147,7 +148,6 @@ mcl_mobs:spawn_specific(
"RoofedForest_underground", "RoofedForest_underground",
"Jungle_underground", "Jungle_underground",
"Swampland_underground", "Swampland_underground",
"MushroomIsland_underground",
"BirchForest_underground", "BirchForest_underground",
"Plains_underground", "Plains_underground",
"MesaPlateauF_underground", "MesaPlateauF_underground",
@ -184,7 +184,6 @@ mcl_mobs:spawn_specific(
"Plains", "Plains",
"Desert", "Desert",
"ColdTaiga", "ColdTaiga",
"MushroomIsland",
"IcePlainsSpikes", "IcePlainsSpikes",
"SunflowerPlains", "SunflowerPlains",
"IcePlains", "IcePlains",
@ -211,7 +210,6 @@ mcl_mobs:spawn_specific(
"ExtremeHills_beach", "ExtremeHills_beach",
"ColdTaiga_beach", "ColdTaiga_beach",
"Swampland_shore", "Swampland_shore",
"MushroomIslandShore",
"JungleM_shore", "JungleM_shore",
"Jungle_shore", "Jungle_shore",
"MesaPlateauFM_sandlevel", "MesaPlateauFM_sandlevel",

View file

@ -18,6 +18,7 @@ local wolf = {
xp_max = 3, xp_max = 3,
passive = false, passive = false,
group_attack = true, group_attack = true,
spawn_in_group = 8,
collisionbox = {-0.3, -0.01, -0.3, 0.3, 0.84, 0.3}, collisionbox = {-0.3, -0.01, -0.3, 0.3, 0.84, 0.3},
visual = "mesh", visual = "mesh",
mesh = "mobs_mc_wolf.b3d", mesh = "mobs_mc_wolf.b3d",

View file

@ -162,7 +162,6 @@ mcl_mobs:spawn_specific(
"RoofedForest_underground", "RoofedForest_underground",
"Jungle_underground", "Jungle_underground",
"Swampland_underground", "Swampland_underground",
"MushroomIsland_underground",
"BirchForest_underground", "BirchForest_underground",
"Plains_underground", "Plains_underground",
"MesaPlateauF_underground", "MesaPlateauF_underground",
@ -198,7 +197,6 @@ mcl_mobs:spawn_specific(
"Forest", "Forest",
"Plains", "Plains",
"ColdTaiga", "ColdTaiga",
"MushroomIsland",
"IcePlainsSpikes", "IcePlainsSpikes",
"SunflowerPlains", "SunflowerPlains",
"IcePlains", "IcePlains",
@ -225,7 +223,6 @@ mcl_mobs:spawn_specific(
"ExtremeHills_beach", "ExtremeHills_beach",
"ColdTaiga_beach", "ColdTaiga_beach",
"Swampland_shore", "Swampland_shore",
"MushroomIslandShore",
"JungleM_shore", "JungleM_shore",
"Jungle_shore", "Jungle_shore",
"MesaPlateauFM_sandlevel", "MesaPlateauFM_sandlevel",
@ -254,7 +251,6 @@ mcl_mobs:spawn_specific(
"RoofedForest_underground", "RoofedForest_underground",
"Jungle_underground", "Jungle_underground",
"Swampland_underground", "Swampland_underground",
"MushroomIsland_underground",
"BirchForest_underground", "BirchForest_underground",
"Plains_underground", "Plains_underground",
"MesaPlateauF_underground", "MesaPlateauF_underground",
@ -290,7 +286,6 @@ mcl_mobs:spawn_specific(
"Forest", "Forest",
"Plains", "Plains",
"ColdTaiga", "ColdTaiga",
"MushroomIsland",
"IcePlainsSpikes", "IcePlainsSpikes",
"SunflowerPlains", "SunflowerPlains",
"IcePlains", "IcePlains",
@ -317,7 +312,6 @@ mcl_mobs:spawn_specific(
"ExtremeHills_beach", "ExtremeHills_beach",
"ColdTaiga_beach", "ColdTaiga_beach",
"Swampland_shore", "Swampland_shore",
"MushroomIslandShore",
"JungleM_shore", "JungleM_shore",
"Jungle_shore", "Jungle_shore",
"MesaPlateauFM_sandlevel", "MesaPlateauFM_sandlevel",

View file

@ -134,7 +134,8 @@ mcl_mobs:spawn_specific(
"nether", "nether",
"ground", "ground",
{ {
"Nether" "Nether",
"CrimsonForest",
}, },
0, 0,
minetest.LIGHT_MAX+1, minetest.LIGHT_MAX+1,