369 if (data.size() == 0)
375 size_t length = data.size();
379 const unsigned char index = ProtocolCraft::ReadData<unsigned char>(iter, length);
385 const int type = ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length);
388 enum EntityMetadataTypes
392#if PROTOCOL_VERSION > 760
398#if PROTOCOL_VERSION > 340
405 OptionalBlockPosition,
407#if PROTOCOL_VERSION > 769
408 OptionalLivingEntityReference,
413#if PROTOCOL_VERSION > 761
416#if PROTOCOL_VERSION < 773
419#if PROTOCOL_VERSION > 340
422#if PROTOCOL_VERSION > 765
425#if PROTOCOL_VERSION > 404
430#if PROTOCOL_VERSION > 758
433#if PROTOCOL_VERSION > 769
436#if PROTOCOL_VERSION > 765
439#if PROTOCOL_VERSION > 769
442#if PROTOCOL_VERSION > 758
445#if PROTOCOL_VERSION > 769
449#if PROTOCOL_VERSION > 758
453#if PROTOCOL_VERSION > 761
455#if PROTOCOL_VERSION > 765
458#if PROTOCOL_VERSION > 772
460 WeatheringCopperState,
464#if PROTOCOL_VERSION > 772
472 case EntityMetadataTypes::Char:
473 value = ProtocolCraft::ReadData<char>(iter, length);
475 case EntityMetadataTypes::Int:
476 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
478#if PROTOCOL_VERSION > 760
479 case EntityMetadataTypes::Long:
480 value =
static_cast<long long int>(ProtocolCraft::ReadData<ProtocolCraft::VarLong>(iter, length));
483 case EntityMetadataTypes::Float:
484 value = ProtocolCraft::ReadData<float>(iter, length);
486 case EntityMetadataTypes::String:
487 value = ProtocolCraft::ReadData<std::string>(iter, length);
489 case EntityMetadataTypes::Chat:
491 std::any_cast<ProtocolCraft::Chat&>(value).Read(iter, length);
493#if PROTOCOL_VERSION > 340
494 case EntityMetadataTypes::OptionalChat:
495 if (ProtocolCraft::ReadData<bool>(iter, length))
498 std::any_cast<std::optional<ProtocolCraft::Chat>&>(value).value().Read(iter, length);
502 value = std::optional<ProtocolCraft::Chat>();
506 case EntityMetadataTypes::Slot:
508 std::any_cast<ProtocolCraft::Slot&>(value).Read(iter, length);
510 case EntityMetadataTypes::Bool:
511 value = ProtocolCraft::ReadData<bool>(iter, length);
513 case EntityMetadataTypes::Rotations:
516 for (
int i = 0; i < 3; ++i)
518 rotation[i] = ProtocolCraft::ReadData<float>(iter, length);
523 case EntityMetadataTypes::BlockPosition:
530 case EntityMetadataTypes::OptionalBlockPosition:
531 if (ProtocolCraft::ReadData<bool>(iter, length))
535 value = std::optional<Position>(
position);
539 value = std::optional<Position>();
542 case EntityMetadataTypes::DirectionType:
543 value =
static_cast<Direction>(
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length)));
545#if PROTOCOL_VERSION > 769
546 case EntityMetadataTypes::OptionalLivingEntityReference:
548 case EntityMetadataTypes::OptionalUUID:
550 if (ProtocolCraft::ReadData<bool>(iter, length))
552 value = std::optional<ProtocolCraft::UUID>(ProtocolCraft::ReadData<ProtocolCraft::UUID>(iter, length));
556 value = std::optional<ProtocolCraft::UUID>();
559 case EntityMetadataTypes::BlockstateType:
560 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
562#if PROTOCOL_VERSION > 761
563 case EntityMetadataTypes::OptionalBlockstate:
564 if (
const int n = ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length))
566 value = std::optional<int>(n);
570 value = std::optional<int>();
574#if PROTOCOL_VERSION < 773
575 case EntityMetadataTypes::NBT:
578 unnamed_value.
Read(iter, length);
583#if PROTOCOL_VERSION > 340
584 case EntityMetadataTypes::Particle:
587 particle.
Read(iter, length);
592#if PROTOCOL_VERSION > 765
593 case EntityMetadataTypes::Particles:
594 value = ProtocolCraft::ReadData<std::vector<ProtocolCraft::Particle>>(iter, length);
597#if PROTOCOL_VERSION > 404
598 case EntityMetadataTypes::VillagerDataType:
600 ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length),
601 ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length),
602 ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length)
605 case EntityMetadataTypes::OptionalUint:
607 const int val = ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length);
608 value = val > 0 ? std::optional<int>(val - 1) : std::optional<int>();
611 case EntityMetadataTypes::PoseType:
612 value =
static_cast<Pose>(
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length)));
615#if PROTOCOL_VERSION > 758
616 case EntityMetadataTypes::CatVariant:
617 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
620#if PROTOCOL_VERSION > 769
621 case EntityMetadataTypes::CowVariant:
622 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
625#if PROTOCOL_VERSION > 765
626 case EntityMetadataTypes::WolfVariant:
627 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
630#if PROTOCOL_VERSION > 769
631 case EntityMetadataTypes::WolfSoundVariant:
632 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
635#if PROTOCOL_VERSION > 758
636 case EntityMetadataTypes::FrogVariant:
637 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
640#if PROTOCOL_VERSION > 769
641 case EntityMetadataTypes::PigVariant:
642 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
644 case EntityMetadataTypes::ChickenVariant:
645 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
648#if PROTOCOL_VERSION > 758
649 case EntityMetadataTypes::OptionalGlobalPos:
650 if (ProtocolCraft::ReadData<bool>(iter, length))
653 dimension.
Read(iter, length);
655 pos.
Read(iter, length);
657 value = std::optional<GlobalPos>({
664 value = std::optional<GlobalPos>();
667 case EntityMetadataTypes::PaintingVariant:
668 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
671#if PROTOCOL_VERSION > 761
672 case EntityMetadataTypes::SnifferState:
673 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
675#if PROTOCOL_VERSION > 765
676 case EntityMetadataTypes::ArmadilloState:
677 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
680#if PROTOCOL_VERSION > 772
681 case EntityMetadataTypes::CopperGolemState:
682 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
684 case EntityMetadataTypes::WeatheringCopperState:
685 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
688 case EntityMetadataTypes::Vec3:
690 const float x = ProtocolCraft::ReadData<float>(iter, length);
691 const float y = ProtocolCraft::ReadData<float>(iter, length);
692 const float z = ProtocolCraft::ReadData<float>(iter, length);
696 case EntityMetadataTypes::Quaternion:
698 const float x = ProtocolCraft::ReadData<float>(iter, length);
699 const float y = ProtocolCraft::ReadData<float>(iter, length);
700 const float z = ProtocolCraft::ReadData<float>(iter, length);
701 const float w = ProtocolCraft::ReadData<float>(iter, length);
702 value = std::array<float, 4>{x, y, z, w};
706#if PROTOCOL_VERSION > 772
707 case EntityMetadataTypes::ResolvableProfile:
708 value = ProtocolCraft::ReadData<ProtocolCraft::Components::DataComponentTypeResolvableProfile>(iter, length);
712 LOG_ERROR(
"Unknown type in entity metadata : " << type <<
".Stopping current metadata parsing.");
1507#if PROTOCOL_VERSION > 758
1509 return std::make_shared<AllayEntity>();
1512 return std::make_shared<AreaEffectCloudEntity>();
1513#if PROTOCOL_VERSION > 765
1515 return std::make_shared<ArmadilloEntity>();
1518 return std::make_shared<ArmorStandEntity>();
1520 return std::make_shared<ArrowEntity>();
1521#if PROTOCOL_VERSION > 754
1523 return std::make_shared<AxolotlEntity>();
1526 return std::make_shared<BatEntity>();
1527#if PROTOCOL_VERSION > 498
1529 return std::make_shared<BeeEntity>();
1532 return std::make_shared<BlazeEntity>();
1533#if PROTOCOL_VERSION < 768
1534 case EntityType::Boat:
1535 return std::make_shared<BoatEntity>();
1546 return std::make_shared<BoatEntity>(type);
1548#if PROTOCOL_VERSION > 765
1550 return std::make_shared<BoggedEntity>();
1552#if PROTOCOL_VERSION > 764
1554 return std::make_shared<BreezeEntity>();
1556#if PROTOCOL_VERSION > 765
1558 return std::make_shared<BreezeWindChargeEntity>();
1560#if PROTOCOL_VERSION > 758
1561#if PROTOCOL_VERSION < 768
1562 case EntityType::ChestBoat:
1563 return std::make_shared<ChestBoatEntity>();
1574 return std::make_shared<ChestBoatEntity>(type);
1577#if PROTOCOL_VERSION > 767
1579 return std::make_shared<ChestRaftEntity>(type);
1581#if PROTOCOL_VERSION > 404
1583 return std::make_shared<CatEntity>();
1585#if PROTOCOL_VERSION > 760
1587 return std::make_shared<CamelEntity>();
1590 return std::make_shared<CaveSpiderEntity>();
1592 return std::make_shared<ChickenEntity>();
1593#if PROTOCOL_VERSION > 340
1595 return std::make_shared<CodEntity>();
1597#if PROTOCOL_VERSION > 772
1599 return std::make_shared<CopperGolemEntity>();
1602 return std::make_shared<CowEntity>();
1603#if PROTOCOL_VERSION > 767
1605 return std::make_shared<CreakingEntity>();
1607#if PROTOCOL_VERSION > 767 && PROTOCOL_VERSION < 769
1608 case EntityType::CreakingTransient:
1609 return std::make_shared<CreakingTransientEntity>();
1612 return std::make_shared<CreeperEntity>();
1613#if PROTOCOL_VERSION > 761
1615 return std::make_shared<DisplayBlockDisplayEntity>();
1617 return std::make_shared<DisplayItemDisplayEntity>();
1619 return std::make_shared<DisplayTextDisplayEntity>();
1621#if PROTOCOL_VERSION > 340
1623 return std::make_shared<DolphinEntity>();
1626 return std::make_shared<DonkeyEntity>();
1628 return std::make_shared<DragonFireballEntity>();
1629#if PROTOCOL_VERSION > 340
1631 return std::make_shared<DrownedEntity>();
1634 return std::make_shared<ElderGuardianEntity>();
1636 return std::make_shared<EndCrystalEntity>();
1638 return std::make_shared<EnderDragonEntity>();
1640 return std::make_shared<EnderManEntity>();
1642 return std::make_shared<EndermiteEntity>();
1644 return std::make_shared<EvokerEntity>();
1646 return std::make_shared<EvokerFangsEntity>();
1648 return std::make_shared<ExperienceOrbEntity>();
1650 return std::make_shared<EyeOfEnderEntity>();
1652 return std::make_shared<FallingBlockEntity>();
1654 return std::make_shared<FireworkRocketEntity>();
1655#if PROTOCOL_VERSION > 404
1657 return std::make_shared<FoxEntity>();
1659#if PROTOCOL_VERSION > 758
1661 return std::make_shared<FrogEntity>();
1664 return std::make_shared<GhastEntity>();
1665#if PROTOCOL_VERSION > 770
1667 return std::make_shared<HappyGhastEntity>();
1670 return std::make_shared<GiantEntity>();
1671#if PROTOCOL_VERSION > 754
1673 return std::make_shared<GlowItemFrameEntity>();
1675 return std::make_shared<GlowSquidEntity>();
1677 return std::make_shared<GoatEntity>();
1680 return std::make_shared<GuardianEntity>();
1681#if PROTOCOL_VERSION > 578
1683 return std::make_shared<HoglinEntity>();
1686 return std::make_shared<HorseEntity>();
1688 return std::make_shared<HuskEntity>();
1690 return std::make_shared<IllusionerEntity>();
1691#if PROTOCOL_VERSION > 761
1693 return std::make_shared<InteractionEntity>();
1696 return std::make_shared<IronGolemEntity>();
1698 return std::make_shared<ItemEntity>();
1700 return std::make_shared<ItemFrameEntity>();
1701#if PROTOCOL_VERSION > 765
1703 return std::make_shared<OminousItemSpawnerEntity>();
1706 return std::make_shared<LargeFireballEntity>();
1708 return std::make_shared<LeashFenceKnotEntity>();
1709#if PROTOCOL_VERSION > 340
1711 return std::make_shared<LightningBoltEntity>();
1714 return std::make_shared<LlamaEntity>();
1716 return std::make_shared<LlamaSpitEntity>();
1718 return std::make_shared<MagmaCubeEntity>();
1719#if PROTOCOL_VERSION > 772
1721 return std::make_shared<MannequinEntity>();
1723#if PROTOCOL_VERSION > 754
1725 return std::make_shared<MarkerEntity>();
1728 return std::make_shared<MinecartEntity>();
1730 return std::make_shared<MinecartChestEntity>();
1732 return std::make_shared<MinecartCommandBlockEntity>();
1734 return std::make_shared<MinecartFurnaceEntity>();
1736 return std::make_shared<MinecartHopperEntity>();
1738 return std::make_shared<MinecartSpawnerEntity>();
1740 return std::make_shared<MinecartTNTEntity>();
1742 return std::make_shared<MuleEntity>();
1744 return std::make_shared<MushroomCowEntity>();
1746 return std::make_shared<OcelotEntity>();
1748 return std::make_shared<PaintingEntity>();
1749#if PROTOCOL_VERSION > 404
1751 return std::make_shared<PandaEntity>();
1754 return std::make_shared<ParrotEntity>();
1755#if PROTOCOL_VERSION > 340
1757 return std::make_shared<PhantomEntity>();
1760 return std::make_shared<PigEntity>();
1761#if PROTOCOL_VERSION > 578
1763 return std::make_shared<PiglinEntity>();
1765#if PROTOCOL_VERSION > 736
1767 return std::make_shared<PiglinBruteEntity>();
1769#if PROTOCOL_VERSION > 404
1771 return std::make_shared<PillagerEntity>();
1774 return std::make_shared<PolarBearEntity>();
1776 return std::make_shared<PrimedTntEntity>();
1777#if PROTOCOL_VERSION > 340
1779 return std::make_shared<PufferfishEntity>();
1782 return std::make_shared<RabbitEntity>();
1783#if PROTOCOL_VERSION > 767
1785 return std::make_shared<RaftEntity>(type);
1787#if PROTOCOL_VERSION > 404
1789 return std::make_shared<RavagerEntity>();
1791#if PROTOCOL_VERSION > 340
1793 return std::make_shared<SalmonEntity>();
1796 return std::make_shared<SheepEntity>();
1798 return std::make_shared<ShulkerEntity>();
1800 return std::make_shared<ShulkerBulletEntity>();
1802 return std::make_shared<SilverfishEntity>();
1804 return std::make_shared<SkeletonEntity>();
1806 return std::make_shared<SkeletonHorseEntity>();
1808 return std::make_shared<SlimeEntity>();
1810 return std::make_shared<SmallFireballEntity>();
1811#if PROTOCOL_VERSION > 761
1813 return std::make_shared<SnifferEntity>();
1816 return std::make_shared<SnowGolemEntity>();
1818 return std::make_shared<SnowballEntity>();
1820 return std::make_shared<SpectralArrowEntity>();
1822 return std::make_shared<SpiderEntity>();
1824 return std::make_shared<SquidEntity>();
1826 return std::make_shared<StrayEntity>();
1827#if PROTOCOL_VERSION > 578
1829 return std::make_shared<StriderEntity>();
1831#if PROTOCOL_VERSION > 758
1833 return std::make_shared<TadpoleEntity>();
1836 return std::make_shared<ThrownEggEntity>();
1838 return std::make_shared<ThrownEnderpearlEntity>();
1840 return std::make_shared<ThrownExperienceBottleEntity>();
1841#if PROTOCOL_VERSION < 770
1842 case EntityType::ThrownPotion:
1843 return std::make_shared<ThrownPotionEntity>();
1846 return std::make_shared<ThrownSplashPotionEntity>();
1848 return std::make_shared<ThrownLingeringPotionEntity>();
1850#if PROTOCOL_VERSION > 340
1852 return std::make_shared<ThrownTridentEntity>();
1854#if PROTOCOL_VERSION > 404
1856 return std::make_shared<TraderLlamaEntity>();
1858#if PROTOCOL_VERSION > 340
1860 return std::make_shared<TropicalFishEntity>();
1862#if PROTOCOL_VERSION > 340
1864 return std::make_shared<TurtleEntity>();
1867 return std::make_shared<VexEntity>();
1869 return std::make_shared<VillagerEntity>();
1871 return std::make_shared<VindicatorEntity>();
1872#if PROTOCOL_VERSION > 404
1874 return std::make_shared<WanderingTraderEntity>();
1876#if PROTOCOL_VERSION > 758
1878 return std::make_shared<WardenEntity>();
1880#if PROTOCOL_VERSION > 764
1882 return std::make_shared<WindChargeEntity>();
1885 return std::make_shared<WitchEntity>();
1887 return std::make_shared<WitherBossEntity>();
1889 return std::make_shared<WitherSkeletonEntity>();
1891 return std::make_shared<WitherSkullEntity>();
1893 return std::make_shared<WolfEntity>();
1894#if PROTOCOL_VERSION > 578
1896 return std::make_shared<ZoglinEntity>();
1899 return std::make_shared<ZombieEntity>();
1901 return std::make_shared<ZombieHorseEntity>();
1903 return std::make_shared<ZombieVillagerEntity>();
1904#if PROTOCOL_VERSION > 578
1906 return std::make_shared<ZombifiedPiglinEntity>();
1908 case EntityType::PigZombie:
1909 return std::make_shared<PigZombieEntity>();
1912 return std::make_shared<PlayerEntity>();
1913#if PROTOCOL_VERSION > 340
1915 return std::make_shared<FishingHookEntity>();
1994 std::scoped_lock<std::shared_mutex> lock(
entity_mutex);
1999 faces = std::vector<Renderer::Face>(6);
2002 for (
int i = 0; i < 6; ++i)
2010 face_descriptors[i].transformations.scales.push_back(std::make_shared<Renderer::Scale>(
2011 static_cast<float>(half_width),
2012 static_cast<float>(half_height),
2013 static_cast<float>(half_width)
2016 face_descriptors[i].transformations.translations.push_back(std::make_shared<Renderer::Translation>(0.0f,
static_cast<float>(half_height), 0.0f));
2018 face_descriptors[i].transformations.translations.push_back(std::make_shared<Renderer::Translation>(
2024 face_descriptors[i].transformations.rotations.push_back(std::make_shared<Renderer::Rotation>(0.0f, 1.0f, 0.0f,
yaw));
2025 face_descriptors[i].transformations.rotations.push_back(std::make_shared<Renderer::Rotation>(1.0f, 0.0f, 0.0f,
pitch));
2030 faces[i].SetDisplayBackface(
false);
2031 faces[i].SetTextureMultipliers({ 0xFFFFFFFF, 0xFFFFFFFF });
2034 std::array<unsigned short, 4> texture_pos = { 0, 0, 0, 0 };
2035 std::array<unsigned short, 4> texture_size = { 0, 0, 0, 0 };
2039 for (
int j = 0; j < std::min(2, static_cast<int>(
face_descriptors[i].texture_names.size())); ++j)
2042 std::tie(texture_pos[2 * j + 0], texture_pos[2 * j + 1]) = texture_data.
position;
2043 std::tie(texture_size[2 * j + 0], texture_size[2 * j + 1]) = texture_data.
size;
2049 std::array<float, 4> coords =
faces[i].GetTextureCoords(
false);
2051 coords[0] = (texture_pos[0] + coords[0] / 16.0f * texture_size[0]) / atlas->
GetWidth();
2052 coords[1] = (texture_pos[1] + coords[1] / 16.0f * height_normalizer) / atlas->
GetHeight();
2053 coords[2] = (texture_pos[0] + coords[2] / 16.0f * texture_size[0]) / atlas->
GetWidth();
2054 coords[3] = (texture_pos[1] + coords[3] / 16.0f * height_normalizer) / atlas->
GetHeight();
2055 faces[i].SetTextureCoords(coords,
false);
2060 coords =
faces[i].GetTextureCoords(
true);
2062 coords[0] = (texture_pos[2] + coords[0] / 16.0f * texture_size[2]) / atlas->
GetWidth();
2063 coords[1] = (texture_pos[3] + coords[1] / 16.0f * height_normalizer) / atlas->
GetHeight();
2064 coords[2] = (texture_pos[2] + coords[2] / 16.0f * texture_size[2]) / atlas->
GetWidth();
2065 coords[3] = (texture_pos[3] + coords[3] / 16.0f * height_normalizer) / atlas->
GetHeight();
2066 faces[i].SetTextureCoords(coords,
true);
2069 faces[i].SetTransparencyData(transparencies[0]);