diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index 3d3ac8632..29cdc2c48 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -671,6 +671,13 @@ mob will spawn e.g. mobs_animal:sheep_chance 11000 mobs_monster:sand_monster_chance 100 +Registering Mob Conversion +---------------- + +Sometimes you need to completely replace one mob with a different version. To do this, use: + + mcl_mobs.register_conversion(old_name, new_name) + Rideable Horse Example Mob -------------------------- diff --git a/mods/ENTITIES/mcl_mobs/init.lua b/mods/ENTITIES/mcl_mobs/init.lua index 3a2e18872..44eae7b13 100644 --- a/mods/ENTITIES/mcl_mobs/init.lua +++ b/mods/ENTITIES/mcl_mobs/init.lua @@ -342,6 +342,17 @@ 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 +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() + end, + _convert_to = new_name, + }) +end function mcl_mobs.get_arrow_damage_func(damage, typ) local typ = mcl_damage.types[typ] and typ or "arrow" diff --git a/mods/ENTITIES/mobs_mc/rover.lua b/mods/ENTITIES/mobs_mc/rover.lua index 68d13669d..d1f21ffd0 100644 --- a/mods/ENTITIES/mobs_mc/rover.lua +++ b/mods/ENTITIES/mobs_mc/rover.lua @@ -491,20 +491,17 @@ mcl_mobs.register_mob("mobs_mc:rover", { view_range = 64, fear_height = 4, attack_type = "dogfight", -}) - --- compat -minetest.register_entity("mobs_mc:enderman", { - on_activate = function(self, staticdata, dtime) - local obj = minetest.add_entity(self.object:get_pos(), "mobs_mc:rover", staticdata) + _on_after_convert = function(obj) obj:set_properties({ mesh = "vl_rover.b3d", textures = { "vl_mobs_rover.png^vl_mobs_rover_face.png" }, visual_size = {x=10, y=10}, }) - self.object:remove() - end, -}) + end +}) -- END mcl_mobs.register_mob("mobs_mc:rover", { + +-- compat +mcl_mobs.register_conversion("mobs_mc:enderman", "mobs_mc:rover") -- End spawn mcl_mobs:spawn_specific( diff --git a/mods/ENTITIES/mobs_mc/stalker.lua b/mods/ENTITIES/mobs_mc/stalker.lua index 69fad180a..5b1fd6a08 100644 --- a/mods/ENTITIES/mobs_mc/stalker.lua +++ b/mods/ENTITIES/mobs_mc/stalker.lua @@ -175,7 +175,18 @@ mcl_mobs.register_mob("mobs_mc:stalker", { floats = 1, fear_height = 4, view_range = 16, -}) + + _on_after_convert = function(obj) + obj:set_properties({ + visual_size = {x=2, y=2}, + mesh = "vl_stalker.b3d", + textures = { + {get_texture({}), + "mobs_mc_empty.png"}, + }, + }) + end, +}) -- END mcl_mobs.register_mob("mobs_mc:stalker", { mcl_mobs.register_mob("mobs_mc:stalker_overloaded", { description = S("Overloaded Stalker"), @@ -304,26 +315,8 @@ mcl_mobs.register_mob("mobs_mc:stalker_overloaded", { --Having trouble when fire is placed with lightning fire_resistant = true, glow = 3, -}) --- compat -minetest.register_entity("mobs_mc:creeper", { - on_activate = function(self, staticdata, dtime) - local obj = minetest.add_entity(self.object:get_pos(), "mobs_mc:stalker", staticdata) - obj:set_properties({ - visual_size = {x=2, y=2}, - mesh = "vl_stalker.b3d", - textures = { - {get_texture({}), - "mobs_mc_empty.png"}, - }, - }) - self.object:remove() - end, -}) -minetest.register_entity("mobs_mc:creeper_charged", { - on_activate = function(self, staticdata, dtime) - local obj = minetest.add_entity(self.object:get_pos(), "mobs_mc:stalker_overloaded", staticdata) + _on_after_convert = function(obj) obj:set_properties({ visual_size = {x=2, y=2}, mesh = "vl_stalker.b3d", @@ -332,9 +325,12 @@ minetest.register_entity("mobs_mc:creeper_charged", { AURA}, }, }) - self.object:remove() end, -}) +}) -- END mcl_mobs.register_mob("mobs_mc:stalker_overloaded", { + +-- compat +mcl_mobs.register_conversion("mobs_mc:creeper", "mobs_mc:stalker") +mcl_mobs.register_conversion("mobs_mc:creeper_charged", "mobs_mc:stalker_overloaded") mcl_mobs:spawn_specific( "mobs_mc:stalker", diff --git a/mods/ITEMS/mcl_mobspawners/init.lua b/mods/ITEMS/mcl_mobspawners/init.lua index ae6326009..f32558629 100644 --- a/mods/ITEMS/mcl_mobspawners/init.lua +++ b/mods/ITEMS/mcl_mobspawners/init.lua @@ -63,8 +63,8 @@ local function set_doll_properties(doll, mob) xs = doll_size_overrides[mob].x ys = doll_size_overrides[mob].y else - xs = mobinfo.visual_size.x * 0.33333 - ys = mobinfo.visual_size.y * 0.33333 + xs = (mobinfo.visual_size.x or 0) * 0.33333 + ys = (mobinfo.visual_size.y or 0) * 0.33333 end local prop = { mesh = mobinfo.mesh, @@ -358,6 +358,11 @@ doll_def.on_activate = function(self, staticdata, dtime_s) if mob == "" or mob == nil then mob = default_mob end + + -- Handle conversion of mob spawners + local convert_to = (minetest.registered_entities[mob] or {})._convert_to + if convert_to then mob = convert_to end + set_doll_properties(self.object, mob) self.object:set_velocity({x=0, y=0, z=0}) self.object:set_acceleration({x=0, y=0, z=0}) @@ -390,3 +395,11 @@ minetest.register_lbm({ respawn_doll(pos) end, }) + +minetest.register_on_mods_loaded(function() + for name,mobinfo in pairs(minetest.registered_entities) do + if ( mobinfo.is_mob or name:find("mobs_mc") ) and not ( mobinfo.visual_size or mobinfo._convert_to ) then + minetest.log("warning", "Definition for "..tostring(name).." is missing field 'visual_size', mob spawners will not work properly") + end + end +end)