steel_registry/
cow_variant.rs1use crate::shared_structs::{SpawnConditionEntry, insert_spawn_conditions};
2use rustc_hash::FxHashMap;
3use simdnbt::ToNbtTag;
4use simdnbt::owned::NbtTag;
5use steel_utils::Identifier;
6
7#[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#[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);