wow_world_messages/world/shared/
smsg_force_flight_speed_change_tbc_wrath.rs1use std::io::{Read, Write};
2
3use crate::Guid;
4
5#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Default)]
14pub struct SMSG_FORCE_FLIGHT_SPEED_CHANGE {
15 pub guid: Guid,
16 pub move_event: u32,
19 pub speed: f32,
20}
21
22impl crate::private::Sealed for SMSG_FORCE_FLIGHT_SPEED_CHANGE {}
23impl SMSG_FORCE_FLIGHT_SPEED_CHANGE {
24 fn read_inner(mut r: &mut &[u8], body_size: u32) -> Result<Self, crate::errors::ParseErrorKind> {
25 if !(9..=17).contains(&body_size) {
26 return Err(crate::errors::ParseErrorKind::InvalidSize);
27 }
28
29 let guid = crate::util::read_packed_guid(&mut r)?;
31
32 let move_event = crate::util::read_u32_le(&mut r)?;
34
35 let speed = crate::util::read_f32_le(&mut r)?;
37
38 Ok(Self {
39 guid,
40 move_event,
41 speed,
42 })
43 }
44
45}
46
47impl crate::Message for SMSG_FORCE_FLIGHT_SPEED_CHANGE {
48 const OPCODE: u32 = 0x0381;
49
50 #[cfg(feature = "print-testcase")]
51 fn message_name(&self) -> &'static str {
52 "SMSG_FORCE_FLIGHT_SPEED_CHANGE"
53 }
54
55 #[cfg(feature = "print-testcase")]
56 fn to_test_case_string(&self) -> Option<String> {
57 use std::fmt::Write;
58 use crate::traits::Message;
59
60 let mut s = String::new();
61
62 writeln!(s, "test SMSG_FORCE_FLIGHT_SPEED_CHANGE {{").unwrap();
63 writeln!(s, " guid = {};", self.guid.guid()).unwrap();
65 writeln!(s, " move_event = {};", self.move_event).unwrap();
66 writeln!(s, " speed = {};", if self.speed.to_string().contains('.') { self.speed.to_string() } else { format!("{}.0", self.speed) }).unwrap();
67
68 writeln!(s, "}} [").unwrap();
69
70 let [a, b] = (u16::try_from(self.size() + 2).unwrap()).to_be_bytes();
71 writeln!(s, " {a:#04X}, {b:#04X}, /* size */").unwrap();
72 let [a, b] = 897_u16.to_le_bytes();
73 writeln!(s, " {a:#04X}, {b:#04X}, /* opcode */").unwrap();
74 let mut bytes: Vec<u8> = Vec::new();
75 self.write_into_vec(&mut bytes).unwrap();
76 let mut bytes = bytes.into_iter();
77
78 crate::util::write_bytes(&mut s, &mut bytes, crate::util::packed_guid_size(&self.guid), "guid", " ");
79 crate::util::write_bytes(&mut s, &mut bytes, 4, "move_event", " ");
80 crate::util::write_bytes(&mut s, &mut bytes, 4, "speed", " ");
81
82
83 writeln!(s, "] {{").unwrap();
84 writeln!(s, " versions = \"{}\";", std::env::var("WOWM_TEST_CASE_WORLD_VERSION").unwrap_or("2.4.3 3".to_string())).unwrap();
85 writeln!(s, "}}\n").unwrap();
86
87 Some(s)
88 }
89
90 fn size_without_header(&self) -> u32 {
91 self.size() as u32
92 }
93
94 fn write_into_vec(&self, mut w: impl Write) -> Result<(), std::io::Error> {
95 crate::util::write_packed_guid(&self.guid, &mut w)?;
97
98 w.write_all(&self.move_event.to_le_bytes())?;
100
101 w.write_all(&self.speed.to_le_bytes())?;
103
104 Ok(())
105 }
106
107 fn read_body<S: crate::private::Sealed>(r: &mut &[u8], body_size: u32) -> Result<Self, crate::errors::ParseError> {
108 Self::read_inner(r, body_size).map_err(|a| crate::errors::ParseError::new(897, "SMSG_FORCE_FLIGHT_SPEED_CHANGE", body_size, a))
109 }
110
111}
112
113#[cfg(feature = "tbc")]
114impl crate::tbc::ServerMessage for SMSG_FORCE_FLIGHT_SPEED_CHANGE {}
115
116#[cfg(feature = "wrath")]
117impl crate::wrath::ServerMessage for SMSG_FORCE_FLIGHT_SPEED_CHANGE {}
118
119impl SMSG_FORCE_FLIGHT_SPEED_CHANGE {
120 pub(crate) const fn size(&self) -> usize {
121 crate::util::packed_guid_size(&self.guid) + 4 + 4 }
125}
126