From e9ad2cfe1103e260975cf73125eff377229b1c9c Mon Sep 17 00:00:00 2001 From: cora Date: Sun, 17 Jul 2022 23:34:39 +0200 Subject: [PATCH 1/2] Make parrots imitate nearby mobs --- mods/ENTITIES/mobs_mc/parrot.lua | 40 ++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/mods/ENTITIES/mobs_mc/parrot.lua b/mods/ENTITIES/mobs_mc/parrot.lua index 84b3aaead..850fac7c3 100644 --- a/mods/ENTITIES/mobs_mc/parrot.lua +++ b/mods/ENTITIES/mobs_mc/parrot.lua @@ -13,6 +13,45 @@ local shoulders = { right = vector.new(3.75,10.5,0) } +local function get_random_mob_sound() + local t = table.copy(minetest.registered_entities) + table.shuffle(t) + for _,e in pairs(t) do + if e.is_mob and e.sounds then + return e.sounds[math.random(#e.sounds)] + end + end + return minetest.registered_entities["mobs_mc:parrot"].sounds.random +end + +local function imitate_mob_sound(self,mob) + local snd = mob.sounds.random + if not snd or mob.name == "mobs_mc:parrot" or math.random(20) == 1 then + snd = get_random_mob_sound() + end + return minetest.sound_play(snd, { + pos = self.object:get_pos(), + gain = 1.0, + pitch = 2.5, + max_hear_distance = self.sounds and self.sounds.distance or 32 + }, true) +end + +local function check_mobimitate(self,dtime) + if not self._mobimitate_timer or self._mobimitate_timer > 30 then + self._mobimitate_timer = 0 + for _,o in pairs(minetest.get_objects_inside_radius(self.object:get_pos(),32)) do + local l = o:get_luaentity() + if l and l.is_mob and l.name ~= "mobs_mc:parrot" then + imitate_mob_sound(self,l) + return + end + end + end + self._mobimitate_timer = self._mobimitate_timer + dtime + +end + --find a free shoulder or return nil local function get_shoulder(player) local sh = "left" @@ -159,6 +198,7 @@ mcl_mobs:register_mob("mobs_mc:parrot", { end, do_custom = function(self,dtime) check_perch(self,dtime) + check_mobimitate(self,dtime) end, do_punch = function(self,puncher) --do_punch is the mcl_mobs_redo variant - it gets called by on_punch later.... if self.object:get_attach() == puncher then From a49e66dbd3344d2c053ce6aba57bbd68ad4247aa Mon Sep 17 00:00:00 2001 From: cora Date: Sun, 17 Jul 2022 23:42:34 +0200 Subject: [PATCH 2/2] Detection radius is 20 according to the wiki --- mods/ENTITIES/mobs_mc/parrot.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/parrot.lua b/mods/ENTITIES/mobs_mc/parrot.lua index 850fac7c3..80a5b9318 100644 --- a/mods/ENTITIES/mobs_mc/parrot.lua +++ b/mods/ENTITIES/mobs_mc/parrot.lua @@ -40,7 +40,7 @@ end local function check_mobimitate(self,dtime) if not self._mobimitate_timer or self._mobimitate_timer > 30 then self._mobimitate_timer = 0 - for _,o in pairs(minetest.get_objects_inside_radius(self.object:get_pos(),32)) do + for _,o in pairs(minetest.get_objects_inside_radius(self.object:get_pos(),20)) do local l = o:get_luaentity() if l and l.is_mob and l.name ~= "mobs_mc:parrot" then imitate_mob_sound(self,l)