366 if (data.size() == 0)
372 size_t length = data.size();
376 const unsigned char index = ProtocolCraft::ReadData<unsigned char>(iter, length);
382 const int type = ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length);
385 enum EntityMetadataTypes
389#if PROTOCOL_VERSION > 760
395#if PROTOCOL_VERSION > 340
402 OptionalBlockPosition,
404#if PROTOCOL_VERSION > 769
405 OptionalLivingEntityReference,
410#if PROTOCOL_VERSION > 761
413#if PROTOCOL_VERSION < 773
416#if PROTOCOL_VERSION > 340
419#if PROTOCOL_VERSION > 765
422#if PROTOCOL_VERSION > 404
427#if PROTOCOL_VERSION > 758
430#if PROTOCOL_VERSION > 769
433#if PROTOCOL_VERSION > 765
436#if PROTOCOL_VERSION > 769
439#if PROTOCOL_VERSION > 758
442#if PROTOCOL_VERSION > 769
446#if PROTOCOL_VERSION > 758
450#if PROTOCOL_VERSION > 761
452#if PROTOCOL_VERSION > 765
455#if PROTOCOL_VERSION > 772
457 WeatheringCopperState,
461#if PROTOCOL_VERSION > 772
469 case EntityMetadataTypes::Char:
470 value = ProtocolCraft::ReadData<char>(iter, length);
472 case EntityMetadataTypes::Int:
473 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
475#if PROTOCOL_VERSION > 760
476 case EntityMetadataTypes::Long:
477 value =
static_cast<long long int>(ProtocolCraft::ReadData<ProtocolCraft::VarLong>(iter, length));
480 case EntityMetadataTypes::Float:
481 value = ProtocolCraft::ReadData<float>(iter, length);
483 case EntityMetadataTypes::String:
484 value = ProtocolCraft::ReadData<std::string>(iter, length);
486 case EntityMetadataTypes::Chat:
488 std::any_cast<ProtocolCraft::Chat&>(value).Read(iter, length);
490#if PROTOCOL_VERSION > 340
491 case EntityMetadataTypes::OptionalChat:
492 if (ProtocolCraft::ReadData<bool>(iter, length))
495 std::any_cast<std::optional<ProtocolCraft::Chat>&>(value).value().Read(iter, length);
499 value = std::optional<ProtocolCraft::Chat>();
503 case EntityMetadataTypes::Slot:
505 std::any_cast<ProtocolCraft::Slot&>(value).Read(iter, length);
507 case EntityMetadataTypes::Bool:
508 value = ProtocolCraft::ReadData<bool>(iter, length);
510 case EntityMetadataTypes::Rotations:
513 for (
int i = 0; i < 3; ++i)
515 rotation[i] = ProtocolCraft::ReadData<float>(iter, length);
520 case EntityMetadataTypes::BlockPosition:
527 case EntityMetadataTypes::OptionalBlockPosition:
528 if (ProtocolCraft::ReadData<bool>(iter, length))
532 value = std::optional<Position>(
position);
536 value = std::optional<Position>();
539 case EntityMetadataTypes::DirectionType:
540 value =
static_cast<Direction>(
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length)));
542#if PROTOCOL_VERSION > 769
543 case EntityMetadataTypes::OptionalLivingEntityReference:
545 case EntityMetadataTypes::OptionalUUID:
547 if (ProtocolCraft::ReadData<bool>(iter, length))
549 value = std::optional<ProtocolCraft::UUID>(ProtocolCraft::ReadData<ProtocolCraft::UUID>(iter, length));
553 value = std::optional<ProtocolCraft::UUID>();
556 case EntityMetadataTypes::BlockstateType:
557 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
559#if PROTOCOL_VERSION > 761
560 case EntityMetadataTypes::OptionalBlockstate:
561 if (
const int n = ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length))
563 value = std::optional<int>(n);
567 value = std::optional<int>();
571#if PROTOCOL_VERSION < 773
572 case EntityMetadataTypes::NBT:
575 unnamed_value.
Read(iter, length);
580#if PROTOCOL_VERSION > 340
581 case EntityMetadataTypes::Particle:
584 particle.
Read(iter, length);
589#if PROTOCOL_VERSION > 765
590 case EntityMetadataTypes::Particles:
591 value = ProtocolCraft::ReadData<std::vector<ProtocolCraft::Particle>>(iter, length);
594#if PROTOCOL_VERSION > 404
595 case EntityMetadataTypes::VillagerDataType:
597 ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length),
598 ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length),
599 ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length)
602 case EntityMetadataTypes::OptionalUint:
604 const int val = ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length);
605 value = val > 0 ? std::optional<int>(val - 1) : std::optional<int>();
608 case EntityMetadataTypes::PoseType:
609 value =
static_cast<Pose>(
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length)));
612#if PROTOCOL_VERSION > 758
613 case EntityMetadataTypes::CatVariant:
614 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
617#if PROTOCOL_VERSION > 769
618 case EntityMetadataTypes::CowVariant:
619 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
622#if PROTOCOL_VERSION > 765
623 case EntityMetadataTypes::WolfVariant:
624 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
627#if PROTOCOL_VERSION > 769
628 case EntityMetadataTypes::WolfSoundVariant:
629 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
632#if PROTOCOL_VERSION > 758
633 case EntityMetadataTypes::FrogVariant:
634 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
637#if PROTOCOL_VERSION > 769
638 case EntityMetadataTypes::PigVariant:
639 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
641 case EntityMetadataTypes::ChickenVariant:
642 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
645#if PROTOCOL_VERSION > 758
646 case EntityMetadataTypes::OptionalGlobalPos:
647 if (ProtocolCraft::ReadData<bool>(iter, length))
650 dimension.
Read(iter, length);
652 pos.
Read(iter, length);
654 value = std::optional<GlobalPos>({
661 value = std::optional<GlobalPos>();
664 case EntityMetadataTypes::PaintingVariant:
665 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
668#if PROTOCOL_VERSION > 761
669 case EntityMetadataTypes::SnifferState:
670 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
672#if PROTOCOL_VERSION > 765
673 case EntityMetadataTypes::ArmadilloState:
674 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
677#if PROTOCOL_VERSION > 772
678 case EntityMetadataTypes::CopperGolemState:
679 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
681 case EntityMetadataTypes::WeatheringCopperState:
682 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
685 case EntityMetadataTypes::Vec3:
687 const float x = ProtocolCraft::ReadData<float>(iter, length);
688 const float y = ProtocolCraft::ReadData<float>(iter, length);
689 const float z = ProtocolCraft::ReadData<float>(iter, length);
693 case EntityMetadataTypes::Quaternion:
695 const float x = ProtocolCraft::ReadData<float>(iter, length);
696 const float y = ProtocolCraft::ReadData<float>(iter, length);
697 const float z = ProtocolCraft::ReadData<float>(iter, length);
698 const float w = ProtocolCraft::ReadData<float>(iter, length);
699 value = std::array<float, 4>{x, y, z, w};
703#if PROTOCOL_VERSION > 772
704 case EntityMetadataTypes::ResolvableProfile:
705 value = ProtocolCraft::ReadData<ProtocolCraft::Components::DataComponentTypeResolvableProfile>(iter, length);
709 LOG_ERROR(
"Unknown type in entity metadata : " << type <<
".Stopping current metadata parsing.");
1504#if PROTOCOL_VERSION > 758
1506 return std::make_shared<AllayEntity>();
1509 return std::make_shared<AreaEffectCloudEntity>();
1510#if PROTOCOL_VERSION > 765
1512 return std::make_shared<ArmadilloEntity>();
1515 return std::make_shared<ArmorStandEntity>();
1517 return std::make_shared<ArrowEntity>();
1518#if PROTOCOL_VERSION > 754
1520 return std::make_shared<AxolotlEntity>();
1523 return std::make_shared<BatEntity>();
1524#if PROTOCOL_VERSION > 498
1526 return std::make_shared<BeeEntity>();
1529 return std::make_shared<BlazeEntity>();
1530#if PROTOCOL_VERSION < 768
1531 case EntityType::Boat:
1532 return std::make_shared<BoatEntity>();
1543 return std::make_shared<BoatEntity>(type);
1545#if PROTOCOL_VERSION > 765
1547 return std::make_shared<BoggedEntity>();
1549#if PROTOCOL_VERSION > 764
1551 return std::make_shared<BreezeEntity>();
1553#if PROTOCOL_VERSION > 765
1555 return std::make_shared<BreezeWindChargeEntity>();
1557#if PROTOCOL_VERSION > 758
1558#if PROTOCOL_VERSION < 768
1559 case EntityType::ChestBoat:
1560 return std::make_shared<ChestBoatEntity>();
1571 return std::make_shared<ChestBoatEntity>(type);
1574#if PROTOCOL_VERSION > 767
1576 return std::make_shared<ChestRaftEntity>(type);
1578#if PROTOCOL_VERSION > 404
1580 return std::make_shared<CatEntity>();
1582#if PROTOCOL_VERSION > 760
1584 return std::make_shared<CamelEntity>();
1587 return std::make_shared<CaveSpiderEntity>();
1589 return std::make_shared<ChickenEntity>();
1590#if PROTOCOL_VERSION > 340
1592 return std::make_shared<CodEntity>();
1594#if PROTOCOL_VERSION > 772
1596 return std::make_shared<CopperGolemEntity>();
1599 return std::make_shared<CowEntity>();
1600#if PROTOCOL_VERSION > 767
1602 return std::make_shared<CreakingEntity>();
1604#if PROTOCOL_VERSION > 767 && PROTOCOL_VERSION < 769
1605 case EntityType::CreakingTransient:
1606 return std::make_shared<CreakingTransientEntity>();
1609 return std::make_shared<CreeperEntity>();
1610#if PROTOCOL_VERSION > 761
1612 return std::make_shared<DisplayBlockDisplayEntity>();
1614 return std::make_shared<DisplayItemDisplayEntity>();
1616 return std::make_shared<DisplayTextDisplayEntity>();
1618#if PROTOCOL_VERSION > 340
1620 return std::make_shared<DolphinEntity>();
1623 return std::make_shared<DonkeyEntity>();
1625 return std::make_shared<DragonFireballEntity>();
1626#if PROTOCOL_VERSION > 340
1628 return std::make_shared<DrownedEntity>();
1631 return std::make_shared<ElderGuardianEntity>();
1633 return std::make_shared<EndCrystalEntity>();
1635 return std::make_shared<EnderDragonEntity>();
1637 return std::make_shared<EnderManEntity>();
1639 return std::make_shared<EndermiteEntity>();
1641 return std::make_shared<EvokerEntity>();
1643 return std::make_shared<EvokerFangsEntity>();
1645 return std::make_shared<ExperienceOrbEntity>();
1647 return std::make_shared<EyeOfEnderEntity>();
1649 return std::make_shared<FallingBlockEntity>();
1651 return std::make_shared<FireworkRocketEntity>();
1652#if PROTOCOL_VERSION > 404
1654 return std::make_shared<FoxEntity>();
1656#if PROTOCOL_VERSION > 758
1658 return std::make_shared<FrogEntity>();
1661 return std::make_shared<GhastEntity>();
1662#if PROTOCOL_VERSION > 770
1664 return std::make_shared<HappyGhastEntity>();
1667 return std::make_shared<GiantEntity>();
1668#if PROTOCOL_VERSION > 754
1670 return std::make_shared<GlowItemFrameEntity>();
1672 return std::make_shared<GlowSquidEntity>();
1674 return std::make_shared<GoatEntity>();
1677 return std::make_shared<GuardianEntity>();
1678#if PROTOCOL_VERSION > 578
1680 return std::make_shared<HoglinEntity>();
1683 return std::make_shared<HorseEntity>();
1685 return std::make_shared<HuskEntity>();
1687 return std::make_shared<IllusionerEntity>();
1688#if PROTOCOL_VERSION > 761
1690 return std::make_shared<InteractionEntity>();
1693 return std::make_shared<IronGolemEntity>();
1695 return std::make_shared<ItemEntity>();
1697 return std::make_shared<ItemFrameEntity>();
1698#if PROTOCOL_VERSION > 765
1700 return std::make_shared<OminousItemSpawnerEntity>();
1703 return std::make_shared<LargeFireballEntity>();
1705 return std::make_shared<LeashFenceKnotEntity>();
1706#if PROTOCOL_VERSION > 340
1708 return std::make_shared<LightningBoltEntity>();
1711 return std::make_shared<LlamaEntity>();
1713 return std::make_shared<LlamaSpitEntity>();
1715 return std::make_shared<MagmaCubeEntity>();
1716#if PROTOCOL_VERSION > 772
1718 return std::make_shared<MannequinEntity>();
1720#if PROTOCOL_VERSION > 754
1722 return std::make_shared<MarkerEntity>();
1725 return std::make_shared<MinecartEntity>();
1727 return std::make_shared<MinecartChestEntity>();
1729 return std::make_shared<MinecartCommandBlockEntity>();
1731 return std::make_shared<MinecartFurnaceEntity>();
1733 return std::make_shared<MinecartHopperEntity>();
1735 return std::make_shared<MinecartSpawnerEntity>();
1737 return std::make_shared<MinecartTNTEntity>();
1739 return std::make_shared<MuleEntity>();
1741 return std::make_shared<MushroomCowEntity>();
1743 return std::make_shared<OcelotEntity>();
1745 return std::make_shared<PaintingEntity>();
1746#if PROTOCOL_VERSION > 404
1748 return std::make_shared<PandaEntity>();
1751 return std::make_shared<ParrotEntity>();
1752#if PROTOCOL_VERSION > 340
1754 return std::make_shared<PhantomEntity>();
1757 return std::make_shared<PigEntity>();
1758#if PROTOCOL_VERSION > 578
1760 return std::make_shared<PiglinEntity>();
1762#if PROTOCOL_VERSION > 736
1764 return std::make_shared<PiglinBruteEntity>();
1766#if PROTOCOL_VERSION > 404
1768 return std::make_shared<PillagerEntity>();
1771 return std::make_shared<PolarBearEntity>();
1773 return std::make_shared<PrimedTntEntity>();
1774#if PROTOCOL_VERSION > 340
1776 return std::make_shared<PufferfishEntity>();
1779 return std::make_shared<RabbitEntity>();
1780#if PROTOCOL_VERSION > 767
1782 return std::make_shared<RaftEntity>(type);
1784#if PROTOCOL_VERSION > 404
1786 return std::make_shared<RavagerEntity>();
1788#if PROTOCOL_VERSION > 340
1790 return std::make_shared<SalmonEntity>();
1793 return std::make_shared<SheepEntity>();
1795 return std::make_shared<ShulkerEntity>();
1797 return std::make_shared<ShulkerBulletEntity>();
1799 return std::make_shared<SilverfishEntity>();
1801 return std::make_shared<SkeletonEntity>();
1803 return std::make_shared<SkeletonHorseEntity>();
1805 return std::make_shared<SlimeEntity>();
1807 return std::make_shared<SmallFireballEntity>();
1808#if PROTOCOL_VERSION > 761
1810 return std::make_shared<SnifferEntity>();
1813 return std::make_shared<SnowGolemEntity>();
1815 return std::make_shared<SnowballEntity>();
1817 return std::make_shared<SpectralArrowEntity>();
1819 return std::make_shared<SpiderEntity>();
1821 return std::make_shared<SquidEntity>();
1823 return std::make_shared<StrayEntity>();
1824#if PROTOCOL_VERSION > 578
1826 return std::make_shared<StriderEntity>();
1828#if PROTOCOL_VERSION > 758
1830 return std::make_shared<TadpoleEntity>();
1833 return std::make_shared<ThrownEggEntity>();
1835 return std::make_shared<ThrownEnderpearlEntity>();
1837 return std::make_shared<ThrownExperienceBottleEntity>();
1838#if PROTOCOL_VERSION < 770
1839 case EntityType::ThrownPotion:
1840 return std::make_shared<ThrownPotionEntity>();
1843 return std::make_shared<ThrownSplashPotionEntity>();
1845 return std::make_shared<ThrownLingeringPotionEntity>();
1847#if PROTOCOL_VERSION > 340
1849 return std::make_shared<ThrownTridentEntity>();
1851#if PROTOCOL_VERSION > 404
1853 return std::make_shared<TraderLlamaEntity>();
1855#if PROTOCOL_VERSION > 340
1857 return std::make_shared<TropicalFishEntity>();
1859#if PROTOCOL_VERSION > 340
1861 return std::make_shared<TurtleEntity>();
1864 return std::make_shared<VexEntity>();
1866 return std::make_shared<VillagerEntity>();
1868 return std::make_shared<VindicatorEntity>();
1869#if PROTOCOL_VERSION > 404
1871 return std::make_shared<WanderingTraderEntity>();
1873#if PROTOCOL_VERSION > 758
1875 return std::make_shared<WardenEntity>();
1877#if PROTOCOL_VERSION > 764
1879 return std::make_shared<WindChargeEntity>();
1882 return std::make_shared<WitchEntity>();
1884 return std::make_shared<WitherBossEntity>();
1886 return std::make_shared<WitherSkeletonEntity>();
1888 return std::make_shared<WitherSkullEntity>();
1890 return std::make_shared<WolfEntity>();
1891#if PROTOCOL_VERSION > 578
1893 return std::make_shared<ZoglinEntity>();
1896 return std::make_shared<ZombieEntity>();
1898 return std::make_shared<ZombieHorseEntity>();
1900 return std::make_shared<ZombieVillagerEntity>();
1901#if PROTOCOL_VERSION > 578
1903 return std::make_shared<ZombifiedPiglinEntity>();
1905 case EntityType::PigZombie:
1906 return std::make_shared<PigZombieEntity>();
1909 return std::make_shared<PlayerEntity>();
1910#if PROTOCOL_VERSION > 340
1912 return std::make_shared<FishingHookEntity>();
1991 std::scoped_lock<std::shared_mutex> lock(
entity_mutex);
1996 faces = std::vector<Renderer::Face>(6);
1999 for (
int i = 0; i < 6; ++i)
2007 face_descriptors[i].transformations.scales.push_back(std::make_shared<Renderer::Scale>(
2008 static_cast<float>(half_width),
2009 static_cast<float>(half_height),
2010 static_cast<float>(half_width)
2013 face_descriptors[i].transformations.translations.push_back(std::make_shared<Renderer::Translation>(0.0f,
static_cast<float>(half_height), 0.0f));
2015 face_descriptors[i].transformations.translations.push_back(std::make_shared<Renderer::Translation>(
2021 face_descriptors[i].transformations.rotations.push_back(std::make_shared<Renderer::Rotation>(0.0f, 1.0f, 0.0f,
yaw));
2022 face_descriptors[i].transformations.rotations.push_back(std::make_shared<Renderer::Rotation>(1.0f, 0.0f, 0.0f,
pitch));
2027 faces[i].SetDisplayBackface(
false);
2028 faces[i].SetTextureMultipliers({ 0xFFFFFFFF, 0xFFFFFFFF });
2031 std::array<unsigned short, 4> texture_pos = { 0, 0, 0, 0 };
2032 std::array<unsigned short, 4> texture_size = { 0, 0, 0, 0 };
2036 for (
int j = 0; j < std::min(2, static_cast<int>(
face_descriptors[i].texture_names.size())); ++j)
2039 std::tie(texture_pos[2 * j + 0], texture_pos[2 * j + 1]) = texture_data.
position;
2040 std::tie(texture_size[2 * j + 0], texture_size[2 * j + 1]) = texture_data.
size;
2046 std::array<float, 4> coords =
faces[i].GetTextureCoords(
false);
2048 coords[0] = (texture_pos[0] + coords[0] / 16.0f * texture_size[0]) / atlas->
GetWidth();
2049 coords[1] = (texture_pos[1] + coords[1] / 16.0f * height_normalizer) / atlas->
GetHeight();
2050 coords[2] = (texture_pos[0] + coords[2] / 16.0f * texture_size[0]) / atlas->
GetWidth();
2051 coords[3] = (texture_pos[1] + coords[3] / 16.0f * height_normalizer) / atlas->
GetHeight();
2052 faces[i].SetTextureCoords(coords,
false);
2057 coords =
faces[i].GetTextureCoords(
true);
2059 coords[0] = (texture_pos[2] + coords[0] / 16.0f * texture_size[2]) / atlas->
GetWidth();
2060 coords[1] = (texture_pos[3] + coords[1] / 16.0f * height_normalizer) / atlas->
GetHeight();
2061 coords[2] = (texture_pos[2] + coords[2] / 16.0f * texture_size[2]) / atlas->
GetWidth();
2062 coords[3] = (texture_pos[3] + coords[3] / 16.0f * height_normalizer) / atlas->
GetHeight();
2063 faces[i].SetTextureCoords(coords,
true);
2066 faces[i].SetTransparencyData(transparencies[0]);