1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
use std::io::{Read, Write};
use crate::tbc::{
Skill, TrainerSpellState,
};
/// Auto generated from the original `wowm` in file [`wow_message_parser/wowm/world/spell/smsg_trainer_list.wowm:9`](https://github.com/gtker/wow_messages/tree/main/wow_message_parser/wowm/world/spell/smsg_trainer_list.wowm#L9):
/// ```text
/// struct TrainerSpell {
/// Spell spell;
/// TrainerSpellState state;
/// u32 spell_cost;
/// u32 talent_point_cost;
/// u32 first_rank;
/// u8 required_level;
/// (u32)Skill required_skill;
/// u32 required_skill_value;
/// u32[3] required_spells;
/// }
/// ```
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Default)]
pub struct TrainerSpell {
/// cmangos: learned spell (or cast-spell in profession case)
pub spell: u32,
pub state: TrainerSpellState,
pub spell_cost: u32,
/// cmangos: spells don't cost talent points
/// cmangos: set to 0
pub talent_point_cost: u32,
/// cmangos: must be equal prev. field to have learn button in enabled state
/// cmangos: 1 for true 0 for false
pub first_rank: u32,
pub required_level: u8,
pub required_skill: Skill,
pub required_skill_value: u32,
pub required_spells: [u32; 3],
}
impl TrainerSpell {
pub(crate) fn write_into_vec(&self, mut w: impl Write) -> Result<(), std::io::Error> {
// spell: Spell
w.write_all(&self.spell.to_le_bytes())?;
// state: TrainerSpellState
w.write_all(&(self.state.as_int().to_le_bytes()))?;
// spell_cost: u32
w.write_all(&self.spell_cost.to_le_bytes())?;
// talent_point_cost: u32
w.write_all(&self.talent_point_cost.to_le_bytes())?;
// first_rank: u32
w.write_all(&self.first_rank.to_le_bytes())?;
// required_level: u8
w.write_all(&self.required_level.to_le_bytes())?;
// required_skill: Skill
w.write_all(&u32::from(self.required_skill.as_int()).to_le_bytes())?;
// required_skill_value: u32
w.write_all(&self.required_skill_value.to_le_bytes())?;
// required_spells: u32[3]
for i in self.required_spells.iter() {
w.write_all(&i.to_le_bytes())?;
}
Ok(())
}
}
impl TrainerSpell {
pub(crate) fn read<R: std::io::Read>(mut r: R) -> Result<Self, crate::errors::ParseErrorKind> {
// spell: Spell
let spell = crate::util::read_u32_le(&mut r)?;
// state: TrainerSpellState
let state = crate::util::read_u8_le(&mut r)?.try_into()?;
// spell_cost: u32
let spell_cost = crate::util::read_u32_le(&mut r)?;
// talent_point_cost: u32
let talent_point_cost = crate::util::read_u32_le(&mut r)?;
// first_rank: u32
let first_rank = crate::util::read_u32_le(&mut r)?;
// required_level: u8
let required_level = crate::util::read_u8_le(&mut r)?;
// required_skill: Skill
let required_skill = (crate::util::read_u32_le(&mut r)? as u16).try_into()?;
// required_skill_value: u32
let required_skill_value = crate::util::read_u32_le(&mut r)?;
// required_spells: u32[3]
let required_spells = {
let mut required_spells = [u32::default(); 3];
for i in required_spells.iter_mut() {
*i = crate::util::read_u32_le(&mut r)?;
}
required_spells
};
Ok(Self {
spell,
state,
spell_cost,
talent_point_cost,
first_rank,
required_level,
required_skill,
required_skill_value,
required_spells,
})
}
}