steel_registry/
chicken_sound_variant.rs1use 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#[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 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);