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;
5
6use crate::sound_event::SoundEventRef;
7
8/// Represents a set of sounds for a chicken variant from a data pack JSON file.
9#[derive(Debug)]
10pub struct ChickenSoundVariant {
11    pub key: Identifier,
12    pub baby_sounds: ChickenAge,
13    pub adult_sounds: ChickenAge,
14}
15#[derive(Debug)]
16pub struct ChickenAge {
17    pub ambient_sound: SoundEventRef,
18    pub death_sound: SoundEventRef,
19    pub hurt_sound: SoundEventRef,
20    pub step_sound: SoundEventRef,
21}
22
23impl ToNbtTag for &ChickenAge {
24    fn to_nbt_tag(self) -> NbtTag {
25        use simdnbt::owned::{NbtCompound, NbtTag};
26        let mut adult = NbtCompound::new();
27        let s = self.ambient_sound.key.to_string();
28        adult.insert("ambient_sound", s.as_str());
29        let s = self.death_sound.key.to_string();
30        adult.insert("death_sound", s.as_str());
31        let s = self.hurt_sound.key.to_string();
32        adult.insert("hurt_sound", s.as_str());
33        let s = self.step_sound.key.to_string();
34        adult.insert("step_sound", s.as_str());
35        NbtTag::Compound(adult)
36    }
37}
38
39impl ToNbtTag for &ChickenSoundVariant {
40    fn to_nbt_tag(self) -> NbtTag {
41        use simdnbt::owned::{NbtCompound, NbtTag};
42        let mut compound = NbtCompound::new();
43        compound.insert("adult_sounds", self.adult_sounds.to_nbt_tag());
44        compound.insert("baby_sounds", self.baby_sounds.to_nbt_tag());
45        NbtTag::Compound(compound)
46    }
47}
48
49pub type ChickenSoundVariantRef = &'static ChickenSoundVariant;
50
51pub struct ChickenSoundVariantRegistry {
52    chicken_sound_variants_by_id: Vec<ChickenSoundVariantRef>,
53    chicken_sound_variants_by_key: FxHashMap<Identifier, usize>,
54    allows_registering: bool,
55}
56
57impl ChickenSoundVariantRegistry {
58    #[must_use]
59    pub fn new() -> Self {
60        Self {
61            chicken_sound_variants_by_id: Vec::new(),
62            chicken_sound_variants_by_key: FxHashMap::default(),
63            allows_registering: true,
64        }
65    }
66}
67
68crate::impl_standard_methods!(
69    ChickenSoundVariantRegistry,
70    ChickenSoundVariantRef,
71    chicken_sound_variants_by_id,
72    chicken_sound_variants_by_key,
73    allows_registering
74);
75
76crate::impl_registry!(
77    ChickenSoundVariantRegistry,
78    ChickenSoundVariant,
79    chicken_sound_variants_by_id,
80    chicken_sound_variants_by_key,
81    chicken_sound_variants
82);