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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
/* This file is automatically generated by packets.clj
Do not manually edit this file, if you wish to make
changes here, then edit and rerun packets.clj */

/// Represents a single packet
#[derive(Debug, PartialEq, Clone)]
pub enum ClientboundPacket {
    StatusResponse(StatusResponse),
    StatusPong(StatusPong),
    LoginDisconnect(LoginDisconnect),
    EncryptionRequest(EncryptionRequest),
    LoginSuccess(LoginSuccess),
    SetCompression(SetCompression),
    LoginPluginRequest(LoginPluginRequest),
    SpawnObject(SpawnObject),
    SpawnExperienceOrb(SpawnExperienceOrb),
    SpawnGlobalEntity(SpawnGlobalEntity),
    SpawnMob(SpawnMob),
    SpawnPainting(SpawnPainting),
    SpawnPlayer(SpawnPlayer),
    ClientboundAnimation(ClientboundAnimation),
    Statistics(Statistics),
    BlockBreakAnimation(BlockBreakAnimation),
    UpdateBlockEntity(UpdateBlockEntity),
    BlockAction(BlockAction),
    BlockChange(BlockChange),
    BossBar(BossBar),
    ServerDifficulty(ServerDifficulty),
    ChatMessage(ChatMessage),
    MultiBlockChange(MultiBlockChange),
    ClientboundTabComplete(ClientboundTabComplete),
    DeclareCommands(DeclareCommands),
    ClientboundConfirmTransaction(ClientboundConfirmTransaction),
    ClientboundCloseWindow(ClientboundCloseWindow),
    OpenWindow(OpenWindow),
    WindowItems(WindowItems),
    WindowProperty(WindowProperty),
    SetSlot(SetSlot),
    SetCooldown(SetCooldown),
    ClientboundPluginMessage(ClientboundPluginMessage),
    NamedSoundEffect(NamedSoundEffect),
    PlayDisconnect(PlayDisconnect),
    EntityStatus(EntityStatus),
    NBTQueryResponse(NBTQueryResponse),
    Explosion(Explosion),
    UnloadChunk(UnloadChunk),
    ChangeGameState(ChangeGameState),
    KeepAlive(KeepAlive),
    ChunkData(ChunkData),
    Effect(Effect),
    Particle(Particle),
    JoinGame(JoinGame),
    Map(Map),
    Entity(Entity),
    EntityRelativeMove(EntityRelativeMove),
    EntityLookRelativeMove(EntityLookRelativeMove),
    EntityLook(EntityLook),
    ClientboundVehicleMove(ClientboundVehicleMove),
    OpenSignEditor(OpenSignEditor),
    CraftRecipeResponse(CraftRecipeResponse),
    PlayerAbilities(PlayerAbilities),
    CombatEvent(CombatEvent),
    PlayerListItem(PlayerListItem),
    FacePlayer(FacePlayer),
    PlayerPositionAndLook(PlayerPositionAndLook),
    UseBed(UseBed),
    UnlockRecipes(UnlockRecipes),
    DestroyEntities(DestroyEntities),
    RemoveEntityEffect(RemoveEntityEffect),
    ResourcePackSend(ResourcePackSend),
    Respawn(Respawn),
    EntityHeadLook(EntityHeadLook),
    SelectAdvancementTab(SelectAdvancementTab),
    WorldBorder(WorldBorder),
    Camera(Camera),
    ClientboundHeldItemChange(ClientboundHeldItemChange),
    DisplayScoreboard(DisplayScoreboard),
    EntityMetadata(EntityMetadata),
    AttachEntity(AttachEntity),
    EntityVelocity(EntityVelocity),
    EntityEquipment(EntityEquipment),
    SetExperience(SetExperience),
    UpdateHealth(UpdateHealth),
    ScoreboardObjective(ScoreboardObjective),
    SetPassengers(SetPassengers),
    Teams(Teams),
    UpdateScore(UpdateScore),
    SpawnPosition(SpawnPosition),
    TimeUpdate(TimeUpdate),
    Title(Title),
    StopSound(StopSound),
    SoundEffect(SoundEffect),
    PlayerListHeaderFooter(PlayerListHeaderFooter),
    CollectItem(CollectItem),
    EntityTeleport(EntityTeleport),
    Advancements(Advancements),
    EntityProperties(EntityProperties),
    EntityEffect(EntityEffect),
    DeclareRecipes(DeclareRecipes),
    Tags(Tags),

}

