wow_world_messages/world/wrath/
smsg_mirrorimage_data.rs

1use std::io::{Read, Write};
2
3use crate::Guid;
4use crate::wrath::{
5    Class, Gender, Race,
6};
7
8/// Auto generated from the original `wowm` in file [`wow_message_parser/wowm/world/spell/smsg_mirrorimage_data.wowm:18`](https://github.com/gtker/wow_messages/tree/main/wow_message_parser/wowm/world/spell/smsg_mirrorimage_data.wowm#L18):
9/// ```text
10/// smsg SMSG_MIRRORIMAGE_DATA = 0x0402 {
11///     Guid guid;
12///     u32 display_id;
13///     Race race;
14///     Gender gender;
15///     Class class;
16///     u8 skin_color;
17///     u8 face;
18///     u8 hair_style;
19///     u8 hair_color;
20///     u8 facial_hair;
21///     u32 guild_id;
22///     u32[11] display_ids;
23/// }
24/// ```
25#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Default)]
26pub struct SMSG_MIRRORIMAGE_DATA {
27    pub guid: Guid,
28    pub display_id: u32,
29    pub race: Race,
30    pub gender: Gender,
31    pub class: Class,
32    pub skin_color: u8,
33    pub face: u8,
34    pub hair_style: u8,
35    pub hair_color: u8,
36    pub facial_hair: u8,
37    pub guild_id: u32,
38    /// This array contains the: HEAD, SHOULDERS, BODY, CHEST, WAIST, LEGS, FEET, WRISTS, HANDS, BACK, and TABARD.
39    pub display_ids: [u32; 11],
40}
41
42impl crate::private::Sealed for SMSG_MIRRORIMAGE_DATA {}
43impl SMSG_MIRRORIMAGE_DATA {
44    fn read_inner(mut r: &mut &[u8], body_size: u32) -> Result<Self, crate::errors::ParseErrorKind> {
45        if body_size != 68 {
46            return Err(crate::errors::ParseErrorKind::InvalidSize);
47        }
48
49        // guid: Guid
50        let guid = crate::util::read_guid(&mut r)?;
51
52        // display_id: u32
53        let display_id = crate::util::read_u32_le(&mut r)?;
54
55        // race: Race
56        let race = crate::util::read_u8_le(&mut r)?.try_into()?;
57
58        // gender: Gender
59        let gender = crate::util::read_u8_le(&mut r)?.try_into()?;
60
61        // class: Class
62        let class = crate::util::read_u8_le(&mut r)?.try_into()?;
63
64        // skin_color: u8
65        let skin_color = crate::util::read_u8_le(&mut r)?;
66
67        // face: u8
68        let face = crate::util::read_u8_le(&mut r)?;
69
70        // hair_style: u8
71        let hair_style = crate::util::read_u8_le(&mut r)?;
72
73        // hair_color: u8
74        let hair_color = crate::util::read_u8_le(&mut r)?;
75
76        // facial_hair: u8
77        let facial_hair = crate::util::read_u8_le(&mut r)?;
78
79        // guild_id: u32
80        let guild_id = crate::util::read_u32_le(&mut r)?;
81
82        // display_ids: u32[11]
83        let display_ids = {
84            let mut display_ids = [u32::default(); 11];
85            for i in display_ids.iter_mut() {
86                *i = crate::util::read_u32_le(&mut r)?;
87            }
88            display_ids
89        };
90
91        Ok(Self {
92            guid,
93            display_id,
94            race,
95            gender,
96            class,
97            skin_color,
98            face,
99            hair_style,
100            hair_color,
101            facial_hair,
102            guild_id,
103            display_ids,
104        })
105    }
106
107}
108
109impl crate::Message for SMSG_MIRRORIMAGE_DATA {
110    const OPCODE: u32 = 0x0402;
111
112    #[cfg(feature = "print-testcase")]
113    fn message_name(&self) -> &'static str {
114        "SMSG_MIRRORIMAGE_DATA"
115    }
116
117    #[cfg(feature = "print-testcase")]
118    fn to_test_case_string(&self) -> Option<String> {
119        use std::fmt::Write;
120        use crate::traits::Message;
121
122        let mut s = String::new();
123
124        writeln!(s, "test SMSG_MIRRORIMAGE_DATA {{").unwrap();
125        // Members
126        writeln!(s, "    guid = {};", self.guid.guid()).unwrap();
127        writeln!(s, "    display_id = {};", self.display_id).unwrap();
128        writeln!(s, "    race = {};", self.race.as_test_case_value()).unwrap();
129        writeln!(s, "    gender = {};", self.gender.as_test_case_value()).unwrap();
130        writeln!(s, "    class = {};", self.class.as_test_case_value()).unwrap();
131        writeln!(s, "    skin_color = {};", self.skin_color).unwrap();
132        writeln!(s, "    face = {};", self.face).unwrap();
133        writeln!(s, "    hair_style = {};", self.hair_style).unwrap();
134        writeln!(s, "    hair_color = {};", self.hair_color).unwrap();
135        writeln!(s, "    facial_hair = {};", self.facial_hair).unwrap();
136        writeln!(s, "    guild_id = {};", self.guild_id).unwrap();
137        writeln!(s, "    display_ids = [").unwrap();
138        for v in self.display_ids.as_slice() {
139            write!(s, "{v:#04X}, ").unwrap();
140        }
141        writeln!(s, "    ];").unwrap();
142
143        writeln!(s, "}} [").unwrap();
144
145        let [a, b] = 70_u16.to_be_bytes();
146        writeln!(s, "    {a:#04X}, {b:#04X}, /* size */").unwrap();
147        let [a, b] = 1026_u16.to_le_bytes();
148        writeln!(s, "    {a:#04X}, {b:#04X}, /* opcode */").unwrap();
149        let mut bytes: Vec<u8> = Vec::new();
150        self.write_into_vec(&mut bytes).unwrap();
151        let mut bytes = bytes.into_iter();
152
153        crate::util::write_bytes(&mut s, &mut bytes, 8, "guid", "    ");
154        crate::util::write_bytes(&mut s, &mut bytes, 4, "display_id", "    ");
155        crate::util::write_bytes(&mut s, &mut bytes, 1, "race", "    ");
156        crate::util::write_bytes(&mut s, &mut bytes, 1, "gender", "    ");
157        crate::util::write_bytes(&mut s, &mut bytes, 1, "class", "    ");
158        crate::util::write_bytes(&mut s, &mut bytes, 1, "skin_color", "    ");
159        crate::util::write_bytes(&mut s, &mut bytes, 1, "face", "    ");
160        crate::util::write_bytes(&mut s, &mut bytes, 1, "hair_style", "    ");
161        crate::util::write_bytes(&mut s, &mut bytes, 1, "hair_color", "    ");
162        crate::util::write_bytes(&mut s, &mut bytes, 1, "facial_hair", "    ");
163        crate::util::write_bytes(&mut s, &mut bytes, 4, "guild_id", "    ");
164        writeln!(s, "    /* display_ids: u32[11] start */").unwrap();
165        for (i, v) in self.display_ids.iter().enumerate() {
166            crate::util::write_bytes(&mut s, &mut bytes, 4, &format!("display_ids {i}"), "    ");
167        }
168        writeln!(s, "    /* display_ids: u32[11] end */").unwrap();
169
170
171        writeln!(s, "] {{").unwrap();
172        writeln!(s, "    versions = \"{}\";", std::env::var("WOWM_TEST_CASE_WORLD_VERSION").unwrap_or("3.3.5".to_string())).unwrap();
173        writeln!(s, "}}\n").unwrap();
174
175        Some(s)
176    }
177
178    fn size_without_header(&self) -> u32 {
179        68
180    }
181
182    fn write_into_vec(&self, mut w: impl Write) -> Result<(), std::io::Error> {
183        // guid: Guid
184        w.write_all(&self.guid.guid().to_le_bytes())?;
185
186        // display_id: u32
187        w.write_all(&self.display_id.to_le_bytes())?;
188
189        // race: Race
190        w.write_all(&(self.race.as_int().to_le_bytes()))?;
191
192        // gender: Gender
193        w.write_all(&(self.gender.as_int().to_le_bytes()))?;
194
195        // class: Class
196        w.write_all(&(self.class.as_int().to_le_bytes()))?;
197
198        // skin_color: u8
199        w.write_all(&self.skin_color.to_le_bytes())?;
200
201        // face: u8
202        w.write_all(&self.face.to_le_bytes())?;
203
204        // hair_style: u8
205        w.write_all(&self.hair_style.to_le_bytes())?;
206
207        // hair_color: u8
208        w.write_all(&self.hair_color.to_le_bytes())?;
209
210        // facial_hair: u8
211        w.write_all(&self.facial_hair.to_le_bytes())?;
212
213        // guild_id: u32
214        w.write_all(&self.guild_id.to_le_bytes())?;
215
216        // display_ids: u32[11]
217        for i in self.display_ids.iter() {
218            w.write_all(&i.to_le_bytes())?;
219        }
220
221        Ok(())
222    }
223
224    fn read_body<S: crate::private::Sealed>(r: &mut &[u8], body_size: u32) -> Result<Self, crate::errors::ParseError> {
225        Self::read_inner(r, body_size).map_err(|a| crate::errors::ParseError::new(1026, "SMSG_MIRRORIMAGE_DATA", body_size, a))
226    }
227
228}
229
230#[cfg(feature = "wrath")]
231impl crate::wrath::ServerMessage for SMSG_MIRRORIMAGE_DATA {}
232