wow_world_messages/world/wrath/
smsg_mirrorimage_data.rs1use std::io::{Read, Write};
2
3use crate::Guid;
4use crate::wrath::{
5 Class, Gender, Race,
6};
7
8#[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 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 let guid = crate::util::read_guid(&mut r)?;
51
52 let display_id = crate::util::read_u32_le(&mut r)?;
54
55 let race = crate::util::read_u8_le(&mut r)?.try_into()?;
57
58 let gender = crate::util::read_u8_le(&mut r)?.try_into()?;
60
61 let class = crate::util::read_u8_le(&mut r)?.try_into()?;
63
64 let skin_color = crate::util::read_u8_le(&mut r)?;
66
67 let face = crate::util::read_u8_le(&mut r)?;
69
70 let hair_style = crate::util::read_u8_le(&mut r)?;
72
73 let hair_color = crate::util::read_u8_le(&mut r)?;
75
76 let facial_hair = crate::util::read_u8_le(&mut r)?;
78
79 let guild_id = crate::util::read_u32_le(&mut r)?;
81
82 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 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 w.write_all(&self.guid.guid().to_le_bytes())?;
185
186 w.write_all(&self.display_id.to_le_bytes())?;
188
189 w.write_all(&(self.race.as_int().to_le_bytes()))?;
191
192 w.write_all(&(self.gender.as_int().to_le_bytes()))?;
194
195 w.write_all(&(self.class.as_int().to_le_bytes()))?;
197
198 w.write_all(&self.skin_color.to_le_bytes())?;
200
201 w.write_all(&self.face.to_le_bytes())?;
203
204 w.write_all(&self.hair_style.to_le_bytes())?;
206
207 w.write_all(&self.hair_color.to_le_bytes())?;
209
210 w.write_all(&self.facial_hair.to_le_bytes())?;
212
213 w.write_all(&self.guild_id.to_le_bytes())?;
215
216 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