pso2packetlib/protocol/
server.rs

1//! Server related packets. \[0x03\]
2use super::{HelperReadWrite, ObjectHeader, PacketReadWrite};
3use crate::{fixed_types::FixedBytes, AsciiString};
4
5// ----------------------------------------------------------------
6// Server packets
7// ----------------------------------------------------------------
8
9/// (0x03, 0x00) Map Transfer.
10///
11/// (S -> C) Sent when the client is being moved between zones (e.g. arks lobby <-> casino).
12///
13/// Respond with: [`crate::protocol::Packet::MapLoaded`]
14#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
15#[cfg_attr(feature = "serde", serde(default))]
16#[derive(Debug, Default, Clone, PartialEq, PacketReadWrite)]
17#[Id(0x03, 0x00)]
18pub struct MapTransferPacket {
19    /// Target zone object.
20    pub map: ObjectHeader,
21    /// Receiving player object.
22    pub target: ObjectHeader,
23    /// Target zone settings.
24    pub settings: ZoneSettings,
25}
26
27/// (0x03, 0x05) Move Quest Zone.
28///
29/// (C -> S) Sent when the player moves between quest zones.
30///
31/// Respond with: load zone map.
32#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
33#[cfg_attr(feature = "serde", serde(default))]
34#[derive(Debug, Default, Clone, PartialEq, PacketReadWrite)]
35#[Id(0x03, 0x05)]
36pub struct MoveZonePacket {
37    /// Current world object.
38    pub world: ObjectHeader,
39    /// ID of the zone that the player is currently in.
40    pub current_zone_id: u32,
41    /// Interacted "door" ID.
42    pub door_id: u32,
43}
44
45/// (0x03, 0x06) Unknown.
46///
47/// (S -> C)
48#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
49#[cfg_attr(feature = "serde", serde(default))]
50#[derive(Debug, Default, Clone, PartialEq, PacketReadWrite)]
51#[Id(0x03, 0x06)]
52pub struct Unk0306Packet {
53    pub unk: [u8; 0xC],
54}
55
56/// (0x03, 0x08) Server Hello.
57///
58/// (S -> C) Sent when the client connects to the block server.
59///
60/// Respond with: [`crate::protocol::Packet::EncryptionRequest`].
61#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
62#[cfg_attr(feature = "serde", serde(default))]
63#[derive(Debug, Default, Clone, PartialEq, PacketReadWrite)]
64#[Id(0x03, 0x08)]
65pub struct ServerHelloPacket {
66    /// Unknown. Seems to be always 0x03.
67    pub unk1: u16,
68    #[SeekAfter(4)]
69    /// Block Id.
70    pub blockid: u16,
71    pub unk2: u32,
72}
73
74/// (0x03, 0x10) Map Loading Finished.
75///
76/// (C -> S) Sent when the client has finished loading the map.
77///
78/// Response to:
79/// [`crate::protocol::Packet::MapTransfer`] or
80/// [`crate::protocol::Packet::LoadLevel`].
81///
82/// Respond with:
83/// user data,
84/// object spawn packets,
85/// [`crate::protocol::Packet::UnlockControls`] and
86/// [`crate::protocol::Packet::FinishLoading`].
87#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
88#[cfg_attr(feature = "serde", serde(default))]
89#[derive(Debug, Default, Clone, PartialEq, PacketReadWrite)]
90#[Id(0x03, 0x10)]
91pub struct MapLoadedPacket {
92    /// Loaded zone object.
93    pub map_object: ObjectHeader,
94    pub unk: [u8; 0x20],
95}
96
97/// (0x03, 0x11) Move Campship -> Quest Level (selected area).
98///
99/// (C -> S) Sent when the client wants to move to the quest level with specified area.
100///
101/// Respond with: load quest map.
102#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
103#[cfg_attr(feature = "serde", serde(default))]
104#[derive(Debug, Default, Clone, PartialEq, PacketReadWrite)]
105#[Id(0x03, 0x11)]
106pub struct CampshipDownAreaPacket {
107    pub world: ObjectHeader,
108    pub unk4: u32,
109    pub area: u32,
110}
111
112/// (0x03, 0x12) Move Lobby -> Campship.
113///
114/// (C -> S) Sent when the client wants to move to campship.
115///
116/// Respond with: load campship map.
117#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
118#[cfg_attr(feature = "serde", serde(default))]
119#[derive(Debug, Default, Clone, PartialEq, PacketReadWrite)]
120#[Id(0x03, 0x12)]
121pub struct ToCampshipPacket {
122    pub world: ObjectHeader,
123    pub unk4: u32,
124}
125
126/// (0x03, 0x16) Move Campship -> Quest Level.
127///
128/// (C -> S) Sent when the client wants to move to the quest level.
129///
130/// Respond with: load quest map.
131#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
132#[cfg_attr(feature = "serde", serde(default))]
133#[derive(Debug, Default, Clone, PartialEq, PacketReadWrite)]
134#[Id(0x03, 0x16)]
135pub struct CampshipDownPacket {
136    pub world: ObjectHeader,
137    pub unk4: u32,
138}
139
140/// (0x03, 0x17) Move Quest Level -> Campship.
141///
142/// (C -> S) Sent when the player interacts with the spawn telepipe
143/// during the quest.
144///
145/// Respond with: load campship map.
146#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
147#[cfg_attr(feature = "serde", serde(default))]
148#[derive(Debug, Default, Clone, PartialEq, PacketReadWrite)]
149#[Id(0x03, 0x17)]
150pub struct ReturnToCampshipPacket {
151    pub world: ObjectHeader,
152}
153
154/// (0x03, 0x19) Move Quest Level Finish -> Campship.
155///
156/// (C -> S) Sent when the player finishes the quest and interacts with the telepipe.
157///
158/// Respond with: load campship map.
159#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
160#[cfg_attr(feature = "serde", serde(default))]
161#[derive(Debug, Default, Clone, PartialEq, PacketReadWrite)]
162#[Id(0x03, 0x19)]
163pub struct ReturnToCampshipFinalPacket {
164    pub world: ObjectHeader,
165}
166
167/// (0x03, 0x1A) Move Quest Level Death -> Campship.
168///
169/// (C -> S) Sent when the player dies and selects to teleport to campship
170///
171/// Respond with: load campship map.
172#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
173#[cfg_attr(feature = "serde", serde(default))]
174#[derive(Debug, Default, Clone, PartialEq, PacketReadWrite)]
175#[Id(0x03, 0x1A)]
176pub struct DeathToCampshipPacket {
177    pub world: ObjectHeader,
178}
179
180/// (0x03, 0x1C) Move Campship -> Lobby.
181///
182/// (C -> S) Sent when the client wants to move to the lobby from campship.
183///
184/// Respond with: load lobby map.
185#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
186#[cfg_attr(feature = "serde", serde(default))]
187#[derive(Debug, Default, Clone, PartialEq, PacketReadWrite)]
188#[Id(0x03, 0x1C)]
189pub struct CampshipToLobbyPacket {
190    pub world: ObjectHeader,
191}
192
193/// (0x03, 0x24) Load Level.
194///
195/// (S -> C) Sent when the client is moved to a new map. (e.g. lobby <-> campship)
196///
197/// Respond with: [`crate::protocol::Packet::MapLoaded`]
198///
199/// Followed by: [`crate::protocol::Packet::SetPlayerID`]
200#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
201#[cfg_attr(feature = "serde", serde(default))]
202#[derive(Debug, Default, Clone, PartialEq, PacketReadWrite)]
203#[Id(0x03, 0x24)]
204#[Flags(Flags::PACKED)]
205#[Magic(0x7542, 0x5E)]
206pub struct LoadLevelPacket {
207    /// Initial zone object.
208    pub map_object: ObjectHeader,
209    /// Host player.
210    pub host: ObjectHeader,
211    /// Settings for the initial zone (i.e. first zone that the player will appear in).
212    pub settings: ZoneSettings,
213    pub world_obj: ObjectHeader,
214    pub quest: ObjectHeader,
215    pub party: ObjectHeader,
216    pub unk7: AsciiString,
217    /// Settings for other zones.
218    pub other_settings: Vec<ZoneSettings>,
219    pub warps: Vec<WarpInfo>,
220    pub unk10: Vec<LoadLevelThing3>,
221    pub unk11: Vec<LoadLevelThing4>,
222    pub unk12: Vec<LoadLevelThing5>,
223    pub unk13: Vec<LoadLevelThing6>,
224    pub unk14: Vec<LoadLevelThing7>,
225    pub unk15: Vec<LoadLevelThing8>,
226    pub unk16: Vec<UnkThing1>,
227    pub unk17: AsciiString,
228    pub unk18: u32,
229    pub unk19: u32,
230    pub unk20: u32,
231    pub unk21: FixedBytes<0x3C>,
232    pub unk22: u32,
233    pub unk23: [u8; 0x10],
234    pub unk24: [u8; 0x10],
235    pub unk25: Vec<u32>,
236    pub unk26: FixedBytes<0x200>,
237    pub unk27: Vec<UnkThing2>,
238    pub unk28: AsciiString,
239    pub unk29: AsciiString,
240    pub unk30: u64,
241    pub unk31: u64,
242    pub unk32: u8,
243    pub unk33: u8,
244    pub unk34: u8,
245    pub unk35: u8,
246    pub unk36: u32,
247    pub unk37: [u8; 0x14],
248    pub unk38: u64,
249    pub unk39: u32,
250    pub unk40: u32,
251    pub unk41: [u8; 0x12],
252    pub unk42: u64,
253    pub unk43: u8,
254    pub unk44: u8,
255    pub unk45: Vec<LoadLevelThing9>,
256    pub unk46: AsciiString,
257    pub unk47: Vec<LoadLevelThing10>,
258    pub unk48: u32,
259    pub unk49: [u8; 0x14],
260    pub unk50: [u8; 0x14],
261    pub unk51: u32,
262}
263
264/// (0x03, 0x34) Move Casino -> Lobby.
265///
266/// (C -> S) Sent when the client wants to move from casino to lobby.
267///
268/// Respond with: load lobby map.
269#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
270#[cfg_attr(feature = "serde", serde(default))]
271#[derive(Debug, Default, Clone, PartialEq, PacketReadWrite)]
272#[Id(0x03, 0x34)]
273pub struct CasinoToLobbyPacket {
274    pub unk1: u32,
275    pub unk2: u32,
276    pub unk3: u32,
277    pub unk4: u32,
278}
279
280/// (0x03, 0x35) Move Lobby -> Casino.
281///
282/// (C -> S) Sent when the client wants to move from lobby to casino.
283///
284/// Respond with: load casino map.
285#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
286#[cfg_attr(feature = "serde", serde(default))]
287#[derive(Debug, Default, Clone, PartialEq, PacketReadWrite)]
288#[Id(0x03, 0x35)]
289pub struct CasinoTransportPacket {
290    pub unk1: u32,
291    pub unk2: u32,
292    pub unk3: u32,
293}
294
295/// (0x03, 0x38) Move Bridge -> Lobby.
296///
297/// (C -> S) Sent when the client wants to move from bridge to lobby.
298///
299/// Respond with: load lobby map.
300#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
301#[cfg_attr(feature = "serde", serde(default))]
302#[derive(Debug, Default, Clone, PartialEq, PacketReadWrite)]
303#[Id(0x03, 0x38)]
304pub struct BridgeToLobbyPacket {
305    pub unk1: u32,
306    pub unk2: u32,
307    pub unk3: u32,
308    pub zone_id: u32,
309    pub unk4: u32,
310}
311
312/// (0x03, 0x39) Move Lobby -> Bridge.
313///
314/// (C -> S) Sent when the client wants to move from lobby to bridge.
315///
316/// Respond with: load bridge map.
317#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
318#[cfg_attr(feature = "serde", serde(default))]
319#[derive(Debug, Default, Clone, PartialEq, PacketReadWrite)]
320#[Id(0x03, 0x39)]
321pub struct BridgeTransportPacket {
322    pub unk1: u32,
323    pub unk2: u32,
324    pub unk3: u32,
325}
326
327/// (0x03, 0x3B) Move Cafe -> Lobby.
328///
329/// (C -> S) Sent when the client wants to move from cafe to lobby.
330///
331/// Respond with: load lobby map.
332#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
333#[cfg_attr(feature = "serde", serde(default))]
334#[derive(Debug, Default, Clone, PartialEq, PacketReadWrite)]
335#[Id(0x03, 0x3B)]
336pub struct CafeToLobbyPacket {
337    pub unk1: u32,
338    pub unk2: u32,
339    pub unk3: u32,
340    pub zone_id: u32,
341    pub unk4: u32,
342}
343
344/// (0x03, 0x3C) Move Lobby -> Cafe.
345///
346/// (C -> S) Sent when the client wants to move from lobby to cafe.
347///
348/// Respond with: load cafe map.
349#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
350#[cfg_attr(feature = "serde", serde(default))]
351#[derive(Debug, Default, Clone, PartialEq, PacketReadWrite)]
352#[Id(0x03, 0x3C)]
353pub struct CafeTransportPacket {
354    pub unk1: u32,
355    pub unk2: u32,
356    pub unk3: u32,
357}
358
359/// (0x03, 0x41) Move Story Quest Selection -> Lobby.
360///
361/// (C -> S) Sent when the client wants to move from the story quest selection screen
362/// to lobby.
363///
364/// Respond with: load lobby map.
365#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
366#[cfg_attr(feature = "serde", serde(default))]
367#[derive(Debug, Default, Clone, PartialEq, PacketReadWrite)]
368#[Id(0x03, 0x41)]
369pub struct StoryToLobbyPacket {
370    pub unk1: u32,
371    pub unk2: u32,
372    pub unk3: u32,
373}
374
375// ----------------------------------------------------------------
376// Additional structs
377// ----------------------------------------------------------------
378
379/// Settings for map zone.
380#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
381#[cfg_attr(feature = "serde", serde(default))]
382#[derive(Debug, Default, Clone, PartialEq, HelperReadWrite)]
383pub struct ZoneSettings {
384    pub world_id: u32,
385    pub unk1: u32,
386    pub zone_id: u32,
387    /// Map layout id.
388    pub map_id: u32,
389    pub zone_type: u32,
390    pub seed: u32,
391    pub args: u32,
392    pub size_x: u32,
393    pub size_y: u32,
394    pub unk2: u32,
395    pub area_index: u32,
396    pub sub_area: u32,
397    pub unk3: u32,
398}
399#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
400#[cfg_attr(feature = "serde", serde(default))]
401#[derive(Debug, Default, Clone, PartialEq, HelperReadWrite)]
402pub struct WarpInfo {
403    pub unk1: u32,
404    pub zone_id: u32,
405    pub door_id: u32,
406    pub dest_zone: u32,
407    pub backdoor_id: u32,
408}
409#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
410#[cfg_attr(feature = "serde", serde(default))]
411#[derive(Debug, Default, Clone, PartialEq, HelperReadWrite)]
412pub struct LoadLevelThing3 {
413    pub unk1: u32,
414    pub unk2: u32,
415}
416#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
417#[cfg_attr(feature = "serde", serde(default))]
418#[derive(Debug, Default, Clone, PartialEq, HelperReadWrite)]
419pub struct LoadLevelThing4 {
420    pub unk1: u32,
421    pub unk2: u32,
422    pub unk3: u32,
423    pub unk4: u32,
424    pub unk5: u32,
425    pub unk6: u32,
426    pub unk7: u32,
427    pub unk8: u32,
428    pub unk9: u32,
429    pub unk10: u32,
430    pub unk11: u32,
431    pub unk12: u32,
432    pub unk13: u32,
433    pub unk14: u32,
434    pub unk15: u32,
435    pub unk16: u32,
436    pub unk17: u32,
437    pub unk18: u32,
438    pub unk19: u32,
439    pub unk20: u32,
440    pub unk21: u32,
441    pub unk22: u32,
442    pub unk23: u32,
443    pub unk24: u32,
444    pub unk25: u32,
445    pub unk26: u32,
446    pub unk27: u32,
447    pub unk28: u32,
448    pub unk29: u32,
449    pub unk30: u32,
450    pub unk31: u32,
451    pub unk32: u32,
452    pub unk33: u32,
453    pub unk34: u32,
454}
455#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
456#[cfg_attr(feature = "serde", serde(default))]
457#[derive(Debug, Default, Clone, PartialEq, HelperReadWrite)]
458pub struct LoadLevelThing5 {
459    pub unk1: u32,
460    pub unk2: u32,
461    pub unk3: u32,
462    pub unk4: u32,
463    pub unk5: u32,
464    pub unk6: u32,
465    pub unk7: u32,
466    pub unk8: u32,
467    pub unk9: u32,
468    pub unk10: u32,
469    pub unk11: u32,
470    pub unk12: u32,
471    pub unk13: u32,
472    pub unk14: u32,
473    pub unk15: u32,
474    pub unk16: u32,
475    pub unk17: u32,
476    pub unk18: u32,
477    pub unk19: u32,
478    pub unk20: u32,
479    pub unk21: u32,
480    pub unk22: u32,
481    pub unk23: u32,
482    pub unk24: u32,
483    pub unk25: u32,
484    pub unk26: u32,
485    pub unk27: u32,
486    pub unk28: u32,
487    pub unk29: u32,
488    pub unk30: u32,
489    pub unk31: u32,
490    pub unk32: u32,
491    pub unk33: u32,
492    pub unk34: u32,
493    pub unk35: u32,
494    pub unk36: u32,
495    pub unk37: u32,
496    pub unk38: u32,
497    pub unk39: u32,
498    pub unk40: u32,
499    pub unk41: u32,
500    pub unk42: u32,
501    pub unk43: u32,
502    pub unk44: u32,
503    pub unk45: u32,
504    pub unk46: u32,
505    pub unk47: u32,
506    pub unk48: u32,
507    pub unk49: u32,
508    pub unk50: u32,
509    pub unk51: u32,
510    pub unk52: u32,
511    pub unk53: u32,
512    pub unk54: u32,
513    pub unk55: u32,
514    pub unk56: u32,
515}
516#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
517#[cfg_attr(feature = "serde", serde(default))]
518#[derive(Debug, Default, Clone, PartialEq, HelperReadWrite)]
519pub struct LoadLevelThing6 {
520    pub unk1: u32,
521    pub unk2: u32,
522    pub unk3: u32,
523    pub unk4: u32,
524    pub unk5: u32,
525    pub unk6: u32,
526    pub unk7: u32,
527    pub unk8: u32,
528    pub unk9: u32,
529    pub unk10: u32,
530    pub unk11: u32,
531    pub unk12: u32,
532    pub unk13: u32,
533    pub unk14: u32,
534    pub unk15: u32,
535    pub unk16: u32,
536    pub unk17: u32,
537    pub unk18: u32,
538    pub unk19: u32,
539    pub unk20: u32,
540    pub unk21: u32,
541    pub unk22: u32,
542    pub unk23: u32,
543    pub unk24: u32,
544    pub unk25: u32,
545    pub unk26: u32,
546    pub unk27: u32,
547    pub unk28: u32,
548    pub unk29: u32,
549    pub unk30: u32,
550    pub unk31: u32,
551    pub unk32: u32,
552    pub unk33: u32,
553    pub unk34: u32,
554    pub unk35: u32,
555    pub unk36: u32,
556    pub unk37: u32,
557    pub unk38: u32,
558    pub unk39: u32,
559    pub unk40: u32,
560}
561#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
562#[cfg_attr(feature = "serde", serde(default))]
563#[derive(Debug, Default, Clone, PartialEq, HelperReadWrite)]
564pub struct LoadLevelThing7 {
565    pub unk1: u32,
566    pub unk2: u32,
567    pub unk3: u32,
568    pub unk4: u32,
569    pub unk5: u32,
570    pub unk6: u32,
571    pub unk7: u32,
572    pub unk8: u32,
573    pub unk9: u32,
574    pub unk10: u32,
575    pub unk11: u32,
576    pub unk12: u32,
577    pub unk13: u32,
578    pub unk14: u32,
579    pub unk15: u32,
580    pub unk16: u32,
581    pub unk17: u32,
582    pub unk18: u32,
583    pub unk19: u32,
584    pub unk20: u32,
585    pub unk21: u32,
586    pub unk22: u32,
587    pub unk23: u32,
588    pub unk24: u32,
589    pub unk25: u32,
590    pub unk26: u32,
591    pub unk27: u32,
592    pub unk28: u32,
593    pub unk29: u32,
594    pub unk30: u32,
595    pub unk31: u32,
596    pub unk32: u32,
597    pub unk33: u32,
598    pub unk34: u32,
599    pub unk35: u32,
600    pub unk36: u32,
601    pub unk37: u32,
602    pub unk38: u32,
603    pub unk39: u32,
604    pub unk40: u32,
605    pub unk41: u32,
606    pub unk42: u32,
607    pub unk43: u32,
608    pub unk44: u32,
609    pub unk45: u32,
610    pub unk46: u32,
611    pub unk47: u32,
612    pub unk48: u32,
613    pub unk49: u32,
614    pub unk50: u32,
615    pub unk51: u32,
616    pub unk52: u32,
617    pub unk53: u32,
618    pub unk54: u32,
619    pub unk55: u32,
620    pub unk56: u32,
621    pub unk57: u32,
622    pub unk58: u32,
623    pub unk59: u32,
624    pub unk60: u32,
625}
626#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
627#[cfg_attr(feature = "serde", serde(default))]
628#[derive(Debug, Default, Clone, PartialEq, HelperReadWrite)]
629pub struct LoadLevelThing8 {
630    pub unk1: u32,
631    pub unk2: u32,
632    pub unk3: u32,
633    pub unk4: u32,
634    pub unk5: u32,
635    pub unk6: u32,
636    pub unk7: u32,
637    pub unk8: u32,
638    pub unk9: u32,
639    pub unk10: u32,
640    pub unk11: u32,
641    pub unk12: u32,
642    pub unk13: u32,
643    pub unk14: u32,
644    pub unk15: u32,
645    pub unk16: u32,
646    pub unk17: u32,
647    pub unk18: u32,
648    pub unk19: u32,
649    pub unk20: u32,
650    pub unk21: u32,
651    pub unk22: u32,
652    pub unk23: u32,
653    pub unk24: u32,
654    pub unk25: u32,
655    pub unk26: u32,
656    pub unk27: u32,
657    pub unk28: u32,
658    pub unk29: u32,
659    pub unk30: u32,
660    pub unk31: u32,
661    pub unk32: u32,
662    pub unk33: u32,
663    pub unk34: u32,
664    pub unk35: u32,
665    pub unk36: u32,
666    pub unk37: u32,
667    pub unk38: u32,
668    pub unk39: u32,
669    pub unk40: u32,
670    pub unk41: u32,
671}
672#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
673#[cfg_attr(feature = "serde", serde(default))]
674#[derive(Debug, Default, Clone, PartialEq, HelperReadWrite)]
675pub struct LoadLevelThing9 {
676    pub unk1: u32,
677    pub unk2: u32,
678}
679#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
680#[cfg_attr(feature = "serde", serde(default))]
681#[derive(Debug, Default, Clone, PartialEq, HelperReadWrite)]
682pub struct LoadLevelThing10 {
683    pub unk1: u32,
684    pub unk2: u32,
685    pub unk3: u32,
686    pub unk4: u32,
687    pub unk5: u32,
688    pub unk6: u32,
689    pub unk7: u32,
690    pub unk8: u32,
691    pub unk9: u32,
692    pub unk10: u32,
693    pub unk11: u32,
694    pub unk12: u32,
695    pub unk13: u32,
696}
697#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
698#[cfg_attr(feature = "serde", serde(default))]
699#[derive(Debug, Default, Clone, PartialEq, HelperReadWrite)]
700pub struct UnkThing1 {
701    pub unk1: u32,
702    pub unk2: u32,
703    pub unk3: u32,
704    pub unk4: u32,
705    pub unk5: u32,
706    pub unk6: u32,
707    pub unk7: u32,
708    pub unk8: u32,
709    pub unk9: u32,
710    pub unk10: u32,
711}
712#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
713#[cfg_attr(feature = "serde", serde(default))]
714#[derive(Debug, Default, Clone, PartialEq, HelperReadWrite)]
715pub struct UnkThing2 {
716    pub unk1: u32,
717    pub unk2: u32,
718}