yog_registry/
item_looks.rs1use yog_sync::LazyLock;
6
7use yog_data::Ordered;
8use yog_graphics::Color;
9
10#[derive(yog_data::Schema, Debug, Clone, PartialEq, Default)]
12pub struct LookModels {
13 pub potion: String,
15 pub spawn_egg: String,
17 pub heads: Vec<String>,
19}
20
21#[derive(yog_data::Schema, Debug, Clone, PartialEq)]
24pub struct ItemTint {
25 pub color: Color,
26 #[data(default)]
27 pub items: Vec<String>,
28 #[data(default)]
29 pub prefix: String,
30}
31
32#[derive(yog_data::Schema, Debug, Clone, PartialEq, Default)]
34pub struct ItemLooks {
35 pub models: LookModels,
36 pub heads: Ordered<String>,
38 pub tints: Vec<ItemTint>,
39 pub spawn_eggs: Ordered<Vec<Color>>,
41}
42
43static ITEM_LOOKS: LazyLock<ItemLooks> = LazyLock::new(|| {
44 yog_data::built_in::<ItemLooks>(
45 "yog-registry's item looks",
46 include_str!("../assets/item_looks.ydata"),
47 )
48});
49
50impl ItemLooks {
51 pub fn game() -> &'static ItemLooks {
53 &ITEM_LOOKS
54 }
55
56 pub fn head(&self, path: &str) -> Option<&str> {
58 self.heads
59 .0
60 .iter()
61 .find(|(p, _)| p == path)
62 .map(|(_, t)| t.as_str())
63 }
64
65 pub fn spawn_egg(&self, mob: &str) -> Option<(Color, Color)> {
67 match self
68 .spawn_eggs
69 .0
70 .iter()
71 .find(|(m, _)| m == mob)?
72 .1
73 .as_slice()
74 {
75 [base, spots] => Some((*base, *spots)),
76 _ => None,
77 }
78 }
79
80 pub fn tint(&self, id: &str) -> Option<Color> {
82 self.tints
83 .iter()
84 .find(|t| {
85 t.items.iter().any(|i| i == id)
86 || (!t.prefix.is_empty() && id.starts_with(&t.prefix))
87 })
88 .map(|t| t.color)
89 }
90}
91
92#[cfg(test)]
93mod tests {
94 use super::*;
95
96 #[test]
97 fn the_game_looks_read() {
98 let l = ItemLooks::game();
99 assert_eq!(
100 l.head("zombie_head"),
101 Some("minecraft:entity/zombie/zombie")
102 );
103 assert_eq!(
104 l.spawn_egg("creeper"),
105 Some((Color(0xFF0D_A70B), Color(0xFF00_0000)))
106 );
107 assert_eq!(l.tint("minecraft:potion"), Some(Color(0xFF38_5DC6)));
108 assert_eq!(l.tint("minecraft:leather_boots"), Some(Color(0xFFA0_6540)));
109 }
110}