Change several places where mobs are created to use mcl_mobs.spawn() instead of minetest.add_entity()

This commit is contained in:
teknomunk 2024-09-13 21:31:04 -05:00
parent 31a3788ce1
commit 626bdd13d8
6 changed files with 50 additions and 43 deletions

View File

@ -105,7 +105,7 @@ end
-- Spawn a child -- Spawn a child
function mcl_mobs.spawn_child(pos, mob_type) function mcl_mobs.spawn_child(pos, mob_type)
local child = minetest.add_entity(pos, mob_type) local child = mcl_mobs.spawn(pos, mob_type)
if not child then if not child then
return return
end end
@ -285,6 +285,7 @@ function mob_class:check_breeding()
end end
local child = mcl_mobs.spawn_child(pos, parent1.name) local child = mcl_mobs.spawn_child(pos, parent1.name)
if not child then return end
local ent_c = child:get_luaentity() local ent_c = child:get_luaentity()

View File

@ -528,7 +528,7 @@ end
-- Note: This also introduces the “spawn_egg” group: -- Note: This also introduces the “spawn_egg” group:
-- * spawn_egg=1: Spawn egg (generic mob, no metadata) -- * spawn_egg=1: Spawn egg (generic mob, no metadata)
-- * spawn_egg=2: Spawn egg (captured/tamed mob, metadata) -- * spawn_egg=2: Spawn egg (captured/tamed mob, metadata)
function mcl_mobs.register_egg(mob, desc, background_color, overlay_color, addegg, no_creative) function mcl_mobs.register_egg(mob_id, desc, background_color, overlay_color, addegg, no_creative)
local grp = {spawn_egg = 1} local grp = {spawn_egg = 1}
@ -539,7 +539,7 @@ function mcl_mobs.register_egg(mob, desc, background_color, overlay_color, addeg
local invimg = "(spawn_egg.png^[multiply:" .. background_color ..")^(spawn_egg_overlay.png^[multiply:" .. overlay_color .. ")" local invimg = "(spawn_egg.png^[multiply:" .. background_color ..")^(spawn_egg_overlay.png^[multiply:" .. overlay_color .. ")"
if old_spawn_icons then if old_spawn_icons then
local mobname = mob:gsub("mobs_mc:","") local mobname = mob_id:gsub("mobs_mc:","")
local fn = "mobs_mc_spawn_icon_"..mobname..".png" local fn = "mobs_mc_spawn_icon_"..mobname..".png"
if mcl_util.file_exists(minetest.get_modpath("mobs_mc").."/textures/"..fn) then if mcl_util.file_exists(minetest.get_modpath("mobs_mc").."/textures/"..fn) then
invimg = fn invimg = fn
@ -551,7 +551,7 @@ function mcl_mobs.register_egg(mob, desc, background_color, overlay_color, addeg
end end
-- register old stackable mob egg -- register old stackable mob egg
minetest.register_craftitem(mob, { minetest.register_craftitem(mob_id, {
description = desc, description = desc,
inventory_image = invimg, inventory_image = invimg,
@ -561,7 +561,6 @@ function mcl_mobs.register_egg(mob, desc, background_color, overlay_color, addeg
_doc_items_usagehelp = S("Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns."), _doc_items_usagehelp = S("Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns."),
on_place = function(itemstack, placer, pointed_thing) on_place = function(itemstack, placer, pointed_thing)
local pos = pointed_thing.above local pos = pointed_thing.above
-- am I clicking on something with existing on_rightclick function? -- am I clicking on something with existing on_rightclick function?
@ -571,11 +570,12 @@ function mcl_mobs.register_egg(mob, desc, background_color, overlay_color, addeg
return def.on_rightclick(pointed_thing.under, under, placer, itemstack) return def.on_rightclick(pointed_thing.under, under, placer, itemstack)
end end
local mob_name = itemstack:get_name()
if pos and within_limits(pos, 0) and not minetest.is_protected(pos, placer:get_player_name()) then if pos and within_limits(pos, 0) and not minetest.is_protected(pos, placer:get_player_name()) then
local name = placer:get_player_name() local name = placer:get_player_name()
local privs = minetest.get_player_privs(name) local privs = minetest.get_player_privs(name)
if under.name == "mcl_mobspawners:spawner" then if under.name == "mcl_mobspawners:spawner" then
if minetest.is_protected(pointed_thing.under, name) then if minetest.is_protected(pointed_thing.under, name) then
minetest.record_protection_violation(pointed_thing.under, name) minetest.record_protection_violation(pointed_thing.under, name)
@ -593,7 +593,6 @@ function mcl_mobs.register_egg(mob, desc, background_color, overlay_color, addeg
--minetest.log("max light: " .. mob_light_lvl[2]) --minetest.log("max light: " .. mob_light_lvl[2])
-- Handle egg conversion -- Handle egg conversion
local mob_name = itemstack:get_name()
local convert_to = (minetest.registered_entities[mob_name] or {})._convert_to local convert_to = (minetest.registered_entities[mob_name] or {})._convert_to
if convert_to then mob_name = convert_to end if convert_to then mob_name = convert_to end
@ -604,19 +603,24 @@ function mcl_mobs.register_egg(mob, desc, background_color, overlay_color, addeg
return itemstack return itemstack
end end
if not minetest.registered_entities[mob] then if not minetest.registered_entities[mob_name] then
return itemstack return itemstack
end end
if minetest.settings:get_bool("only_peaceful_mobs", false) if minetest.settings:get_bool("only_peaceful_mobs", false)
and minetest.registered_entities[mob].type == "monster" then and minetest.registered_entities[mob_name].type == "monster" then
minetest.chat_send_player(name, S("Only peaceful mobs allowed!")) minetest.chat_send_player(name, S("Only peaceful mobs allowed!"))
return itemstack return itemstack
end end
pos.y = pos.y - 0.5 pos.y = pos.y - 1
local mob = mcl_mobs.spawn(pos, mob_name)
if not object then
pos.y = pos.y + 1
mob = mcl_mobs.spawn(pos, mob_name)
if not mob then return end
end
local mob = minetest.add_entity(pos, mob)
local entityname = itemstack:get_name() local entityname = itemstack:get_name()
minetest.log("action", "Player " ..name.." spawned "..entityname.." at "..minetest.pos_to_string(pos)) minetest.log("action", "Player " ..name.." spawned "..entityname.." at "..minetest.pos_to_string(pos))
local ent = mob:get_luaentity() local ent = mob:get_luaentity()
@ -647,5 +651,4 @@ function mcl_mobs.register_egg(mob, desc, background_color, overlay_color, addeg
return itemstack return itemstack
end, end,
}) })
end end

View File

@ -1,4 +1,5 @@
--lua locals --lua locals
local DEBUG = false
local math, vector, minetest, mcl_mobs = math, vector, minetest, mcl_mobs local math, vector, minetest, mcl_mobs = math, vector, minetest, mcl_mobs
local mob_class = mcl_mobs.mob_class local mob_class = mcl_mobs.mob_class
@ -547,7 +548,7 @@ local function has_room(self, pos)
local cb_height = cb[5] - cb[2] local cb_height = cb[5] - cb[2]
local p1 = vector.new( local p1 = vector.new(
math.round(pos.x + cb[1]), math.round(pos.x + cb[1]),
pos.y, math.floor(pos.y),
math.round(pos.z + cb[3])) math.round(pos.z + cb[3]))
local p2 = vector.new( local p2 = vector.new(
math.round(pos.x + cb[4]), math.round(pos.x + cb[4]),
@ -560,20 +561,20 @@ local function has_room(self, pos)
local dz = p2.z - p1.z + 1 local dz = p2.z - p1.z + 1
local found_nodes = minetest.find_nodes_in_area(p1,p2,nodes) or 0 local found_nodes = minetest.find_nodes_in_area(p1,p2,nodes) or 0
local n = #found_nodes local n = #found_nodes
--[[ if DEBUG then
minetest.log(dump({ minetest.log(dump({
cb = cb, cb = cb,
pos = pos, pos = pos,
n = n, n = n,
dx = dx, dx = dx,
dy = dy, dy = dy,
dz = dz, dz = dz,
p1 = p1, p1 = p1,
p2 = p2, p2 = p2,
found_nodes = found_nodes, found_nodes = found_nodes,
nodes = nodes, nodes = nodes,
})) }))
]] end
if n == dx * dy * dz then if n == dx * dy * dz then
return true return true
end end
@ -623,7 +624,6 @@ local function has_room(self, pos)
if top_layer_height + dy - 1 >= cb_height then return true end if top_layer_height + dy - 1 >= cb_height then return true end
-- We don't have room -- We don't have room
mcl_log("No room for mob "..self.name.." at "..minetest.pos_to_string(vector.round(pos)))
return false return false
end end

View File

@ -53,12 +53,14 @@ local spawn_children_on_die = function(child_mob, spawn_distance, eject_speed)
eject_speed = eject_speed * 0.5 eject_speed = eject_speed * 0.5
end end
end end
local mob = minetest.add_entity(newpos, child_mob) local mob = mcl_mobs.spawn(newpos, child_mob)
if not mother_stuck then if mob then
mob:set_velocity(dir * eject_speed) if not mother_stuck then
mob:set_velocity(dir * eject_speed)
end
mob:set_yaw(angle - math.pi/2)
table.insert(children, mob)
end end
mob:set_yaw(angle - math.pi/2)
table.insert(children, mob)
angle = angle + (math.pi*2) / spawn_count angle = angle + (math.pi*2) / spawn_count
end end
-- If mother was murdered, children attack the killer after 1 second -- If mother was murdered, children attack the killer after 1 second

View File

@ -55,14 +55,16 @@ mcl_mobs.register_mob("mobs_mc:evoker", {
basepos.y = basepos.y + 1 basepos.y = basepos.y + 1
for i=1, r do for i=1, r do
local spawnpos = vector.add(basepos, minetest.yaw_to_dir(pr:next(0,360))) local spawnpos = vector.add(basepos, minetest.yaw_to_dir(pr:next(0,360)))
local vex = minetest.add_entity(spawnpos, "mobs_mc:vex") local vex = mcl_mobs.spawn(spawnpos, "mobs_mc:vex")
local ent = vex:get_luaentity() if vex then
local ent = vex:get_luaentity()
-- Mark vexes as summoned and start their life clock (they take damage it reaches 0) -- Mark vexes as summoned and start their life clock (they take damage it reaches 0)
ent._summoned = true ent._summoned = true
ent._lifetimer = pr:next(33, 108) ent._lifetimer = pr:next(33, 108)
table.insert(spawned_vexes[self],ent) table.insert(spawned_vexes[self],ent)
end
end end
end, end,
passive = false, passive = false,

View File

@ -19,7 +19,6 @@ local set_node = minetest.set_node
local sound_play = minetest.sound_play local sound_play = minetest.sound_play
local add_particlespawner = minetest.add_particlespawner local add_particlespawner = minetest.add_particlespawner
local after = minetest.after local after = minetest.after
local add_entity = minetest.add_entity
local get_objects_inside_radius = minetest.get_objects_inside_radius local get_objects_inside_radius = minetest.get_objects_inside_radius
local get_item_group = minetest.get_item_group local get_item_group = minetest.get_item_group
@ -165,7 +164,7 @@ function lightning.strike_func(pos, pos2, objects)
-- Events caused by the lightning strike: Fire, damage, mob transformations, rare skeleton spawn -- Events caused by the lightning strike: Fire, damage, mob transformations, rare skeleton spawn
pos2.y = pos2.y + 1/2 pos2.y = pos2.y + 1
local skeleton_lightning = false local skeleton_lightning = false
if rng:next(1,100) <= 3 then if rng:next(1,100) <= 3 then
skeleton_lightning = true skeleton_lightning = true
@ -174,14 +173,14 @@ function lightning.strike_func(pos, pos2, objects)
if get_node(pos2).name == "air" then if get_node(pos2).name == "air" then
-- Low chance for a lightning to spawn skeleton horse + skeletons -- Low chance for a lightning to spawn skeleton horse + skeletons
if skeleton_lightning then if skeleton_lightning then
add_entity(pos2, "mobs_mc:skeleton_horse") mcl_mobs.spawn(pos2, "mobs_mc:skeleton_horse")
local angle, posadd local angle, posadd
angle = math.random() * math.pi * 2 angle = math.random() * math.pi * 2
for i=1,3 do for i=1,3 do
posadd = { x=math.cos(angle),y=0,z=math.sin(angle) } posadd = { x=math.cos(angle),y=0,z=math.sin(angle) }
posadd = vector.normalize(posadd) posadd = vector.normalize(posadd)
local mob = add_entity(vector.add(pos2, posadd), "mobs_mc:skeleton") local mob = mcl_mobs.spawn(vector.add(pos2, posadd), "mobs_mc:skeleton")
if mob then if mob then
mob:set_yaw(angle-math.pi/2) mob:set_yaw(angle-math.pi/2)
end end