Skip to main content

steel_registry/
banner_pattern.rs

1use rustc_hash::FxHashMap;
2use simdnbt::ToNbtTag;
3use simdnbt::owned::NbtTag;
4use steel_utils::Identifier;
5
6/// Represents a banner pattern definition from a data pack JSON file.
7#[derive(Debug)]
8pub struct BannerPattern {
9    pub key: Identifier,
10    pub asset_id: Identifier,
11    pub translation_key: &'static str,
12}
13
14impl ToNbtTag for &BannerPattern {
15    fn to_nbt_tag(self) -> NbtTag {
16        use simdnbt::owned::{NbtCompound, NbtTag};
17        let mut compound = NbtCompound::new();
18        let asset_id = self.asset_id.to_string();
19        compound.insert("asset_id", asset_id.as_str());
20        compound.insert("translation_key", self.translation_key);
21        NbtTag::Compound(compound)
22    }
23}
24
25pub type BannerPatternRef = &'static BannerPattern;
26
27pub struct BannerPatternRegistry {
28    banner_patterns_by_id: Vec<BannerPatternRef>,
29    banner_patterns_by_key: FxHashMap<Identifier, usize>,
30    tags: FxHashMap<Identifier, Vec<Identifier>>,
31    allows_registering: bool,
32}
33
34impl BannerPatternRegistry {
35    #[must_use]
36    pub fn new() -> Self {
37        Self {
38            banner_patterns_by_id: Vec::new(),
39            banner_patterns_by_key: FxHashMap::default(),
40            tags: FxHashMap::default(),
41            allows_registering: true,
42        }
43    }
44}
45
46crate::impl_standard_methods!(
47    BannerPatternRegistry,
48    BannerPatternRef,
49    banner_patterns_by_id,
50    banner_patterns_by_key,
51    allows_registering
52);
53
54crate::impl_registry!(
55    BannerPatternRegistry,
56    BannerPattern,
57    banner_patterns_by_id,
58    banner_patterns_by_key,
59    banner_patterns
60);
61
62crate::impl_tagged_registry!(
63    BannerPatternRegistry,
64    banner_patterns_by_key,
65    "banner pattern"
66);