Skip to main content

steel_registry/
chicken_sound_variant.rs

1use rustc_hash::FxHashMap;
2use simdnbt::ToNbtTag;
3use simdnbt::owned::NbtTag;
4use steel_utils::Identifier;
5use steel_utils::random::Random;
6
7use crate::RegistryExt;
8use crate::sound_event::SoundEventRef;
9
10/// Represents a set of sounds for a chicken variant from a data pack JSON file.
11#[derive(Debug)]
12pub struct ChickenSoundVariant {
13    pub key: Identifier,
14    pub baby_sounds: ChickenAge,
15    pub adult_sounds: ChickenAge,
16}
17#[derive(Debug)]
18pub struct ChickenAge {
19    pub ambient_sound: SoundEventRef,
20    pub death_sound: SoundEventRef,
21    pub hurt_sound: SoundEventRef,
22    pub step_sound: SoundEventRef,
23}
24
25impl ToNbtTag for &ChickenAge {
26    fn to_nbt_tag(self) -> NbtTag {
27        use simdnbt::owned::{NbtCompound, NbtTag};
28        let mut adult = NbtCompound::new();
29        let s = self.ambient_sound.key.to_string();
30        adult.insert("ambient_sound", s.as_str());
31        let s = self.death_sound.key.to_string();
32        adult.insert("death_sound", s.as_str());
33        let s = self.hurt_sound.key.to_string();
34        adult.insert("hurt_sound", s.as_str());
35        let s = self.step_sound.key.to_string();
36        adult.insert("step_sound", s.as_str());
37        NbtTag::Compound(adult)
38    }
39}
40
41impl ToNbtTag for &ChickenSoundVariant {
42    fn to_nbt_tag(self) -> NbtTag {
43        use simdnbt::owned::{NbtCompound, NbtTag};
44        let mut compound = NbtCompound::new();
45        compound.insert("adult_sounds", self.adult_sounds.to_nbt_tag());
46        compound.insert("baby_sounds", self.baby_sounds.to_nbt_tag());
47        NbtTag::Compound(compound)
48    }
49}
50
51pub type ChickenSoundVariantRef = &'static ChickenSoundVariant;
52
53pub struct ChickenSoundVariantRegistry {
54    chicken_sound_variants_by_id: Vec<ChickenSoundVariantRef>,
55    chicken_sound_variants_by_key: FxHashMap<Identifier, usize>,
56    allows_registering: bool,
57}
58
59impl ChickenSoundVariantRegistry {
60    #[must_use]
61    pub fn new() -> Self {
62        Self {
63            chicken_sound_variants_by_id: Vec::new(),
64            chicken_sound_variants_by_key: FxHashMap::default(),
65            allows_registering: true,
66        }
67    }
68
69    #[must_use]
70    pub fn pick_random(&self, random: &mut impl Random) -> Option<ChickenSoundVariantRef> {
71        // Vanilla picks a random sound-set holder from the chicken sound variant registry.
72        let bound = i32::try_from(self.len()).ok()?;
73        if bound == 0 {
74            return None;
75        }
76
77        self.by_id(random.next_i32_bounded(bound) as usize)
78    }
79}
80
81crate::impl_standard_methods!(
82    ChickenSoundVariantRegistry,
83    ChickenSoundVariantRef,
84    chicken_sound_variants_by_id,
85    chicken_sound_variants_by_key,
86    allows_registering
87);
88
89crate::impl_registry!(
90    ChickenSoundVariantRegistry,
91    ChickenSoundVariant,
92    chicken_sound_variants_by_id,
93    chicken_sound_variants_by_key,
94    chicken_sound_variants
95);