1use crate::types::{TeBeamPoints, TeBspDecal, TeTextMessage, TempEntity};
2
3use super::*;
4
5macro_rules! wrap_ent {
6 ($te:ident, $parser:ident, $input:ident, $aux:ident) => {{
7 let ($input, res) = $parser::parse($input, $aux)?;
8 ($input, TempEntity::$te(res))
9 }};
10}
11
12mod beam_points;
13mod bsp_decal;
14mod text_message;
15
16impl Doer for SvcTempEntity {
17 fn id(&self) -> u8 {
18 23
19 }
20
21 fn parse(i: &[u8], aux: AuxRefCell) -> Result<Self> {
22 let (i, entity_type) = le_u8(i)?;
23
24 let (i, entity) = match entity_type {
25 0 => wrap_ent!(TeBeamPoints, TeBeamPoints, i, aux),
26 1 => map(take(20usize), |res: &[u8]| {
27 TempEntity::TeBeamEntPoint(res.to_vec())
28 })(i)?,
29 2 => map(take(6usize), |res: &[u8]| {
30 TempEntity::TeGunshot(res.to_vec())
31 })(i)?,
32 3 => map(take(11usize), |res: &[u8]| {
34 TempEntity::TeExplosion(res.to_vec())
35 })(i)?,
36 4 => map(take(6usize), |res: &[u8]| {
37 TempEntity::TeTarExplosion(res.to_vec())
38 })(i)?,
39 5 => map(take(10usize), |res: &[u8]| {
40 TempEntity::TeSmoke(res.to_vec())
41 })(i)?,
42 6 => map(take(12usize), |res: &[u8]| {
43 TempEntity::TeTracer(res.to_vec())
44 })(i)?,
45 7 => map(take(17usize), |res: &[u8]| {
46 TempEntity::TeLightning(res.to_vec())
47 })(i)?,
48 8 => map(take(16usize), |res: &[u8]| {
49 TempEntity::TeBeamEnts(res.to_vec())
50 })(i)?,
51 9 => map(take(6usize), |res: &[u8]| {
52 TempEntity::TeSparks(res.to_vec())
53 })(i)?,
54 10 => map(take(6usize), |res: &[u8]| {
55 TempEntity::TeLavaSplash(res.to_vec())
56 })(i)?,
57 11 => map(take(6usize), |res: &[u8]| {
58 TempEntity::TeTeleport(res.to_vec())
59 })(i)?,
60 12 => map(take(8usize), |res: &[u8]| {
61 TempEntity::TeExplosion2(res.to_vec())
62 })(i)?,
63 13 => wrap_ent!(TeBspDecal, TeBspDecal, i, aux),
64 14 => map(take(9usize), |res: &[u8]| {
65 TempEntity::TeImplosion(res.to_vec())
66 })(i)?,
67 15 => map(take(19usize), |res: &[u8]| {
68 TempEntity::TeSpriteTrail(res.to_vec())
69 })(i)?,
70 17 => map(take(10usize), |res: &[u8]| {
71 TempEntity::TeSprite(res.to_vec())
72 })(i)?,
73 18 => map(take(16usize), |res: &[u8]| {
74 TempEntity::TeBeamSprite(res.to_vec())
75 })(i)?,
76 19 => map(take(24usize), |res: &[u8]| {
77 TempEntity::TeBeamTorus(res.to_vec())
78 })(i)?,
79 20 => map(take(24usize), |res: &[u8]| {
80 TempEntity::TeBeamDisk(res.to_vec())
81 })(i)?,
82 21 => map(take(24usize), |res: &[u8]| {
83 TempEntity::TeBeamCylinder(res.to_vec())
84 })(i)?,
85 22 => map(take(10usize), |res: &[u8]| {
86 TempEntity::TeBeamFollow(res.to_vec())
87 })(i)?,
88 23 => map(take(11usize), |res: &[u8]| {
89 TempEntity::TeGlowSprite(res.to_vec())
90 })(i)?,
91 24 => map(take(16usize), |res: &[u8]| {
92 TempEntity::TeBeamRing(res.to_vec())
93 })(i)?,
94 25 => map(take(19usize), |res: &[u8]| {
95 TempEntity::TeStreakSplash(res.to_vec())
96 })(i)?,
97 27 => map(take(12usize), |res: &[u8]| {
98 TempEntity::TeDLight(res.to_vec())
99 })(i)?,
100 28 => map(take(16usize), |res: &[u8]| {
101 TempEntity::TeELight(res.to_vec())
102 })(i)?,
103 29 => wrap_ent!(TeTextMessage, TeTextMessage, i, aux),
104 30 => map(take(17usize), |res: &[u8]| TempEntity::TeLine(res.to_vec()))(i)?,
105 31 => map(take(17usize), |res: &[u8]| TempEntity::TeBox(res.to_vec()))(i)?,
106 99 => map(take(2usize), |res: &[u8]| {
107 TempEntity::TeKillBeam(res.to_vec())
108 })(i)?,
109 100 => map(take(10usize), |res: &[u8]| {
110 TempEntity::TeLargeFunnel(res.to_vec())
111 })(i)?,
112 101 => map(take(14usize), |res: &[u8]| {
113 TempEntity::TeBloodStream(res.to_vec())
114 })(i)?,
115 102 => map(take(12usize), |res: &[u8]| {
116 TempEntity::TeShowLine(res.to_vec())
117 })(i)?,
118 103 => map(take(14usize), |res: &[u8]| {
119 TempEntity::TeBlood(res.to_vec())
120 })(i)?,
121 104 => map(take(9usize), |res: &[u8]| TempEntity::TeDecal(res.to_vec()))(i)?,
122 105 => map(take(5usize), |res: &[u8]| TempEntity::TeFizz(res.to_vec()))(i)?,
123 106 => map(take(17usize), |res: &[u8]| {
124 TempEntity::TeModel(res.to_vec())
125 })(i)?,
126 107 => map(take(13usize), |res: &[u8]| {
127 TempEntity::TeExplodeModel(res.to_vec())
128 })(i)?,
129 108 => map(take(24usize), |res: &[u8]| {
131 TempEntity::TeBreakModel(res.to_vec())
132 })(i)?,
133 109 => map(take(9usize), |res: &[u8]| {
134 TempEntity::TeGunshotDecal(res.to_vec())
135 })(i)?,
136 110 => map(take(17usize), |res: &[u8]| {
137 TempEntity::TeSpriteSpray(res.to_vec())
138 })(i)?,
139 111 => map(take(7usize), |res: &[u8]| {
140 TempEntity::TeArmorRicochet(res.to_vec())
141 })(i)?,
142 112 => map(take(10usize), |res: &[u8]| {
143 TempEntity::TePlayerDecal(res.to_vec())
144 })(i)?,
145 113 => map(take(10usize), |res: &[u8]| {
146 TempEntity::TeBubbles(res.to_vec())
147 })(i)?,
148 114 => map(take(19usize), |res: &[u8]| {
149 TempEntity::TeBubbleTrail(res.to_vec())
150 })(i)?,
151 115 => map(take(12usize), |res: &[u8]| {
152 TempEntity::TeBloodSprite(res.to_vec())
153 })(i)?,
154 116 => map(take(7usize), |res: &[u8]| {
155 TempEntity::TeWorldDecal(res.to_vec())
156 })(i)?,
157 117 => map(take(7usize), |res: &[u8]| {
158 TempEntity::TeWorldDecalHigh(res.to_vec())
159 })(i)?,
160 118 => map(take(9usize), |res: &[u8]| {
161 TempEntity::TeDecalHigh(res.to_vec())
162 })(i)?,
163 119 => map(take(16usize), |res: &[u8]| {
164 TempEntity::TeProjectile(res.to_vec())
165 })(i)?,
166 120 => map(take(18usize), |res: &[u8]| {
167 TempEntity::TeSpray(res.to_vec())
168 })(i)?,
169 121 => map(take(5usize), |res: &[u8]| {
170 TempEntity::TePlayerSprites(res.to_vec())
171 })(i)?,
172 122 => map(take(10usize), |res: &[u8]| {
173 TempEntity::TeParticleBurst(res.to_vec())
174 })(i)?,
175 123 => map(take(9usize), |res: &[u8]| {
176 TempEntity::TeFireField(res.to_vec())
177 })(i)?,
178 124 => map(take(7usize), |res: &[u8]| {
179 TempEntity::TePlayerAttachment(res.to_vec())
180 })(i)?,
181 125 => map(take(1usize), |res: &[u8]| {
182 TempEntity::TeKillPlayerAttachment(res.to_vec())
183 })(i)?,
184 126 => map(take(18usize), |res: &[u8]| {
186 TempEntity::TeMultigunShot(res.to_vec())
187 })(i)?,
188 127 => map(take(15usize), |res: &[u8]| {
189 TempEntity::TeUserTracer(res.to_vec())
190 })(i)?,
191 _ => context("Bad temp entity number", fail)(i)?,
192 };
193
194 Ok((
195 i,
196 Self {
197 entity_type,
198 entity,
199 },
200 ))
201 }
202
203 fn write(&self, aux: AuxRefCell) -> ByteVec {
204 let mut writer = ByteWriter::new();
205
206 writer.append_u8(self.id());
207 writer.append_u8(self.entity_type);
208
209 let bytes = match &self.entity {
210 TempEntity::TeBeamPoints(i) => &i.write(aux),
211 TempEntity::TeBeamEntPoint(i) => i,
212 TempEntity::TeGunshot(i) => i,
213 TempEntity::TeExplosion(i) => i,
214 TempEntity::TeTarExplosion(i) => i,
215 TempEntity::TeSmoke(i) => i,
216 TempEntity::TeTracer(i) => i,
217 TempEntity::TeLightning(i) => i,
218 TempEntity::TeBeamEnts(i) => i,
219 TempEntity::TeSparks(i) => i,
220 TempEntity::TeLavaSplash(i) => i,
221 TempEntity::TeTeleport(i) => i,
222 TempEntity::TeExplosion2(i) => i,
223 TempEntity::TeBspDecal(i) => &i.write(aux),
224 TempEntity::TeImplosion(i) => i,
225 TempEntity::TeSpriteTrail(i) => i,
226 TempEntity::TeSprite(i) => i,
227 TempEntity::TeBeamSprite(i) => i,
228 TempEntity::TeBeamTorus(i) => i,
229 TempEntity::TeBeamDisk(i) => i,
230 TempEntity::TeBeamCylinder(i) => i,
231 TempEntity::TeBeamFollow(i) => i,
232 TempEntity::TeGlowSprite(i) => i,
233 TempEntity::TeBeamRing(i) => i,
234 TempEntity::TeStreakSplash(i) => i,
235 TempEntity::TeDLight(i) => i,
236 TempEntity::TeELight(i) => i,
237 TempEntity::TeTextMessage(i) => &i.write(aux),
238 TempEntity::TeLine(i) => i,
239 TempEntity::TeBox(i) => i,
240 TempEntity::TeKillBeam(i) => i,
241 TempEntity::TeLargeFunnel(i) => i,
242 TempEntity::TeBloodStream(i) => i,
243 TempEntity::TeShowLine(i) => i,
244 TempEntity::TeBlood(i) => i,
245 TempEntity::TeDecal(i) => i,
246 TempEntity::TeFizz(i) => i,
247 TempEntity::TeModel(i) => i,
248 TempEntity::TeExplodeModel(i) => i,
249 TempEntity::TeBreakModel(i) => i,
250 TempEntity::TeGunshotDecal(i) => i,
251 TempEntity::TeSpriteSpray(i) => i,
252 TempEntity::TeArmorRicochet(i) => i,
253 TempEntity::TePlayerDecal(i) => i,
254 TempEntity::TeBubbles(i) => i,
255 TempEntity::TeBubbleTrail(i) => i,
256 TempEntity::TeBloodSprite(i) => i,
257 TempEntity::TeWorldDecal(i) => i,
258 TempEntity::TeWorldDecalHigh(i) => i,
259 TempEntity::TeDecalHigh(i) => i,
260 TempEntity::TeProjectile(i) => i,
261 TempEntity::TeSpray(i) => i,
262 TempEntity::TePlayerSprites(i) => i,
263 TempEntity::TeParticleBurst(i) => i,
264 TempEntity::TeFireField(i) => i,
265 TempEntity::TePlayerAttachment(i) => i,
266 TempEntity::TeKillPlayerAttachment(i) => i,
267 TempEntity::TeMultigunShot(i) => i,
268 TempEntity::TeUserTracer(i) => i,
269 };
270
271 writer.append_u8_slice(bytes);
272
273 writer.data
274 }
275}