impl Packet for ClientboundPacket {
    fn deserialize<R: Read>(r: &mut R, state: &ClientState) -> Result<Self> {
        let packet_id = read_varint(r)?;
        match state {
        &ClientState::Handshake => {
            Err("No packet available in this state".into())

        },
        &ClientState::Status => {
            match packet_id {
            0 => Ok(StatusResponse::deserialize(r)?),
            1 => Ok(StatusPong::deserialize(r)?),

            _ => bail!("No packet with id {} in state {}", packet_id, state),
            }
        },
        &ClientState::Login => {
            match packet_id {
            0 => Ok(LoginDisconnect::deserialize(r)?),
            1 => Ok(EncryptionRequest::deserialize(r)?),
            2 => Ok(LoginSuccess::deserialize(r)?),
            3 => Ok(SetCompression::deserialize(r)?),
            4 => Ok(LoginPluginRequest::deserialize(r)?),

            _ => bail!("No packet with id {} in state {}", packet_id, state),
            }
        },
        &ClientState::Play => {
            match packet_id {
            0 => Ok(SpawnObject::deserialize(r)?),
            1 => Ok(SpawnExperienceOrb::deserialize(r)?),
            2 => Ok(SpawnGlobalEntity::deserialize(r)?),
            3 => Ok(SpawnMob::deserialize(r)?),
            4 => Ok(SpawnPainting::deserialize(r)?),
            5 => Ok(SpawnPlayer::deserialize(r)?),
            6 => Ok(ClientboundAnimation::deserialize(r)?),
            7 => Ok(Statistics::deserialize(r)?),
            8 => Ok(BlockBreakAnimation::deserialize(r)?),
            9 => Ok(UpdateBlockEntity::deserialize(r)?),
            10 => Ok(BlockAction::deserialize(r)?),
            11 => Ok(BlockChange::deserialize(r)?),
            12 => Ok(BossBar::deserialize(r)?),
            13 => Ok(ServerDifficulty::deserialize(r)?),
            14 => Ok(ChatMessage::deserialize(r)?),
            15 => Ok(MultiBlockChange::deserialize(r)?),
            16 => Ok(ClientboundTabComplete::deserialize(r)?),
            17 => Ok(DeclareCommands::deserialize(r)?),
            18 => Ok(ClientboundConfirmTransaction::deserialize(r)?),
            19 => Ok(ClientboundCloseWindow::deserialize(r)?),
            20 => Ok(OpenWindow::deserialize(r)?),
            21 => Ok(WindowItems::deserialize(r)?),
            22 => Ok(WindowProperty::deserialize(r)?),
            23 => Ok(SetSlot::deserialize(r)?),
            24 => Ok(SetCooldown::deserialize(r)?),
            25 => Ok(ClientboundPluginMessage::deserialize(r)?),
            26 => Ok(NamedSoundEffect::deserialize(r)?),
            27 => Ok(PlayDisconnect::deserialize(r)?),
            28 => Ok(EntityStatus::deserialize(r)?),
            29 => Ok(NBTQueryResponse::deserialize(r)?),
            30 => Ok(Explosion::deserialize(r)?),
            31 => Ok(UnloadChunk::deserialize(r)?),
            32 => Ok(ChangeGameState::deserialize(r)?),
            33 => Ok(KeepAlive::deserialize(r)?),
            34 => Ok(ChunkData::deserialize(r)?),
            35 => Ok(Effect::deserialize(r)?),
            36 => Ok(Particle::deserialize(r)?),
            37 => Ok(JoinGame::deserialize(r)?),
            38 => Ok(Map::deserialize(r)?),
            39 => Ok(Entity::deserialize(r)?),
            40 => Ok(EntityRelativeMove::deserialize(r)?),
            41 => Ok(EntityLookRelativeMove::deserialize(r)?),
            42 => Ok(EntityLook::deserialize(r)?),
            43 => Ok(ClientboundVehicleMove::deserialize(r)?),
            44 => Ok(OpenSignEditor::deserialize(r)?),
            45 => Ok(CraftRecipeResponse::deserialize(r)?),
            46 => Ok(PlayerAbilities::deserialize(r)?),
            47 => Ok(CombatEvent::deserialize(r)?),
            48 => Ok(PlayerListItem::deserialize(r)?),
            49 => Ok(FacePlayer::deserialize(r)?),
            50 => Ok(PlayerPositionAndLook::deserialize(r)?),
            51 => Ok(UseBed::deserialize(r)?),
            52 => Ok(UnlockRecipes::deserialize(r)?),
            53 => Ok(DestroyEntities::deserialize(r)?),
            54 => Ok(RemoveEntityEffect::deserialize(r)?),
            55 => Ok(ResourcePackSend::deserialize(r)?),
            56 => Ok(Respawn::deserialize(r)?),
            57 => Ok(EntityHeadLook::deserialize(r)?),
            58 => Ok(SelectAdvancementTab::deserialize(r)?),
            59 => Ok(WorldBorder::deserialize(r)?),
            60 => Ok(Camera::deserialize(r)?),
            61 => Ok(ClientboundHeldItemChange::deserialize(r)?),
            62 => Ok(DisplayScoreboard::deserialize(r)?),
            63 => Ok(EntityMetadata::deserialize(r)?),
            64 => Ok(AttachEntity::deserialize(r)?),
            65 => Ok(EntityVelocity::deserialize(r)?),
            66 => Ok(EntityEquipment::deserialize(r)?),
            67 => Ok(SetExperience::deserialize(r)?),
            68 => Ok(UpdateHealth::deserialize(r)?),
            69 => Ok(ScoreboardObjective::deserialize(r)?),
            70 => Ok(SetPassengers::deserialize(r)?),
            71 => Ok(Teams::deserialize(r)?),
            72 => Ok(UpdateScore::deserialize(r)?),
            73 => Ok(SpawnPosition::deserialize(r)?),
            74 => Ok(TimeUpdate::deserialize(r)?),
            75 => Ok(Title::deserialize(r)?),
            76 => Ok(StopSound::deserialize(r)?),
            77 => Ok(SoundEffect::deserialize(r)?),
            78 => Ok(PlayerListHeaderFooter::deserialize(r)?),
            79 => Ok(CollectItem::deserialize(r)?),
            80 => Ok(EntityTeleport::deserialize(r)?),
            81 => Ok(Advancements::deserialize(r)?),
            82 => Ok(EntityProperties::deserialize(r)?),
            83 => Ok(EntityEffect::deserialize(r)?),
            84 => Ok(DeclareRecipes::deserialize(r)?),
            85 => Ok(Tags::deserialize(r)?),

            _ => bail!("No packet with id {} in state {}", packet_id, state),
            }
        },

        }
    }
    fn get_packet_name(&self) -> &str {
        match self {
        &ClientboundPacket::StatusResponse(..) => "StatusResponse",
        &ClientboundPacket::StatusPong(..) => "StatusPong",
        &ClientboundPacket::LoginDisconnect(..) => "LoginDisconnect",
        &ClientboundPacket::EncryptionRequest(..) => "EncryptionRequest",
        &ClientboundPacket::LoginSuccess(..) => "LoginSuccess",
        &ClientboundPacket::SetCompression(..) => "SetCompression",
        &ClientboundPacket::LoginPluginRequest(..) => "LoginPluginRequest",
        &ClientboundPacket::SpawnObject(..) => "SpawnObject",
        &ClientboundPacket::SpawnExperienceOrb(..) => "SpawnExperienceOrb",
        &ClientboundPacket::SpawnGlobalEntity(..) => "SpawnGlobalEntity",
        &ClientboundPacket::SpawnMob(..) => "SpawnMob",
        &ClientboundPacket::SpawnPainting(..) => "SpawnPainting",
        &ClientboundPacket::SpawnPlayer(..) => "SpawnPlayer",
        &ClientboundPacket::ClientboundAnimation(..) => "ClientboundAnimation",
        &ClientboundPacket::Statistics(..) => "Statistics",
        &ClientboundPacket::BlockBreakAnimation(..) => "BlockBreakAnimation",
        &ClientboundPacket::UpdateBlockEntity(..) => "UpdateBlockEntity",
        &ClientboundPacket::BlockAction(..) => "BlockAction",
        &ClientboundPacket::BlockChange(..) => "BlockChange",
        &ClientboundPacket::BossBar(..) => "BossBar",
        &ClientboundPacket::ServerDifficulty(..) => "ServerDifficulty",
        &ClientboundPacket::ChatMessage(..) => "ChatMessage",
        &ClientboundPacket::MultiBlockChange(..) => "MultiBlockChange",
        &ClientboundPacket::ClientboundTabComplete(..) => "ClientboundTabComplete",
        &ClientboundPacket::DeclareCommands(..) => "DeclareCommands",
        &ClientboundPacket::ClientboundConfirmTransaction(..) => "ClientboundConfirmTransaction",
        &ClientboundPacket::ClientboundCloseWindow(..) => "ClientboundCloseWindow",
        &ClientboundPacket::OpenWindow(..) => "OpenWindow",
        &ClientboundPacket::WindowItems(..) => "WindowItems",
        &ClientboundPacket::WindowProperty(..) => "WindowProperty",
        &ClientboundPacket::SetSlot(..) => "SetSlot",
        &ClientboundPacket::SetCooldown(..) => "SetCooldown",
        &ClientboundPacket::ClientboundPluginMessage(..) => "ClientboundPluginMessage",
        &ClientboundPacket::NamedSoundEffect(..) => "NamedSoundEffect",
        &ClientboundPacket::PlayDisconnect(..) => "PlayDisconnect",
        &ClientboundPacket::EntityStatus(..) => "EntityStatus",
        &ClientboundPacket::NBTQueryResponse(..) => "NBTQueryResponse",
        &ClientboundPacket::Explosion(..) => "Explosion",
        &ClientboundPacket::UnloadChunk(..) => "UnloadChunk",
        &ClientboundPacket::ChangeGameState(..) => "ChangeGameState",
        &ClientboundPacket::KeepAlive(..) => "KeepAlive",
        &ClientboundPacket::ChunkData(..) => "ChunkData",
        &ClientboundPacket::Effect(..) => "Effect",
        &ClientboundPacket::Particle(..) => "Particle",
        &ClientboundPacket::JoinGame(..) => "JoinGame",
        &ClientboundPacket::Map(..) => "Map",
        &ClientboundPacket::Entity(..) => "Entity",
        &ClientboundPacket::EntityRelativeMove(..) => "EntityRelativeMove",
        &ClientboundPacket::EntityLookRelativeMove(..) => "EntityLookRelativeMove",
        &ClientboundPacket::EntityLook(..) => "EntityLook",
        &ClientboundPacket::ClientboundVehicleMove(..) => "ClientboundVehicleMove",
        &ClientboundPacket::OpenSignEditor(..) => "OpenSignEditor",
        &ClientboundPacket::CraftRecipeResponse(..) => "CraftRecipeResponse",
        &ClientboundPacket::PlayerAbilities(..) => "PlayerAbilities",
        &ClientboundPacket::CombatEvent(..) => "CombatEvent",
        &ClientboundPacket::PlayerListItem(..) => "PlayerListItem",
        &ClientboundPacket::FacePlayer(..) => "FacePlayer",
        &ClientboundPacket::PlayerPositionAndLook(..) => "PlayerPositionAndLook",
        &ClientboundPacket::UseBed(..) => "UseBed",
        &ClientboundPacket::UnlockRecipes(..) => "UnlockRecipes",
        &ClientboundPacket::DestroyEntities(..) => "DestroyEntities",
        &ClientboundPacket::RemoveEntityEffect(..) => "RemoveEntityEffect",
        &ClientboundPacket::ResourcePackSend(..) => "ResourcePackSend",
        &ClientboundPacket::Respawn(..) => "Respawn",
        &ClientboundPacket::EntityHeadLook(..) => "EntityHeadLook",
        &ClientboundPacket::SelectAdvancementTab(..) => "SelectAdvancementTab",
        &ClientboundPacket::WorldBorder(..) => "WorldBorder",
        &ClientboundPacket::Camera(..) => "Camera",
        &ClientboundPacket::ClientboundHeldItemChange(..) => "ClientboundHeldItemChange",
        &ClientboundPacket::DisplayScoreboard(..) => "DisplayScoreboard",
        &ClientboundPacket::EntityMetadata(..) => "EntityMetadata",
        &ClientboundPacket::AttachEntity(..) => "AttachEntity",
        &ClientboundPacket::EntityVelocity(..) => "EntityVelocity",
        &ClientboundPacket::EntityEquipment(..) => "EntityEquipment",
        &ClientboundPacket::SetExperience(..) => "SetExperience",
        &ClientboundPacket::UpdateHealth(..) => "UpdateHealth",
        &ClientboundPacket::ScoreboardObjective(..) => "ScoreboardObjective",
        &ClientboundPacket::SetPassengers(..) => "SetPassengers",
        &ClientboundPacket::Teams(..) => "Teams",
        &ClientboundPacket::UpdateScore(..) => "UpdateScore",
        &ClientboundPacket::SpawnPosition(..) => "SpawnPosition",
        &ClientboundPacket::TimeUpdate(..) => "TimeUpdate",
        &ClientboundPacket::Title(..) => "Title",
        &ClientboundPacket::StopSound(..) => "StopSound",
        &ClientboundPacket::SoundEffect(..) => "SoundEffect",
        &ClientboundPacket::PlayerListHeaderFooter(..) => "PlayerListHeaderFooter",
        &ClientboundPacket::CollectItem(..) => "CollectItem",
        &ClientboundPacket::EntityTeleport(..) => "EntityTeleport",
        &ClientboundPacket::Advancements(..) => "Advancements",
        &ClientboundPacket::EntityProperties(..) => "EntityProperties",
        &ClientboundPacket::EntityEffect(..) => "EntityEffect",
        &ClientboundPacket::DeclareRecipes(..) => "DeclareRecipes",
        &ClientboundPacket::Tags(..) => "Tags",

        }
    }
    fn get_clientstate(&self) -> ClientState {
        match self {
        &ClientboundPacket::StatusResponse(..) => ClientState::Status,
        &ClientboundPacket::StatusPong(..) => ClientState::Status,
        &ClientboundPacket::LoginDisconnect(..) => ClientState::Login,
        &ClientboundPacket::EncryptionRequest(..) => ClientState::Login,
        &ClientboundPacket::LoginSuccess(..) => ClientState::Login,
        &ClientboundPacket::SetCompression(..) => ClientState::Login,
        &ClientboundPacket::LoginPluginRequest(..) => ClientState::Login,
        &ClientboundPacket::SpawnObject(..) => ClientState::Play,
        &ClientboundPacket::SpawnExperienceOrb(..) => ClientState::Play,
        &ClientboundPacket::SpawnGlobalEntity(..) => ClientState::Play,
        &ClientboundPacket::SpawnMob(..) => ClientState::Play,
        &ClientboundPacket::SpawnPainting(..) => ClientState::Play,
        &ClientboundPacket::SpawnPlayer(..) => ClientState::Play,
        &ClientboundPacket::ClientboundAnimation(..) => ClientState::Play,
        &ClientboundPacket::Statistics(..) => ClientState::Play,
        &ClientboundPacket::BlockBreakAnimation(..) => ClientState::Play,
        &ClientboundPacket::UpdateBlockEntity(..) => ClientState::Play,
        &ClientboundPacket::BlockAction(..) => ClientState::Play,
        &ClientboundPacket::BlockChange(..) => ClientState::Play,
        &ClientboundPacket::BossBar(..) => ClientState::Play,
        &ClientboundPacket::ServerDifficulty(..) => ClientState::Play,
        &ClientboundPacket::ChatMessage(..) => ClientState::Play,
        &ClientboundPacket::MultiBlockChange(..) => ClientState::Play,
        &ClientboundPacket::ClientboundTabComplete(..) => ClientState::Play,
        &ClientboundPacket::DeclareCommands(..) => ClientState::Play,
        &ClientboundPacket::ClientboundConfirmTransaction(..) => ClientState::Play,
        &ClientboundPacket::ClientboundCloseWindow(..) => ClientState::Play,
        &ClientboundPacket::OpenWindow(..) => ClientState::Play,
        &ClientboundPacket::WindowItems(..) => ClientState::Play,
        &ClientboundPacket::WindowProperty(..) => ClientState::Play,
        &ClientboundPacket::SetSlot(..) => ClientState::Play,
        &ClientboundPacket::SetCooldown(..) => ClientState::Play,
        &ClientboundPacket::ClientboundPluginMessage(..) => ClientState::Play,
        &ClientboundPacket::NamedSoundEffect(..) => ClientState::Play,
        &ClientboundPacket::PlayDisconnect(..) => ClientState::Play,
        &ClientboundPacket::EntityStatus(..) => ClientState::Play,
        &ClientboundPacket::NBTQueryResponse(..) => ClientState::Play,
        &ClientboundPacket::Explosion(..) => ClientState::Play,
        &ClientboundPacket::UnloadChunk(..) => ClientState::Play,
        &ClientboundPacket::ChangeGameState(..) => ClientState::Play,
        &ClientboundPacket::KeepAlive(..) => ClientState::Play,
        &ClientboundPacket::ChunkData(..) => ClientState::Play,
        &ClientboundPacket::Effect(..) => ClientState::Play,
        &ClientboundPacket::Particle(..) => ClientState::Play,
        &ClientboundPacket::JoinGame(..) => ClientState::Play,
        &ClientboundPacket::Map(..) => ClientState::Play,
        &ClientboundPacket::Entity(..) => ClientState::Play,
        &ClientboundPacket::EntityRelativeMove(..) => ClientState::Play,
        &ClientboundPacket::EntityLookRelativeMove(..) => ClientState::Play,
        &ClientboundPacket::EntityLook(..) => ClientState::Play,
        &ClientboundPacket::ClientboundVehicleMove(..) => ClientState::Play,
        &ClientboundPacket::OpenSignEditor(..) => ClientState::Play,
        &ClientboundPacket::CraftRecipeResponse(..) => ClientState::Play,
        &ClientboundPacket::PlayerAbilities(..) => ClientState::Play,
        &ClientboundPacket::CombatEvent(..) => ClientState::Play,
        &ClientboundPacket::PlayerListItem(..) => ClientState::Play,
        &ClientboundPacket::FacePlayer(..) => ClientState::Play,
        &ClientboundPacket::PlayerPositionAndLook(..) => ClientState::Play,
        &ClientboundPacket::UseBed(..) => ClientState::Play,
        &ClientboundPacket::UnlockRecipes(..) => ClientState::Play,
        &ClientboundPacket::DestroyEntities(..) => ClientState::Play,
        &ClientboundPacket::RemoveEntityEffect(..) => ClientState::Play,
        &ClientboundPacket::ResourcePackSend(..) => ClientState::Play,
        &ClientboundPacket::Respawn(..) => ClientState::Play,
        &ClientboundPacket::EntityHeadLook(..) => ClientState::Play,
        &ClientboundPacket::SelectAdvancementTab(..) => ClientState::Play,
        &ClientboundPacket::WorldBorder(..) => ClientState::Play,
        &ClientboundPacket::Camera(..) => ClientState::Play,
        &ClientboundPacket::ClientboundHeldItemChange(..) => ClientState::Play,
        &ClientboundPacket::DisplayScoreboard(..) => ClientState::Play,
        &ClientboundPacket::EntityMetadata(..) => ClientState::Play,
        &ClientboundPacket::AttachEntity(..) => ClientState::Play,
        &ClientboundPacket::EntityVelocity(..) => ClientState::Play,
        &ClientboundPacket::EntityEquipment(..) => ClientState::Play,
        &ClientboundPacket::SetExperience(..) => ClientState::Play,
        &ClientboundPacket::UpdateHealth(..) => ClientState::Play,
        &ClientboundPacket::ScoreboardObjective(..) => ClientState::Play,
        &ClientboundPacket::SetPassengers(..) => ClientState::Play,
        &ClientboundPacket::Teams(..) => ClientState::Play,
        &ClientboundPacket::UpdateScore(..) => ClientState::Play,
        &ClientboundPacket::SpawnPosition(..) => ClientState::Play,
        &ClientboundPacket::TimeUpdate(..) => ClientState::Play,
        &ClientboundPacket::Title(..) => ClientState::Play,
        &ClientboundPacket::StopSound(..) => ClientState::Play,
        &ClientboundPacket::SoundEffect(..) => ClientState::Play,
        &ClientboundPacket::PlayerListHeaderFooter(..) => ClientState::Play,
        &ClientboundPacket::CollectItem(..) => ClientState::Play,
        &ClientboundPacket::EntityTeleport(..) => ClientState::Play,
        &ClientboundPacket::Advancements(..) => ClientState::Play,
        &ClientboundPacket::EntityProperties(..) => ClientState::Play,
        &ClientboundPacket::EntityEffect(..) => ClientState::Play,
        &ClientboundPacket::DeclareRecipes(..) => ClientState::Play,
        &ClientboundPacket::Tags(..) => ClientState::Play,

        }
    }
    fn get_id(&self) -> i32 {
        match self {
        &ClientboundPacket::StatusResponse(..) => 0,
        &ClientboundPacket::StatusPong(..) => 1,
        &ClientboundPacket::LoginDisconnect(..) => 0,
        &ClientboundPacket::EncryptionRequest(..) => 1,
        &ClientboundPacket::LoginSuccess(..) => 2,
        &ClientboundPacket::SetCompression(..) => 3,
        &ClientboundPacket::LoginPluginRequest(..) => 4,
        &ClientboundPacket::SpawnObject(..) => 0,
        &ClientboundPacket::SpawnExperienceOrb(..) => 1,
        &ClientboundPacket::SpawnGlobalEntity(..) => 2,
        &ClientboundPacket::SpawnMob(..) => 3,
        &ClientboundPacket::SpawnPainting(..) => 4,
        &ClientboundPacket::SpawnPlayer(..) => 5,
        &ClientboundPacket::ClientboundAnimation(..) => 6,
        &ClientboundPacket::Statistics(..) => 7,
        &ClientboundPacket::BlockBreakAnimation(..) => 8,
        &ClientboundPacket::UpdateBlockEntity(..) => 9,
        &ClientboundPacket::BlockAction(..) => 10,
        &ClientboundPacket::BlockChange(..) => 11,
        &ClientboundPacket::BossBar(..) => 12,
        &ClientboundPacket::ServerDifficulty(..) => 13,
        &ClientboundPacket::ChatMessage(..) => 14,
        &ClientboundPacket::MultiBlockChange(..) => 15,
        &ClientboundPacket::ClientboundTabComplete(..) => 16,
        &ClientboundPacket::DeclareCommands(..) => 17,
        &ClientboundPacket::ClientboundConfirmTransaction(..) => 18,
        &ClientboundPacket::ClientboundCloseWindow(..) => 19,
        &ClientboundPacket::OpenWindow(..) => 20,
        &ClientboundPacket::WindowItems(..) => 21,
        &ClientboundPacket::WindowProperty(..) => 22,
        &ClientboundPacket::SetSlot(..) => 23,
        &ClientboundPacket::SetCooldown(..) => 24,
        &ClientboundPacket::ClientboundPluginMessage(..) => 25,
        &ClientboundPacket::NamedSoundEffect(..) => 26,
        &ClientboundPacket::PlayDisconnect(..) => 27,
        &ClientboundPacket::EntityStatus(..) => 28,
        &ClientboundPacket::NBTQueryResponse(..) => 29,
        &ClientboundPacket::Explosion(..) => 30,
        &ClientboundPacket::UnloadChunk(..) => 31,
        &ClientboundPacket::ChangeGameState(..) => 32,
        &ClientboundPacket::KeepAlive(..) => 33,
        &ClientboundPacket::ChunkData(..) => 34,
        &ClientboundPacket::Effect(..) => 35,
        &ClientboundPacket::Particle(..) => 36,
        &ClientboundPacket::JoinGame(..) => 37,
        &ClientboundPacket::Map(..) => 38,
        &ClientboundPacket::Entity(..) => 39,
        &ClientboundPacket::EntityRelativeMove(..) => 40,
        &ClientboundPacket::EntityLookRelativeMove(..) => 41,
        &ClientboundPacket::EntityLook(..) => 42,
        &ClientboundPacket::ClientboundVehicleMove(..) => 43,
        &ClientboundPacket::OpenSignEditor(..) => 44,
        &ClientboundPacket::CraftRecipeResponse(..) => 45,
        &ClientboundPacket::PlayerAbilities(..) => 46,
        &ClientboundPacket::CombatEvent(..) => 47,
        &ClientboundPacket::PlayerListItem(..) => 48,
        &ClientboundPacket::FacePlayer(..) => 49,
        &ClientboundPacket::PlayerPositionAndLook(..) => 50,
        &ClientboundPacket::UseBed(..) => 51,
        &ClientboundPacket::UnlockRecipes(..) => 52,
        &ClientboundPacket::DestroyEntities(..) => 53,
        &ClientboundPacket::RemoveEntityEffect(..) => 54,
        &ClientboundPacket::ResourcePackSend(..) => 55,
        &ClientboundPacket::Respawn(..) => 56,
        &ClientboundPacket::EntityHeadLook(..) => 57,
        &ClientboundPacket::SelectAdvancementTab(..) => 58,
        &ClientboundPacket::WorldBorder(..) => 59,
        &ClientboundPacket::Camera(..) => 60,
        &ClientboundPacket::ClientboundHeldItemChange(..) => 61,
        &ClientboundPacket::DisplayScoreboard(..) => 62,
        &ClientboundPacket::EntityMetadata(..) => 63,
        &ClientboundPacket::AttachEntity(..) => 64,
        &ClientboundPacket::EntityVelocity(..) => 65,
        &ClientboundPacket::EntityEquipment(..) => 66,
        &ClientboundPacket::SetExperience(..) => 67,
        &ClientboundPacket::UpdateHealth(..) => 68,
        &ClientboundPacket::ScoreboardObjective(..) => 69,
        &ClientboundPacket::SetPassengers(..) => 70,
        &ClientboundPacket::Teams(..) => 71,
        &ClientboundPacket::UpdateScore(..) => 72,
        &ClientboundPacket::SpawnPosition(..) => 73,
        &ClientboundPacket::TimeUpdate(..) => 74,
        &ClientboundPacket::Title(..) => 75,
        &ClientboundPacket::StopSound(..) => 76,
        &ClientboundPacket::SoundEffect(..) => 77,
        &ClientboundPacket::PlayerListHeaderFooter(..) => 78,
        &ClientboundPacket::CollectItem(..) => 79,
        &ClientboundPacket::EntityTeleport(..) => 80,
        &ClientboundPacket::Advancements(..) => 81,
        &ClientboundPacket::EntityProperties(..) => 82,
        &ClientboundPacket::EntityEffect(..) => 83,
        &ClientboundPacket::DeclareRecipes(..) => 84,
        &ClientboundPacket::Tags(..) => 85,

        }
    }
    fn to_u8(&self) -> Result<Vec<u8>> {
        match self {
        &ClientboundPacket::StatusResponse(ref x) => x.to_u8(),
        &ClientboundPacket::StatusPong(ref x) => x.to_u8(),
        &ClientboundPacket::LoginDisconnect(ref x) => x.to_u8(),
        &ClientboundPacket::EncryptionRequest(ref x) => x.to_u8(),
        &ClientboundPacket::LoginSuccess(ref x) => x.to_u8(),
        &ClientboundPacket::SetCompression(ref x) => x.to_u8(),
        &ClientboundPacket::LoginPluginRequest(ref x) => x.to_u8(),
        &ClientboundPacket::SpawnObject(ref x) => x.to_u8(),
        &ClientboundPacket::SpawnExperienceOrb(ref x) => x.to_u8(),
        &ClientboundPacket::SpawnGlobalEntity(ref x) => x.to_u8(),
        &ClientboundPacket::SpawnMob(ref x) => x.to_u8(),
        &ClientboundPacket::SpawnPainting(ref x) => x.to_u8(),
        &ClientboundPacket::SpawnPlayer(ref x) => x.to_u8(),
        &ClientboundPacket::ClientboundAnimation(ref x) => x.to_u8(),
        &ClientboundPacket::Statistics(ref x) => x.to_u8(),
        &ClientboundPacket::BlockBreakAnimation(ref x) => x.to_u8(),
        &ClientboundPacket::UpdateBlockEntity(ref x) => x.to_u8(),
        &ClientboundPacket::BlockAction(ref x) => x.to_u8(),
        &ClientboundPacket::BlockChange(ref x) => x.to_u8(),
        &ClientboundPacket::BossBar(ref x) => x.to_u8(),
        &ClientboundPacket::ServerDifficulty(ref x) => x.to_u8(),
        &ClientboundPacket::ChatMessage(ref x) => x.to_u8(),
        &ClientboundPacket::MultiBlockChange(ref x) => x.to_u8(),
        &ClientboundPacket::ClientboundTabComplete(ref x) => x.to_u8(),
        &ClientboundPacket::DeclareCommands(ref x) => x.to_u8(),
        &ClientboundPacket::ClientboundConfirmTransaction(ref x) => x.to_u8(),
        &ClientboundPacket::ClientboundCloseWindow(ref x) => x.to_u8(),
        &ClientboundPacket::OpenWindow(ref x) => x.to_u8(),
        &ClientboundPacket::WindowItems(ref x) => x.to_u8(),
        &ClientboundPacket::WindowProperty(ref x) => x.to_u8(),
        &ClientboundPacket::SetSlot(ref x) => x.to_u8(),
        &ClientboundPacket::SetCooldown(ref x) => x.to_u8(),
        &ClientboundPacket::ClientboundPluginMessage(ref x) => x.to_u8(),
        &ClientboundPacket::NamedSoundEffect(ref x) => x.to_u8(),
        &ClientboundPacket::PlayDisconnect(ref x) => x.to_u8(),
        &ClientboundPacket::EntityStatus(ref x) => x.to_u8(),
        &ClientboundPacket::NBTQueryResponse(ref x) => x.to_u8(),
        &ClientboundPacket::Explosion(ref x) => x.to_u8(),
        &ClientboundPacket::UnloadChunk(ref x) => x.to_u8(),
        &ClientboundPacket::ChangeGameState(ref x) => x.to_u8(),
        &ClientboundPacket::KeepAlive(ref x) => x.to_u8(),
        &ClientboundPacket::ChunkData(ref x) => x.to_u8(),
        &ClientboundPacket::Effect(ref x) => x.to_u8(),
        &ClientboundPacket::Particle(ref x) => x.to_u8(),
        &ClientboundPacket::JoinGame(ref x) => x.to_u8(),
        &ClientboundPacket::Map(ref x) => x.to_u8(),
        &ClientboundPacket::Entity(ref x) => x.to_u8(),
        &ClientboundPacket::EntityRelativeMove(ref x) => x.to_u8(),
        &ClientboundPacket::EntityLookRelativeMove(ref x) => x.to_u8(),
        &ClientboundPacket::EntityLook(ref x) => x.to_u8(),
        &ClientboundPacket::ClientboundVehicleMove(ref x) => x.to_u8(),
        &ClientboundPacket::OpenSignEditor(ref x) => x.to_u8(),
        &ClientboundPacket::CraftRecipeResponse(ref x) => x.to_u8(),
        &ClientboundPacket::PlayerAbilities(ref x) => x.to_u8(),
        &ClientboundPacket::CombatEvent(ref x) => x.to_u8(),
        &ClientboundPacket::PlayerListItem(ref x) => x.to_u8(),
        &ClientboundPacket::FacePlayer(ref x) => x.to_u8(),
        &ClientboundPacket::PlayerPositionAndLook(ref x) => x.to_u8(),
        &ClientboundPacket::UseBed(ref x) => x.to_u8(),
        &ClientboundPacket::UnlockRecipes(ref x) => x.to_u8(),
        &ClientboundPacket::DestroyEntities(ref x) => x.to_u8(),
        &ClientboundPacket::RemoveEntityEffect(ref x) => x.to_u8(),
        &ClientboundPacket::ResourcePackSend(ref x) => x.to_u8(),
        &ClientboundPacket::Respawn(ref x) => x.to_u8(),
        &ClientboundPacket::EntityHeadLook(ref x) => x.to_u8(),
        &ClientboundPacket::SelectAdvancementTab(ref x) => x.to_u8(),
        &ClientboundPacket::WorldBorder(ref x) => x.to_u8(),
        &ClientboundPacket::Camera(ref x) => x.to_u8(),
        &ClientboundPacket::ClientboundHeldItemChange(ref x) => x.to_u8(),
        &ClientboundPacket::DisplayScoreboard(ref x) => x.to_u8(),
        &ClientboundPacket::EntityMetadata(ref x) => x.to_u8(),
        &ClientboundPacket::AttachEntity(ref x) => x.to_u8(),
        &ClientboundPacket::EntityVelocity(ref x) => x.to_u8(),
        &ClientboundPacket::EntityEquipment(ref x) => x.to_u8(),
        &ClientboundPacket::SetExperience(ref x) => x.to_u8(),
        &ClientboundPacket::UpdateHealth(ref x) => x.to_u8(),
        &ClientboundPacket::ScoreboardObjective(ref x) => x.to_u8(),
        &ClientboundPacket::SetPassengers(ref x) => x.to_u8(),
        &ClientboundPacket::Teams(ref x) => x.to_u8(),
        &ClientboundPacket::UpdateScore(ref x) => x.to_u8(),
        &ClientboundPacket::SpawnPosition(ref x) => x.to_u8(),
        &ClientboundPacket::TimeUpdate(ref x) => x.to_u8(),
        &ClientboundPacket::Title(ref x) => x.to_u8(),
        &ClientboundPacket::StopSound(ref x) => x.to_u8(),
        &ClientboundPacket::SoundEffect(ref x) => x.to_u8(),
        &ClientboundPacket::PlayerListHeaderFooter(ref x) => x.to_u8(),
        &ClientboundPacket::CollectItem(ref x) => x.to_u8(),
        &ClientboundPacket::EntityTeleport(ref x) => x.to_u8(),
        &ClientboundPacket::Advancements(ref x) => x.to_u8(),
        &ClientboundPacket::EntityProperties(ref x) => x.to_u8(),
        &ClientboundPacket::EntityEffect(ref x) => x.to_u8(),
        &ClientboundPacket::DeclareRecipes(ref x) => x.to_u8(),
        &ClientboundPacket::Tags(ref x) => x.to_u8(),

        }
    }
}
impl fmt::Display for ClientboundPacket {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "ClientboundPacket of type {}", self.get_packet_name())
    }
}