From 1e354f63c0ce46c58de9be4aa74b06598790a0b5 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Mon, 9 Dec 2019 12:17:51 +0100 Subject: [PATCH] Add chick sounds --- mods/ENTITIES/mcl_mobs/api.lua | 37 ++++++++++++------ mods/ENTITIES/mcl_mobs/api.txt | 2 + mods/ENTITIES/mobs_mc/LICENSE-media.md | 3 ++ mods/ENTITIES/mobs_mc/chicken.lua | 6 +++ .../mobs_mc/sounds/mobs_mc_chicken_child.ogg | Bin 0 -> 9978 bytes 5 files changed, 35 insertions(+), 13 deletions(-) create mode 100644 mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_child.ogg diff --git a/mods/ENTITIES/mcl_mobs/api.lua b/mods/ENTITIES/mcl_mobs/api.lua index b9b67078..fb823270 100644 --- a/mods/ENTITIES/mcl_mobs/api.lua +++ b/mods/ENTITIES/mcl_mobs/api.lua @@ -96,19 +96,29 @@ local mod_mobspawners = minetest.get_modpath("mcl_mobspawners") ~= nil local mod_hunger = minetest.get_modpath("mcl_hunger") ~= nil -- play sound -local mob_sound = function(self, sound, is_opinion, fixed_pitch) +local mob_sound = function(self, soundname, is_opinion, fixed_pitch) + local soundinfo + if self.sounds_child and self.child then + soundinfo = self.sounds_child + elseif self.sounds then + soundinfo = self.sounds + end + if not soundinfo then + return + end + local sound = soundinfo[soundname] if sound then if is_opinion and self.opinion_sound_cooloff > 0 then return end local pitch if not fixed_pitch then - local base_pitch = self.sounds.base_pitch + local base_pitch = soundinfo.base_pitch if not base_pitch then base_pitch = 1 end - if self.child then + if self.child and (not self.sounds_child) then -- Children have higher pitch pitch = base_pitch * 1.5 else @@ -140,7 +150,7 @@ local do_attack = function(self, player) -- TODO: Implement war_cry sound without being annoying --if random(0, 100) < 90 then - --mob_sound(self, self.sounds.war_cry, true) + --mob_sound(self, "war_cry", true) --end end @@ -512,7 +522,7 @@ local check_for_death = function(self, cause, cmi_cause) remove_texture_mod(self, "^[colorize:#FF000040") end end, self) - mob_sound(self, self.sounds.damage) + mob_sound(self, "damage") end -- backup nametag so we can show health stats @@ -539,7 +549,7 @@ local check_for_death = function(self, cause, cmi_cause) item_drop(self, nil) end - mob_sound(self, self.sounds.death) + mob_sound(self, "death") local pos = self.object:get_pos() @@ -928,7 +938,7 @@ local do_jump = function(self) end, self, v) if self.jump_sound_cooloff <= 0 then - mob_sound(self, self.sounds.jump) + mob_sound(self, "jump") self.jump_sound_cooloff = 0.5 end else @@ -1443,7 +1453,7 @@ local smart_mobs = function(self, s, p, dist, dtime) else -- yay i found path -- TODO: Implement war_cry sound without being annoying - --mob_sound(self, self.sounds.war_cry, true) + --mob_sound(self, "war_cry", true) set_velocity(self, self.walk_velocity) -- follow path now that it has it @@ -2058,7 +2068,7 @@ local do_states = function(self, dtime) self.v_start = true self.timer = 0 self.blinktimer = 0 - mob_sound(self, self.sounds.fuse, nil, false) + mob_sound(self, "fuse", nil, false) -- stop timer if out of reach or direct line of sight elseif self.allow_fuse_reset @@ -2290,7 +2300,7 @@ local do_states = function(self, dtime) if line_of_sight(self, p2, s2) == true then -- play attack sound - mob_sound(self, self.sounds.attack) + mob_sound(self, "attack") -- punch player (or what player is attached to) local attached = self.attack:get_attach() @@ -2344,7 +2354,7 @@ local do_states = function(self, dtime) set_animation(self, "shoot") -- play shoot attack sound - mob_sound(self, self.sounds.shoot_attack) + mob_sound(self, "shoot_attack") local p = self.object:get_pos() @@ -3017,7 +3027,7 @@ local mob_step = function(self, dtime) -- mob plays random sound at times if random(1, 100) == 1 then - mob_sound(self, self.sounds.random, true) + mob_sound(self, "random", true) end -- environmental damage timer (every 1 second) @@ -3228,6 +3238,7 @@ minetest.register_entity(name, { child = def.child or false, texture_mods = {}, shoot_arrow = def.shoot_arrow, + sounds_child = def.sounds_child, -- End of MCL2 extensions on_spawn = def.on_spawn, @@ -3857,7 +3868,7 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame) end -- make sound when fed so many times - mob_sound(self, self.sounds.random, true) + mob_sound(self, "random", true) end return true diff --git a/mods/ENTITIES/mcl_mobs/api.txt b/mods/ENTITIES/mcl_mobs/api.txt index 0430bbc0..96ae363b 100644 --- a/mods/ENTITIES/mcl_mobs/api.txt +++ b/mods/ENTITIES/mcl_mobs/api.txt @@ -229,6 +229,8 @@ functions needed for the mob to work properly which contains the following: 'shoot_arrow(self, pos, dir)' function that is called when mob wants to shoot an arrow. You can spawn your own arrow here. pos is mob position, dir is mob's aiming direction + 'sounds_child' same as sounds, but for childs. If not defined, childs will use same + sound as adults but with higher pitch Node Replacement diff --git a/mods/ENTITIES/mobs_mc/LICENSE-media.md b/mods/ENTITIES/mobs_mc/LICENSE-media.md index 7cad2241..69615048 100644 --- a/mods/ENTITIES/mobs_mc/LICENSE-media.md +++ b/mods/ENTITIES/mobs_mc/LICENSE-media.md @@ -81,6 +81,9 @@ Origin of those models: * PilzAdam and Wuzzy (CC0) * `mobs_mc_chicken_lay_egg.ogg` +* [AGFX](http://www.freesound.org/people/DrMinky/sounds/) (CC0) + * `mobs_mc_chicken_child.ogg` + * Source: * Randomation (CC0) * `green_slime_damage.ogg` * `green_slime_attack.ogg` diff --git a/mods/ENTITIES/mobs_mc/chicken.lua b/mods/ENTITIES/mobs_mc/chicken.lua index c6ce8550..e5c9ba80 100644 --- a/mods/ENTITIES/mobs_mc/chicken.lua +++ b/mods/ENTITIES/mobs_mc/chicken.lua @@ -42,6 +42,12 @@ mobs:register_mob("mobs_mc:chicken", { -- TODO: death, damage distance = 16, }, + sounds_child = { + random = "mobs_mc_chicken_child", + damage = "mobs_mc_chicken_child", + death = "mobs_mc_chicken_child", + distance = 16, + }, animation = { stand_speed = 25, walk_speed = 25, run_speed = 50, stand_start = 0, stand_end = 0, diff --git a/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_child.ogg b/mods/ENTITIES/mobs_mc/sounds/mobs_mc_chicken_child.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5ea33fc0781f1cd52b3b6427b0e75fc3f8d925ff GIT binary patch literal 9978 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 literal 0 HcmV?d00001