steel_registry/
pig_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 PigVariant {
10 pub key: Identifier,
11 pub asset_id: Identifier,
12 pub baby_asset_id: Identifier,
13 pub model: PigModelType,
14 pub spawn_conditions: &'static [SpawnConditionEntry],
15}
16
17#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
19pub enum PigModelType {
20 #[default]
21 Normal,
22 Cold,
23}
24
25impl ToNbtTag for &PigVariant {
26 fn to_nbt_tag(self) -> NbtTag {
27 use simdnbt::owned::{NbtCompound, NbtTag};
28 let mut compound = NbtCompound::new();
29 compound.insert("asset_id", self.asset_id.clone());
30 compound.insert("baby_asset_id", self.baby_asset_id.clone());
31 compound.insert(
32 "model",
33 match self.model {
34 PigModelType::Normal => "normal",
35 PigModelType::Cold => "cold",
36 },
37 );
38 insert_spawn_conditions(&mut compound, self.spawn_conditions);
39 NbtTag::Compound(compound)
40 }
41}
42
43pub type PigVariantRef = &'static PigVariant;
44
45pub struct PigVariantRegistry {
46 pig_variants_by_id: Vec<PigVariantRef>,
47 pig_variants_by_key: FxHashMap<Identifier, usize>,
48 allows_registering: bool,
49}
50
51impl PigVariantRegistry {
52 #[must_use]
53 pub fn new() -> Self {
54 Self {
55 pig_variants_by_id: Vec::new(),
56 pig_variants_by_key: FxHashMap::default(),
57 allows_registering: true,
58 }
59 }
60}
61
62crate::impl_standard_methods!(
63 PigVariantRegistry,
64 PigVariantRef,
65 pig_variants_by_id,
66 pig_variants_by_key,
67 allows_registering
68);
69
70crate::impl_registry!(
71 PigVariantRegistry,
72 PigVariant,
73 pig_variants_by_id,
74 pig_variants_by_key,
75 pig_variants
76);