dem/netmsg_doer/temp_entity/
mod.rs

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            // The docs say 6 but its parser says 11.
33            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            // Docs say 13 but its parser says 24.
130            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            // Docs say 10 but its parser says 18.
185            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}