@vaitosoi/minejs 0.5.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/README.md +4 -0
  2. package/assets/minecraft/26.2/components.json +113 -0
  3. package/assets/minecraft/26.2/packets.json +8 -16
  4. package/assets/minecraft/26.3/packets.json +4767 -0
  5. package/assets/minecraft/versionMapping.json +16 -0
  6. package/dist/binary/decoder.d.ts +35 -0
  7. package/dist/binary/decoder.d.ts.map +1 -1
  8. package/dist/binary/decoder.js +665 -2
  9. package/dist/binary/decoder.js.map +1 -1
  10. package/dist/binary/encoder.d.ts +3 -3
  11. package/dist/binary/encoder.d.ts.map +1 -1
  12. package/dist/binary/encoder.js.map +1 -1
  13. package/dist/client/client.d.ts +58 -1
  14. package/dist/client/client.d.ts.map +1 -1
  15. package/dist/client/client.js +38 -0
  16. package/dist/client/client.js.map +1 -1
  17. package/dist/net/tcp.d.ts +6 -2
  18. package/dist/net/tcp.d.ts.map +1 -1
  19. package/dist/net/tcp.js +5 -2
  20. package/dist/net/tcp.js.map +1 -1
  21. package/dist/packet/listener.d.ts +5 -0
  22. package/dist/packet/listener.d.ts.map +1 -1
  23. package/dist/packet/listener.js +78 -5
  24. package/dist/packet/listener.js.map +1 -1
  25. package/dist/packet/sender.d.ts +3 -1
  26. package/dist/packet/sender.d.ts.map +1 -1
  27. package/dist/packet/sender.js +15 -0
  28. package/dist/packet/sender.js.map +1 -1
  29. package/dist/physics/aabb.js +7 -7
  30. package/dist/physics/aabb.js.map +1 -1
  31. package/dist/physics/player.js +1 -5
  32. package/dist/physics/player.js.map +1 -1
  33. package/dist/version/codec.d.ts.map +1 -1
  34. package/dist/version/codec.js +25 -14
  35. package/dist/version/codec.js.map +1 -1
  36. package/dist/version/registry.d.ts +21 -5
  37. package/dist/version/registry.d.ts.map +1 -1
  38. package/dist/version/registry.js +55 -18
  39. package/dist/version/registry.js.map +1 -1
  40. package/dist/world/block.d.ts +10 -8
  41. package/dist/world/block.d.ts.map +1 -1
  42. package/dist/world/block.js +17 -11
  43. package/dist/world/block.js.map +1 -1
  44. package/dist/world/container.d.ts +106 -0
  45. package/dist/world/container.d.ts.map +1 -0
  46. package/dist/world/container.js +240 -0
  47. package/dist/world/container.js.map +1 -0
  48. package/dist/world/state.d.ts +8 -5
  49. package/dist/world/state.d.ts.map +1 -1
  50. package/dist/world/state.js +2 -0
  51. package/dist/world/state.js.map +1 -1
  52. package/package.json +2 -2
  53. package/src/binary/decoder.ts +691 -2
  54. package/src/binary/encoder.ts +3 -3
  55. package/src/client/client.ts +81 -4
  56. package/src/net/tcp.ts +16 -5
  57. package/src/packet/listener.ts +103 -6
  58. package/src/packet/sender.ts +26 -2
  59. package/src/physics/aabb.ts +7 -7
  60. package/src/physics/player.ts +5 -5
  61. package/src/version/codec.ts +24 -14
  62. package/src/version/registry.ts +61 -17
  63. package/src/world/block.ts +19 -17
  64. package/src/world/container.ts +180 -0
  65. package/src/world/state.ts +11 -6
  66. package/test/client/index.ts +49 -21
  67. package/test/client/registry.json +1735 -0
@@ -5,6 +5,8 @@ import { Tag } from "./static";
5
5
  import { unzipSync } from "zlib";
6
6
  import { minBigInt } from "../base/math";
7
7
  import { inspect } from "util";
8
+ import { ComponentTypeRegistry } from "../version/registry";
9
+ import { Slot } from "../world/container";
8
10
 
9
11
  /** @hidden */
10
12
  export function getTextFromTextComponent(component: any): string {
@@ -24,8 +26,7 @@ export function getTextFromTextComponent(component: any): string {
24
26
  else return component["translate"];
25
27
  } else if ("keybind" in component)
26
28
  return component["keybind"];
27
- else
28
- throw new UnexpectedValue("value of component", "text component object", inspect(component, undefined, null));
29
+ else return "";
29
30
  }
