Skip to main content

steel_registry/
cow_variant.rs

1use crate::shared_structs::{SpawnConditionEntry, insert_spawn_conditions};
2use rustc_hash::FxHashMap;
3use simdnbt::ToNbtTag;
4use simdnbt::owned::NbtTag;
5use steel_utils::Identifier;
6
7/// Represents a full cow variant definition from a data pack JSON file.
8#[derive(Debug)]
9pub struct CowVariant {
10    pub key: Identifier,
11    pub asset_id: Identifier,
12    pub baby_asset_id: Identifier,
13    pub model: CowModelType,
14    pub spawn_conditions: &'static [SpawnConditionEntry],
15}
16
17/// The model type for the cow, which can affect its shape.
18#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
19pub enum CowModelType {
20    #[default]
21    Normal,
22    Cold,
23    Warm,
24}
25
26impl ToNbtTag for &CowVariant {
27    fn to_nbt_tag(self) -> NbtTag {
28        use simdnbt::owned::{NbtCompound, NbtTag};
29        let mut compound = NbtCompound::new();
30        compound.insert("asset_id", self.asset_id.clone());
31        compound.insert("baby_asset_id", self.baby_asset_id.clone());
32        compound.insert(
33            "model",
34            match self.model {
35                CowModelType::Normal => "normal",
36                CowModelType::Cold => "cold",
37                CowModelType::Warm => "warm",
38            },
39        );
40        insert_spawn_conditions(&mut compound, self.spawn_conditions);
41        NbtTag::Compound(compound)
42    }
43}
44
45pub type CowVariantRef = &'static CowVariant;
46
47pub struct CowVariantRegistry {
48    cow_variants_by_id: Vec<CowVariantRef>,
49    cow_variants_by_key: FxHashMap<Identifier, usize>,
50    allows_registering: bool,
51}
52
53impl CowVariantRegistry {
54    #[must_use]
55    pub fn new() -> Self {
56        Self {
57            cow_variants_by_id: Vec::new(),
58            cow_variants_by_key: FxHashMap::default(),
59            allows_registering: true,
60        }
61    }
62}
63
64crate::impl_standard_methods!(
65    CowVariantRegistry,
66    CowVariantRef,
67    cow_variants_by_id,
68    cow_variants_by_key,
69    allows_registering
70);
71
72crate::impl_registry!(
73    CowVariantRegistry,
74    CowVariant,
75    cow_variants_by_id,
76    cow_variants_by_key,
77    cow_variants
78);