@vaitosoi/minejs 0.5.1 → 0.6.1

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