diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index 873d05bf2..1e49e8b4f 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -150,6 +150,11 @@ function mob_class:mob_activate(staticdata, def, dtime) local tmp = minetest.deserialize(staticdata) if tmp then + -- Patch incorrectly converted mobs + if tmp.base_mesh ~= minetest.registered_entities[self.name].mesh then + mcl_mobs.strip_staticdata(tmp) + end + for _,stat in pairs(tmp) do self[_] = stat end diff --git a/mods/ENTITIES/mcl_mobs/init.lua b/mods/ENTITIES/mcl_mobs/init.lua index 44eae7b13..81b5fdfe7 100644 --- a/mods/ENTITIES/mcl_mobs/init.lua +++ b/mods/ENTITIES/mcl_mobs/init.lua @@ -342,13 +342,33 @@ function mcl_mobs.register_mob(name, def) minetest.register_entity(name, setmetatable(final_def,mcl_mobs.mob_class_meta)) end -- END mcl_mobs.register_mob function + +local STRIP_FIELDS = { "mesh", "base_size", "textures", "base_mesh", "base_texture" } +function mcl_mobs.strip_staticdata(unpacked_staticdata) + -- Strip select fields from the staticdata to prevent conversion issues + for i = 1,#STRIP_FIELDS do + unpacked_staticdata[STRIP_FIELDS[i]] = nil + end +end function mcl_mobs.register_conversion(old_name, new_name) minetest.register_entity(old_name, { on_activate = function(self, staticdata, dtime) - local obj = minetest.add_entity(self.object:get_pos(), new_name, staticdata) - local hook = (obj:get_luaentity() or {})._on_after_convert - if hook then hook(obj) end - self.object:remove() + local unpacked_staticdata = minetest.deserialize(staticdata) + mcl_mobs.strip_staticdata(unpacked_staticdata) + staticdata = minetest.serialize(unpacked_staticdata) + + local old_object = self.object + if not old_object then return end + + local pos = old_object:get_pos() + if not pos then return end + old_object:remove() + + local new_object = minetest.add_entity(pos, new_name, staticdata) + if not new_object then return end + + local hook = (new_object:get_luaentity() or {})._on_after_convert + if hook then hook(new_object) end end, _convert_to = new_name, }) @@ -572,7 +592,12 @@ function mcl_mobs.register_egg(mob, desc, background_color, overlay_color, addeg --minetest.log("min light: " .. mob_light_lvl[1]) --minetest.log("max light: " .. mob_light_lvl[2]) - mcl_mobspawners.setup_spawner(pointed_thing.under, itemstack:get_name(), mob_light_lvl[1], 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 + + mcl_mobspawners.setup_spawner(pointed_thing.under, mob_name, mob_light_lvl[1], mob_light_lvl[2]) if not minetest.is_creative_enabled(name) then itemstack:take_item() end diff --git a/mods/ITEMS/mcl_mobspawners/init.lua b/mods/ITEMS/mcl_mobspawners/init.lua index f32558629..83c03804e 100644 --- a/mods/ITEMS/mcl_mobspawners/init.lua +++ b/mods/ITEMS/mcl_mobspawners/init.lua @@ -83,6 +83,13 @@ local function respawn_doll(pos) local mob = meta:get_string("Mob") local doll if mob and mob ~= "" then + -- Handle conversion of mob spawners + local convert_to = (minetest.registered_entities[mob] or {})._convert_to + if convert_to then + mob = convert_to + meta:set_string("Mob", mob) + end + doll = find_doll(pos) if not doll then doll = spawn_doll(pos) @@ -128,7 +135,6 @@ function mcl_mobspawners.setup_spawner(pos, Mob, MinLight, MaxLight, MaxMobsInAr end set_doll_properties(doll, Mob) - -- Start spawning very soon local t = minetest.get_node_timer(pos) t:start(2) @@ -165,7 +171,6 @@ local function spawn_mobs(pos, elapsed) local count = 0 local ent - local timer = minetest.get_node_timer(pos) -- spawn mob if player detected and in range @@ -367,7 +372,6 @@ doll_def.on_activate = function(self, staticdata, dtime_s) self.object:set_velocity({x=0, y=0, z=0}) self.object:set_acceleration({x=0, y=0, z=0}) self.object:set_armor_groups({immortal=1}) - end doll_def.on_step = function(self, dtime)