30
31
  default:
31
32
  throw new UnexpectedValue("type of component", "string or object", typeof component);
@@ -448,6 +449,694 @@ export class BinaryDecoder {
448
449
  narration: this.readChatTypeDecoration()
449
450
  };
450
451
  }
452
+
453
+ public readSoundEvent() {
454
+ const name = this.readString(),
455
+ fixedRange = this.readPrefixedOptional(decoder => decoder.readFloat());
456
+ return { name, fixedRange };
457
+ }
458
+
459
+ private readBlockPredicate() {
460
+ return {
461
+ blocks: this.readPrefixedOptional(decoder => decoder.readIdSet()),
462
+ properties: this.readPrefixedOptional(decoder => decoder.readPrefixedArray(decoder => {
463
+ const name = decoder.readString(),
464
+ isExactMatch = decoder.readBoolean(),
465
+ exactValue = isExactMatch ? decoder.readString() : undefined,
466
+ minValue = !isExactMatch ? decoder.readString() : undefined,
467
+ maxValue = !isExactMatch ? decoder.readString() : undefined;
468
+ return {
469
+ name,
470
+ isExactMatch,
471
+ exactValue,
472
+ minValue,
473
+ maxValue
474
+ };
475
+ })),
476
+ nbt: this.readNBT(),
477
+ components: this.readPrefixedArray(this.readComponent),
478
+ partialComponent: this.readPrefixedArray(decoder => ({
479
+ type: decoder.readVarInt(),
480
+ predicate: decoder.readNBT()
481
+ }))
482
+ };
483
+ }
484
+
485
+ private readPotionEffect(): Record<string, any> {
486
+ const type = this.readVarInt();
487
+ const readDetail = (decoder: BinaryDecoder): Record<string, any> => ({
488
+ amplifier: decoder.readVarInt(),
489
+ duration: decoder.readVarInt(),
490
+ ambient: decoder.readBoolean(),
491
+ showParticles: decoder.readBoolean(),
492
+ showIcon: decoder.readBoolean(),
493
+ hiddenEffect: decoder.readPrefixedOptional(decoder => readDetail(decoder))
494
+ });
495
+ return {
496
+ type,
497
+ ...(readDetail(this))
498
+ };
499
+ }
500
+
501
+ private readFireworkExplosion() {
502
+ return {
503
+ shape: this.readVarInt(),
504
+ colors: this.readPrefixedArray(decoder => decoder.readInt()),
505
+ fadeColors: this.readPrefixedArray(decoder => decoder.readInt()),
506
+ hasTrail: this.readBoolean(),
507
+ hasTwinkle: this.readBoolean()
508
+ };
509
+ }
510
+
511
+ private readCosumeEffect() {
512
+ const type = this.readVarInt();
513
+ let data: Record<string, any> = {};
514
+ switch (type) {
515
+ case 0: data = {
516
+ effects: this.readPrefixedArray(decoder => decoder.readPotionEffect()),
517
+ probability: this.readFloat()
518
+ }; break;
519
+ case 1: data = {
520
+ effects: this.readIdSet()
521
+ }; break;
522
+ case 2: break;
523
+ case 3: data = { diameter: this.readFloat() }; break;
524
+ case 4: data = { sound: this.readSoundEvent() }; break;
525
+ }
526
+ return data;
527
+ }
528
+
529
+ private readInstrument() {
530
+ return {
531
+ soundEvent: this.readIdOrX(decoder => decoder.readSoundEvent()),
532
+ useDuration: this.readFloat(),
533
+ range: this.readFloat(),
534
+ description: this.readNBT()
535
+ };
536
+ }
537
+
538
+ private readJukeboxSong() {
539
+ return {
540
+ soundEvent: this.readIdOrX(decoder => decoder.readSoundEvent()),
541
+ description: this.readNBT(),
542
+ duration: this.readFloat(),
543
+ output: this.readVarInt()
544
+ };
545
+ }
546
+
547
+ private readKineticWeaponCondition() {
548
+ return {
549
+ maxDurationTicks: this.readVarInt(),
550
+ minSpeed: this.readFloat(),
551
+ minRelativeSpeed: this.readFloat()
552
+ };
553
+ }
554
+
555
+ /**
556
+ * @returns Describes a Minecraft player profile
557
+ */
558
+ public readProfile() {
559
+ return {
560
+ uuid: this.readUUID(),
561
+ username: this.readString(),
562
+ properties: this.readPrefixedArray(decoder => ({
563
+ name: decoder.readString(),
564
+ value: this.readString(),
565
+ signature: this.readPrefixedOptional(decoder => decoder.readString())
566
+ }))
567
+ };
568
+ }
569
+
570
+ private readPartialProfile() {
571
+ return {
572
+ username: this.readPrefixedOptional(decoder => decoder.readString()),
573
+ uuid: this.readPrefixedOptional(decoder => decoder.readUUID()),
574
+ properties: this.readPrefixedArray(decoder => ({
575
+ name: decoder.readString(),
576
+ value: this.readString(),
577
+ signature: this.readPrefixedOptional(decoder => decoder.readString())
578
+ }))
579
+ };
580
+ }
581
+
582
+ private readResolvableProfile() {
583
+ const kind = this.readVarInt(),
584
+ profile = kind == 0 ? this.readPartialProfile() : this.readProfile(),
585
+ body = this.readPrefixedOptional(decoder => decoder.readString()),
586
+ cape = this.readPrefixedOptional(decoder => decoder.readString()),
587
+ elytra = this.readPrefixedOptional(decoder => decoder.readString()),
588
+ model = this.readPrefixedOptional(decoder => decoder.readVarInt());
589
+ return {
590
+ kind,
591
+ profile,
592
+ body,
593
+ cape,
594
+ elytra,
595
+ model
596
+ };
597
+ }
598
+
599
+ private readTrimMaterial() {
600
+ return {
601
+ suffix: this.readString(),
602
+ overides: this.readPrefixedArray(decoder => ({
603
+ armorMaterialType: this.readString(),
604
+ overridenAssetName: this.readString(),
605
+ })),
606
+ description: this.readNBT()
607
+ };
608
+ }
609
+
610
+ private readTrimPattern() {
611
+ return {
612
+ assetName: this.readString(),
613
+ templateItem: this.readVarInt(),
614
+ description: this.readNBT(),
615
+ decal: this.readBoolean()
616
+ };
617
+ }
618
+
619
+ private readComponent() {
620
+ const data: Record<string, any> = {};
621
+ const id = this.readVarInt();
622
+ const name = ComponentTypeRegistry.idToName[id]!;
623
+ switch (name) {
624
+ case "minecraft:additional_trade_cost":
625
+ data["minecraft:additional_trade_cost"] = this.readVarInt();
626
+ break;
627
+ case "minecraft:attack_range":
628
+ data["minecraft:attack_range"] = {
629
+ minReach: this.readFloat(),
630
+ maxReach: this.readFloat(),
631
+ minCreativeReach: this.readFloat(),
632
+ maxCreativeReach: this.readFloat(),
633
+ hitboxMargin: this.readFloat(),
634
+ mobFactor: this.readFloat(),
635
+ };
636
+ break;
637
+ case "minecraft:attribute_modifiers":
638
+ data["minecraft:attribute_modifiers"] = this.readPrefixedArray((decoder) => ({
639
+ attributeId: decoder.readVarInt(),
640
+ modifierId: decoder.readString(),
641
+ value: decoder.readDouble(),
642
+ operation: decoder.readVarInt(),
643
+ slot: decoder.readVarInt(),
644
+ }));
645
+ break;
646
+ case "minecraft:axolotl/variant":
647
+ data["minecraft:axolotl/variant"] = this.readVarInt();
648
+ break;
649
+ case "minecraft:banner_patterns":
650
+ data["minecraft:banner_patterns"] = this.readPrefixedArray((decoder) => ({
651
+ patternType: decoder.readIdOrX((decoder) => ({
652
+ assetId: decoder.readString(),
653
+ translationKey: decoder.readString()
654
+ }))
655
+ }));
656
+ break;
657
+ case "minecraft:base_color":
658
+ data["minecraft:base_color"] = this.readVarInt();
659
+ break;
660
+ case "minecraft:bees":
661
+ data["minecraft:bees"] = this.readPrefixedArray((decoder) => ({
662
+ entityType: decoder.readVarInt(),
663
+ entityData: decoder.readNBT(),
664
+ ticksInHive: decoder.readVarInt(),
665
+ minTicksInHive: decoder.readVarInt(),
666
+ }));
667
+ break;
668
+ case "minecraft:block_entity_data":
669
+ data["minecraft:block_entity_data"] = {
670
+ type: this.readVarInt(),
671
+ data: this.readNBT()
672
+ };
673
+ break;
674
+ case "minecraft:block_state":
675
+ data["minecraft:block_state"] = this.readPrefixedArray((decoder) => ({
676
+ name: decoder.readString(),
677
+ value: decoder.readString()
678
+ }));
679
+ break;
680
+ case "minecraft:blocks_attacks":
681
+ data["minecraft:blocks_attacks"] = {
682
+ blockDelaySeconds: this.readFloat(),
683
+ disableCooldownScale: this.readFloat(),
684
+ damageReductions: this.readPrefixedArray((decoder) => ({
685
+ horizontalBlockingAngle: decoder.readFloat(),
686
+ type: decoder.readPrefixedOptional((decoder) => decoder.readIdSet()),
687
+ base: decoder.readFloat(),
688
+ factor: decoder.readFloat()
689
+ })),
690
+ itemDamageThresholod: this.readFloat(),
691
+ itemDamageBase: this.readFloat(),
692
+ itemDamageFactor: this.readFloat(),
693
+ bypassedBy: this.readPrefixedOptional(decoder => decoder.readIdSet()),
694
+ blockSound: this.readPrefixedOptional(decoder => decoder.readIdOrX(decoder => decoder.readSoundEvent())),
695
+ disableSound: this.readPrefixedOptional(decoder => decoder.readIdOrX(decoder => decoder.readSoundEvent())),
696
+ };
697
+ break;
698
+ case "minecraft:break_sound":
699
+ data["minecraft:break_sound"] = this.readIdOrX(decoder => decoder.readSoundEvent());
700
+ break;
701
+ case "minecraft:bucket_entity_data":
702
+ data["minecraft:bucket_entity_data"] = this.readNBT();
703
+ break;
704
+ case "minecraft:bundle_contents":
705
+ data["minecraft:bundle_contents"] = this.readPrefixedArray(decoder => decoder.readSlot());
706
+ break;
707
+ case "minecraft:can_break":
708
+ data["minecraft:can_break"] = this.readPrefixedArray(this.readBlockPredicate);
709
+ break;
710
+ case "minecraft:can_place_on":
711
+ data["minecraft:can_place_on"] = this.readPrefixedArray(this.readBlockPredicate);
712
+ break;
713
+ case "minecraft:cat/collar":
714
+ data["minecraft:cat/collar"] = this.readVarInt();
715
+ break;
716
+ case "minecraft:cat/sound_variant":
717
+ data["minecraft:cat/sound_variant"] = this.readVarInt();
718
+ break;
719
+ case "minecraft:cat/variant":
720
+ data["minecraft:cat/variant"] = this.readVarInt();
721
+ break;
722
+ case "minecraft:charged_projectiles":
723
+ data["minecraft:charged_projectiles"] = this.readPrefixedArray(decoder => decoder.readSlot());
724
+ break;
725
+ case "minecraft:chicken/sound_variant":
726
+ data["minecraft:chicken/sound_variant"] = this.readVarInt();
727
+ break;
728
+ case "minecraft:chicken/variant":
729
+ data["minecraft:chicken/variant"] = this.readVarInt();
730
+ break;
731
+ case "minecraft:consumable":
732
+ data["minecraft:consumable"] = {
733
+ consumeSecond: this.readFloat(),
734
+ animation: this.readVarInt(),
735
+ sound: this.readIdOrX(decoder => decoder.readSoundEvent()),
736
+ hasConsumeParticles: this.readBoolean(),
737
+ effect: this.readPrefixedArray(decoder => decoder.readCosumeEffect())
738
+ };
739
+ break;
740
+ case "minecraft:container":
741
+ data["minecraft:container"] = this.readPrefixedArray(decoder => decoder.readSlot());
742
+ break;
743
+ case "minecraft:container_loot":
744
+ data["minecraft:container_loot"] = this.readNBT();
745
+ break;
746
+ case "minecraft:cow/sound_variant":
747
+ data["minecraft:cow/sound_variant"] = this.readVarInt();
748
+ break;
749
+ case "minecraft:cow/variant":
750
+ data["minecraft:cow/variant"] = this.readVarInt();
751
+ break;
752
+ case "minecraft:creative_slot_lock":
753
+ data["minecraft:creative_slot_lock"] = {};
754
+ break;
755
+ case "minecraft:custom_data":
756
+ data["minecraft:custom_data"] = this.readNBT();
757
+ break;
758
+ case "minecraft:custom_model_data":
759
+ data["minecraft:custom_model_data"] = {
760
+ floats: this.readPrefixedArray(decoder => decoder.readFloat()),
761
+ flags: this.readPrefixedArray(decoder => decoder.readBoolean()),
762
+ strings: this.readPrefixedArray(decoder => decoder.readString()),
763
+ colors: this.readPrefixedArray(decoder => decoder.readInt())
764
+ };
765
+ break;
766
+ case "minecraft:custom_name":
767
+ data["minecraft:custom_name"] = this.readNBT();
768
+ break;
769
+ case "minecraft:damage":
770
+ data["minecraft:damage"] = this.readVarInt();
771
+ break;
772
+ case "minecraft:damage_resistant":
773
+ data["minecraft:damage_resistant"] = this.readIdSet();
774
+ break;
775
+ case "minecraft:damage_type":
776
+ data["minecraft:damage_type"] = this.readVarInt();
777
+ break;
778
+ case "minecraft:death_protection":
779
+ data["minecraft:death_protection"] = {
780
+ effects: this.readPrefixedArray(decoder => decoder.readCosumeEffect())
781
+ };
782
+ break;
783
+ case "minecraft:debug_stick_state":
784
+ data["minecraft:debug_stick_state"] = this.readNBT();
785
+ break;
786
+ case "minecraft:dye":
787
+ data["minecraft:dye"] = this.readVarInt();
788
+ break;
789
+ case "minecraft:dyed_color":
790
+ data["minecraft:dyed_color"] = this.readInt();
791
+ break;
792
+ case "minecraft:enchantable":
793
+ data["minecraft:enchantable"] = this.readVarInt();
794
+ break;
795
+ case "minecraft:enchantment_glint_override":
796
+ data["minecraft:enchantment_glint_override"] = this.readBoolean();
797
+ break;
798
+ case "minecraft:enchantments":
799
+ data["minecraft:enchantments"] = this.readPrefixedArray(decoder => ({
800
+ typeId: decoder.readVarInt(),
801
+ level: this.readVarInt()
802
+ }));
803
+ break;
804
+ case "minecraft:entity_data":
805
+ data["minecraft:entity_data"] = {
806
+ type: this.readVarInt(),
807
+ data: this.readNBT()
808
+ };
809
+ break;
810
+ case "minecraft:equippable":
811
+ data["minecraft:equippable"] = {
812
+ slot: this.readVarInt(),
813
+ equipSound: this.readIdOrX(decoder => decoder.readSoundEvent()),
814
+ model: this.readPrefixedOptional(decoder => decoder.readString()),
815
+ cameraOverlay: this.readPrefixedOptional(decoder => decoder.readString()),
816
+ allowedEntities: this.readPrefixedOptional(decoder => decoder.readIdSet()),
817
+ dispensable: this.readBoolean(),
818
+ swappable: this.readBoolean(),
819
+ damageOnHurt: this.readBoolean(),
820
+ canBeSheared: this.readBoolean(),
821
+ shearingSound: this.readIdOrX(decoder => decoder.readSoundEvent())
822
+ };
823
+ break;
824
+ case "minecraft:firework_explosion":
825
+ data["minecraft:firework_explosion"] = this.readFireworkExplosion();
826
+ break;
827
+ case "minecraft:fireworks":
828
+ data["minecraft:fireworks"] = {
829
+ duration: this.readVarInt(),
830
+ explosions: this.readPrefixedArray(decoder => decoder.readFireworkExplosion())
831
+ };
832
+ break;
833
+ case "minecraft:food":
834
+ data["minecraft:food"] = {
835
+ nutrition: this.readVarInt(),
836
+ saturationModifier: this.readFloat(),
837
+ canAlwaysEat: this.readBoolean()
838
+ };
839
+ break;
840
+ case "minecraft:fox/variant":
841
+ data["minecraft:fox/variant"] = this.readVarInt();
842
+ break;
843
+ case "minecraft:frog/variant":
844
+ data["minecraft:frog/variant"] = this.readVarInt();
845
+ break;
846
+ case "minecraft:glider":
847
+ data["minecraft:glider"] = {};
848
+ break;
849
+ case "minecraft:horse/variant":
850
+ data["minecraft:horse/variant"] = this.readVarInt();
851
+ break;
852
+ case "minecraft:instrument":
853
+ data["minecraft:instrument"] = this.readIdOrX(decoder => decoder.readInstrument());
854
+ break;
855
+ case "minecraft:intangible_projectile":
856
+ data["minecraft:intangible_projectile"] = this.readNBT();
857
+ break;
858
+ case "minecraft:item_model":
859
+ data["minecraft:item_model"] = this.readString();
860
+ break;
861
+ case "minecraft:item_name":
862
+ data["minecraft:item_name"] = this.readNBT();
863
+ break;
864
+ case "minecraft:jukebox_playable":
865
+ data["minecraft:jukebox_playable"] = this.readIdOrX(decoder => decoder.readJukeboxSong());
866
+ break;
867
+ case "minecraft:kinetic_weapon":
868
+ data["minecraft:kinetic_weapon"] = {
869
+ contactCooldownTicks: this.readVarInt(),
870
+ delayTicks: this.readVarInt(),
871
+ dismountConditions: this.readPrefixedOptional(decoder => decoder.readKineticWeaponCondition()),
872
+ knockbackConditions: this.readPrefixedOptional(decoder => decoder.readKineticWeaponCondition()),
873
+ damageConditions: this.readPrefixedOptional(decoder => decoder.readKineticWeaponCondition()),
874
+ forwardMovement: this.readFloat(),
875
+ damageMultiplier: this.readFloat(),
876
+ sound: this.readPrefixedOptional(decoder => decoder.readSoundEvent()),
877
+ hitSound: this.readPrefixedOptional(decoder => decoder.readSoundEvent())
878
+ };
879
+ break;
880
+ case "minecraft:llama/variant":
881
+ data["minecraft:llama/variant"] = this.readVarInt();
882
+ break;
883
+ case "minecraft:lock":
884
+ data["minecraft:lock"] = this.readNBT();
885
+ break;
886
+ case "minecraft:lodestone_tracker": {
887
+ const hasGlobalPosition = this.readBoolean(),
888
+ dimension = hasGlobalPosition ? this.readString() : undefined,
889
+ position = hasGlobalPosition ? this.readPosition() : undefined,
890
+ tracked = this.readBoolean();
891
+ data["minecraft:lodestone_tracker"] = {
892
+ hasGlobalPosition,
893
+ dimension,
894
+ position,
895
+ tracked
896
+ };
897
+ break;
898
+ }
899
+ case "minecraft:lore":
900
+ data["minecraft:lore"] = this.readPrefixedArray(decoder => decoder.readNBT());
901
+ break;
902
+ case "minecraft:map_color":
903
+ data["minecraft:map_color"] = this.readInt();
904
+ break;
905
+ case "minecraft:map_decorations":
906
+ data["minecraft:map_decorations"] = this.readNBT();
907
+ break;
908
+ case "minecraft:map_id":
909
+ data["minecraft:map_id"] = this.readVarInt();
910
+ break;
911
+ case "minecraft:map_post_processing":
912
+ data["minecraft:map_post_processing"] = this.readVarInt();
913
+ break;
914
+ case "minecraft:max_damage":
915
+ data["minecraft:max_damage"] = this.readVarInt();
916
+ break;
917
+ case "minecraft:max_stack_size":
918
+ data["minecraft:max_stack_size"] = this.readVarInt();
919
+ break;
920
+ case "minecraft:minimum_attack_charge":
921
+ data["minecraft:minimum_attack_charge"] = this.readFloat();
922
+ break;
923
+ case "minecraft:mooshroom/variant":
924
+ data["minecraft:mooshroom/variant"] = this.readVarInt();
925
+ break;
926
+ case "minecraft:note_block_sound":
927
+ data["minecraft:note_block_sound"] = this.readString();
928
+ break;
929
+ case "minecraft:ominous_bottle_amplifier":
930
+ data["minecraft:ominous_bottle_amplifier"] = this.readVarInt();
931
+ break;
932
+ case "minecraft:painting/variant":
933
+ data["minecraft:painting/variant"] = {
934
+ width: this.readInt(),
935
+ height: this.readVarInt(),
936
+ assetId: this.readString(),
937
+ title: this.readPrefixedOptional(decoder => decoder.readNBT()),
938
+ author: this.readPrefixedOptional(decoder => decoder.readNBT()),
939
+ };
940
+ break;
941
+ case "minecraft:parrot/variant":
942
+ data["minecraft:parrot/variant"] = this.readVarInt();
943
+ break;
944
+ case "minecraft:piercing_weapon":
945
+ data["minecraft:piercing_weapon"] = {
946
+ dealKnockback: this.readBoolean(),
947
+ dismounts: this.readBoolean(),
948
+ sound: this.readPrefixedOptional(decoder => decoder.readSoundEvent()),
949
+ hitSound: this.readPrefixedOptional(decoder => decoder.readSoundEvent())
950
+ };
951
+ break;
952
+ case "minecraft:pig/sound_variant":
953
+ data["minecraft:pig/sound_variant"] = this.readVarInt();
954
+ break;
955
+ case "minecraft:pig/variant":
956
+ data["minecraft:pig/variant"] = this.readVarInt();
957
+ break;
958
+ case "minecraft:pot_decorations":
959
+ data["minecraft:pot_decorations"] = this.readPrefixedArray(decoder => decoder.readVarInt());
960
+ break;
961
+ case "minecraft:potion_contents":
962
+ data["minecraft:potion_contents"] = {
963
+ id: this.readPrefixedOptional(decoder => decoder.readVarInt()),
964
+ color: this.readPrefixedOptional(decoder => decoder.readInt()),
965
+ effects: this.readPrefixedArray(decoder => decoder.readPotionEffect()),
966
+ name: this.readPrefixedOptional(decoder => decoder.readString())
967
+ };
968
+ break;
969
+ case "minecraft:potion_duration_scale":
970
+ data["minecraft:potion_duration_scale"] = this.readFloat();
971
+ break;
972
+ case "minecraft:profile":
973
+ data["minecraft:profile"] = this.readResolvableProfile();
974
+ break;
975
+ case "minecraft:provides_banner_patterns":
976
+ data["minecraft:provides_banner_patterns"] = this.readIdSet();
977
+ break;
978
+ case "minecraft:provides_trim_material":
979
+ data["minecraft:provides_trim_material"] = this.readIdOrX(decoder => decoder.readTrimMaterial());
980
+ break;
981
+ case "minecraft:rabbit/variant":
982
+ data["minecraft:rabbit/variant"] = this.readVarInt();
983
+ break;
984
+ case "minecraft:rarity":
985
+ data["minecraft:rarity"] = this.readVarInt();
986
+ break;
987
+ case "minecraft:recipes":
988
+ data["minecraft:recipes"] = this.readNBT();
989
+ break;
990
+ case "minecraft:repair_cost":
991
+ data["minecraft:repair_cost"] = this.readVarInt();
992
+ break;
993
+ case "minecraft:repairable":
994
+ data["minecraft:repairable"] = this.readIdSet();
995
+ break;
996
+ case "minecraft:salmon/size":
997
+ data["minecraft:salmon/size"] = this.readVarInt();
998
+ break;
999
+ case "minecraft:sheep/color":
1000
+ data["minecraft:sheep/color"] = this.readVarInt();
1001
+ break;
1002
+ case "minecraft:shulker/color":
1003
+ data["minecraft:shulker/color"] = this.readVarInt();
1004
+ break;
1005
+ case "minecraft:stored_enchantments":
1006
+ data["minecraft:stored_enchantments"] = this.readPrefixedArray(decoder => ({
1007
+ typeId: decoder.readVarInt(),
1008
+ level: decoder.readVarInt()
1009
+ }));
1010
+ break;
1011
+ case "minecraft:sulfur_cube_content":
1012
+ data["minecraft:sulfur_cube_content"] = this.readSlot();
1013
+ break;
1014
+ case "minecraft:suspicious_stew_effects":
1015
+ data["minecraft:suspicious_stew_effects"] = this.readPrefixedArray(decoder => ({
1016
+ typeId: this.readVarInt(),
1017
+ duration: this.readVarInt()
1018
+ }));
1019
+ break;
1020
+ case "minecraft:swing_animation":
1021
+ data["minecraft:swing_animation"] = {
1022
+ type: this.readVarInt(),
1023
+ duration: this.readVarInt()
1024
+ };
1025
+ break;
1026
+ case "minecraft:tool":
1027
+ data["minecraft:tool"] = {
1028
+ rules: this.readPrefixedArray(decoder => ({
1029
+ blocks: this.readIdSet(),
1030
+ speed: this.readPrefixedOptional(decoder => decoder.readFloat()),
1031
+ correctDropForBlock: this.readPrefixedOptional(decoder => decoder.readBoolean())
1032
+ }))
1033
+ };
1034
+ break;
1035
+ case "minecraft:tooltip_display":
1036
+ data["minecraft:tooltip_display"] = {
1037
+ hideTooltip: this.readBoolean(),
1038
+ hiddenComponents: this.readPrefixedArray(decoder => decoder.readVarInt())
1039
+ };
1040
+ break;
1041
+ case "minecraft:tooltip_style":
1042
+ data["minecraft:tooltip_style"] = this.readString();
1043
+ break;
1044
+ case "minecraft:trim":
1045
+ data["minecraft:trim"] = {
1046
+ material: this.readIdOrX(decoder => decoder.readTrimMaterial()),
1047
+ pattern: this.readIdOrX(decoder => decoder.readTrimPattern())
1048
+ };
1049
+ break;
1050
+ case "minecraft:tropical_fish/base_color":
1051
+ data["minecraft:tropical_fish/base_color"] = this.readVarInt();
1052
+ break;
1053
+ case "minecraft:tropical_fish/pattern":
1054
+ data["minecraft:tropical_fish/pattern"] = this.readVarInt();
1055
+ break;
1056
+ case "minecraft:tropical_fish/pattern_color":
1057
+ data["minecraft:tropical_fish/pattern_color"] = this.readVarInt();
1058
+ break;
1059
+ case "minecraft:unbreakable":
1060
+ data["minecraft:unbreakable"] = {};
1061
+ break;
1062
+ case "minecraft:use_cooldown":
1063
+ data["minecraft:use_cooldown"] = {
1064
+ seconds: this.readFloat(),
1065
+ cooldownGroup: this.readPrefixedOptional(decoder => decoder.readString())
1066
+ };
1067
+ break;
1068
+ case "minecraft:use_effects":
1069
+ data["minecraft:use_effects"] = {
1070
+ canSprint: this.readBoolean(),
1071
+ interactVibrations: this.readBoolean(),
1072
+ speedMultiplier: this.readFloat()
1073
+ };
1074
+ break;
1075
+ case "minecraft:use_remainder":
1076
+ data["minecraft:use_remainder"] = this.readSlot();
1077
+ break;
1078
+ case "minecraft:villager/variant":
1079
+ data["minecraft:villager/variant"] = this.readVarInt();
1080
+ break;
1081
+ case "minecraft:weapon":
1082
+ data["minecraft:weapon"] = {
1083
+ damagePerAttack: this.readVarInt(),
1084
+ disableBlockFor: this.readFloat()
1085
+ };
1086
+ break;
1087
+ case "minecraft:wolf/collar":
1088
+ data["minecraft:wolf/collar"] = this.readVarInt();
1089
+ break;
1090
+ case "minecraft:wolf/sound_variant":
1091
+ data["minecraft:wolf/sound_variant"] = this.readVarInt();
1092
+ break;
1093
+ case "minecraft:wolf/variant":
1094
+ data["minecraft:wolf/variant"] = this.readVarInt();
1095
+ break;
1096
+ case "minecraft:writable_book_content":
1097
+ data["minecraft:writable_book_content"] = this.readPrefixedArray(decoder => ({
1098
+ rawContent: decoder.readString(),
1099
+ filteredContent: decoder.readPrefixedOptional(decoder => decoder.readString())
1100
+ }));
1101
+ break;
1102
+ case "minecraft:written_book_content":
1103
+ data["minecraft:written_book_content"] = {
1104
+ rawTitle: this.readString(),
1105
+ filteredTitle: this.readPrefixedOptional(decoder => decoder.readString()),
1106
+ author: this.readString(),
1107
+ generation: this.readVarInt(),
1108
+ pages: this.readPrefixedArray(decoder => ({
1109
+ rawContent: decoder.readString(),
1110
+ filteredContent: decoder.readPrefixedOptional(decoder => decoder.readString())
1111
+ })),
1112
+ resolved: this.readBoolean()
1113
+ };
1114
+ break;
1115
+ case "minecraft:zombie_nautilus/variant":
1116
+ data["minecraft:zombie_nautilus/variant"] = this.readVarInt();
1117
+ break;
1118
+ }
1119
+ return data;
1120
+ }
1121
+
1122
+ /**
1123
+ * Represent the data of a slot
1124
+ *
1125
+ * @see https://minecraft.wiki/w/Java_Edition_protocol/Slot_data#Format
1126
+ */
1127
+ public readSlot(): Slot {
1128
+ const counts = this.readVarInt(),
1129
+ itemId = counts ? this.readVarInt() : undefined,
1130
+ addCount = counts ? this.readVarInt() : undefined,
1131
+ removeCount = counts ? this.readVarInt() : undefined,
1132
+ addComponents = addCount ? this.readArray(addCount, decoder => decoder.readComponent())
1133
+ .reduce((prev, curr) => {
1134
+ Object.keys(curr).forEach(key => prev[key] = curr[key]);
1135
+ return prev;
1136
+ }, {}) : undefined,
1137
+ removeComponents = removeCount ? this.readArray(removeCount, decoder => decoder.readVarInt()) : undefined;
1138
+ return { counts, itemId, addComponents, removeComponents };
1139
+ }
451
1140
  }
452
1141
 
453
1142
  export class NBTDecoder extends BinaryDecoder {