From 626bdd13d8538e13dd7093cc61460a8062b6b9ef Mon Sep 17 00:00:00 2001 From: teknomunk Date: Fri, 13 Sep 2024 21:31:04 -0500 Subject: [PATCH] Change several places where mobs are created to use mcl_mobs.spawn() instead of minetest.add_entity() --- mods/ENTITIES/mcl_mobs/breeding.lua | 3 +- mods/ENTITIES/mcl_mobs/init.lua | 25 +++++++++-------- mods/ENTITIES/mcl_mobs/spawning.lua | 32 +++++++++++----------- mods/ENTITIES/mobs_mc/slime+magma_cube.lua | 12 ++++---- mods/ENTITIES/mobs_mc/villager_evoker.lua | 14 ++++++---- mods/ENVIRONMENT/lightning/init.lua | 7 ++--- 6 files changed, 50 insertions(+), 43 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/breeding.lua b/mods/ENTITIES/mcl_mobs/breeding.lua index 90e625db8..559195681 100644 --- a/mods/ENTITIES/mcl_mobs/breeding.lua +++ b/mods/ENTITIES/mcl_mobs/breeding.lua @@ -105,7 +105,7 @@ end -- Spawn a child 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 return end @@ -285,6 +285,7 @@ function mob_class:check_breeding() end local child = mcl_mobs.spawn_child(pos, parent1.name) + if not child then return end local ent_c = child:get_luaentity() diff --git a/mods/ENTITIES/mcl_mobs/init.lua b/mods/ENTITIES/mcl_mobs/init.lua index 81b5fdfe7..74e6edbec 100644 --- a/mods/ENTITIES/mcl_mobs/init.lua +++ b/mods/ENTITIES/mcl_mobs/init.lua @@ -528,7 +528,7 @@ end -- Note: This also introduces the “spawn_egg” group: -- * spawn_egg=1: Spawn egg (generic mob, no 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} @@ -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 .. ")" 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" if mcl_util.file_exists(minetest.get_modpath("mobs_mc").."/textures/"..fn) then invimg = fn @@ -551,7 +551,7 @@ function mcl_mobs.register_egg(mob, desc, background_color, overlay_color, addeg end -- register old stackable mob egg - minetest.register_craftitem(mob, { + minetest.register_craftitem(mob_id, { description = desc, 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."), on_place = function(itemstack, placer, pointed_thing) - local pos = pointed_thing.above -- 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) 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 local name = placer:get_player_name() local privs = minetest.get_player_privs(name) - if under.name == "mcl_mobspawners:spawner" then if minetest.is_protected(pointed_thing.under, name) then 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]) -- Handle egg conversion - local mob_name = itemstack:get_name() local convert_to = (minetest.registered_entities[mob_name] or {})._convert_to 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 end - if not minetest.registered_entities[mob] then + if not minetest.registered_entities[mob_name] then return itemstack end 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!")) return itemstack 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() minetest.log("action", "Player " ..name.." spawned "..entityname.." at "..minetest.pos_to_string(pos)) local ent = mob:get_luaentity() @@ -647,5 +651,4 @@ function mcl_mobs.register_egg(mob, desc, background_color, overlay_color, addeg return itemstack end, }) - end diff --git a/mods/ENTITIES/mcl_mobs/spawning.lua b/mods/ENTITIES/mcl_mobs/spawning.lua index d5ebe8788..332603392 100644 --- a/mods/ENTITIES/mcl_mobs/spawning.lua +++ b/mods/ENTITIES/mcl_mobs/spawning.lua @@ -1,4 +1,5 @@ --lua locals +local DEBUG = false local math, vector, minetest, mcl_mobs = math, vector, minetest, mcl_mobs 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 p1 = vector.new( math.round(pos.x + cb[1]), - pos.y, + math.floor(pos.y), math.round(pos.z + cb[3])) local p2 = vector.new( math.round(pos.x + cb[4]), @@ -560,20 +561,20 @@ local function has_room(self, pos) local dz = p2.z - p1.z + 1 local found_nodes = minetest.find_nodes_in_area(p1,p2,nodes) or 0 local n = #found_nodes - --[[ - minetest.log(dump({ - cb = cb, - pos = pos, - n = n, - dx = dx, - dy = dy, - dz = dz, - p1 = p1, - p2 = p2, - found_nodes = found_nodes, - nodes = nodes, - })) - ]] + if DEBUG then + minetest.log(dump({ + cb = cb, + pos = pos, + n = n, + dx = dx, + dy = dy, + dz = dz, + p1 = p1, + p2 = p2, + found_nodes = found_nodes, + nodes = nodes, + })) + end if n == dx * dy * dz then return true end @@ -623,7 +624,6 @@ local function has_room(self, pos) if top_layer_height + dy - 1 >= cb_height then return true end -- We don't have room - mcl_log("No room for mob "..self.name.." at "..minetest.pos_to_string(vector.round(pos))) return false end diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index fa9d24d09..57eb5a859 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -53,12 +53,14 @@ local spawn_children_on_die = function(child_mob, spawn_distance, eject_speed) eject_speed = eject_speed * 0.5 end end - local mob = minetest.add_entity(newpos, child_mob) - if not mother_stuck then - mob:set_velocity(dir * eject_speed) + local mob = mcl_mobs.spawn(newpos, child_mob) + if mob then + if not mother_stuck then + mob:set_velocity(dir * eject_speed) + end + mob:set_yaw(angle - math.pi/2) + table.insert(children, mob) end - mob:set_yaw(angle - math.pi/2) - table.insert(children, mob) angle = angle + (math.pi*2) / spawn_count end -- If mother was murdered, children attack the killer after 1 second diff --git a/mods/ENTITIES/mobs_mc/villager_evoker.lua b/mods/ENTITIES/mobs_mc/villager_evoker.lua index 9d465c25d..2dc175341 100644 --- a/mods/ENTITIES/mobs_mc/villager_evoker.lua +++ b/mods/ENTITIES/mobs_mc/villager_evoker.lua @@ -55,14 +55,16 @@ mcl_mobs.register_mob("mobs_mc:evoker", { basepos.y = basepos.y + 1 for i=1, r do local spawnpos = vector.add(basepos, minetest.yaw_to_dir(pr:next(0,360))) - local vex = minetest.add_entity(spawnpos, "mobs_mc:vex") - local ent = vex:get_luaentity() + local vex = mcl_mobs.spawn(spawnpos, "mobs_mc:vex") + if vex then + local ent = vex:get_luaentity() - -- Mark vexes as summoned and start their life clock (they take damage it reaches 0) - ent._summoned = true - ent._lifetimer = pr:next(33, 108) + -- Mark vexes as summoned and start their life clock (they take damage it reaches 0) + ent._summoned = true + ent._lifetimer = pr:next(33, 108) - table.insert(spawned_vexes[self],ent) + table.insert(spawned_vexes[self],ent) + end end end, passive = false, diff --git a/mods/ENVIRONMENT/lightning/init.lua b/mods/ENVIRONMENT/lightning/init.lua index 079c9cb38..d4756bd9f 100644 --- a/mods/ENVIRONMENT/lightning/init.lua +++ b/mods/ENVIRONMENT/lightning/init.lua @@ -19,7 +19,6 @@ local set_node = minetest.set_node local sound_play = minetest.sound_play local add_particlespawner = minetest.add_particlespawner local after = minetest.after -local add_entity = minetest.add_entity local get_objects_inside_radius = minetest.get_objects_inside_radius 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 - pos2.y = pos2.y + 1/2 + pos2.y = pos2.y + 1 local skeleton_lightning = false if rng:next(1,100) <= 3 then skeleton_lightning = true @@ -174,14 +173,14 @@ function lightning.strike_func(pos, pos2, objects) if get_node(pos2).name == "air" then -- Low chance for a lightning to spawn skeleton horse + skeletons if skeleton_lightning then - add_entity(pos2, "mobs_mc:skeleton_horse") + mcl_mobs.spawn(pos2, "mobs_mc:skeleton_horse") local angle, posadd angle = math.random() * math.pi * 2 for i=1,3 do posadd = { x=math.cos(angle),y=0,z=math.sin(angle) } 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 mob:set_yaw(angle-math.pi/2) end