mirror of
https://git.minetest.land/VoxeLibre/VoxeLibre.git
synced 2024-11-25 20:11:06 +01:00
Change several places where mobs are created to use mcl_mobs.spawn() instead of minetest.add_entity()
This commit is contained in:
parent
31a3788ce1
commit
626bdd13d8
6 changed files with 50 additions and 43 deletions
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue