wow_world_messages/world/shared/
smsg_force_flight_speed_change_tbc_wrath.rs

1use std::io::{Read, Write};
2
3use crate::Guid;
4
5/// Auto generated from the original `wowm` in file [`wow_message_parser/wowm/world/movement/smsg/smsg_force_flight_speed_change.wowm:1`](https://github.com/gtker/wow_messages/tree/main/wow_message_parser/wowm/world/movement/smsg/smsg_force_flight_speed_change.wowm#L1):
6/// ```text
7/// smsg SMSG_FORCE_FLIGHT_SPEED_CHANGE = 0x0381 {
8///     PackedGuid guid;
9///     u32 move_event;
10///     f32 speed;
11/// }
12/// ```
13#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Default)]
14pub struct SMSG_FORCE_FLIGHT_SPEED_CHANGE {
15    pub guid: Guid,
16    /// cmangos/mangoszero/vmangos: set to 0
17    /// cmangos/mangoszero/vmangos: moveEvent, NUM_PMOVE_EVTS = 0x39
18    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        // guid: PackedGuid
30        let guid = crate::util::read_packed_guid(&mut r)?;
31
32        // move_event: u32
33        let move_event = crate::util::read_u32_le(&mut r)?;
34
35        // speed: f32
36        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        // Members
64        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        // guid: PackedGuid
96        crate::util::write_packed_guid(&self.guid, &mut w)?;
97
98        // move_event: u32
99        w.write_all(&self.move_event.to_le_bytes())?;
100
101        // speed: f32
102        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) // guid: PackedGuid
122        + 4 // move_event: u32
123        + 4 // speed: f32
124    }
125}
126