352 if (data.size() == 0)
358 size_t length = data.size();
362 const unsigned char index = ProtocolCraft::ReadData<unsigned char>(iter, length);
368 const int type = ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length);
371 enum EntityMetadataTypes
375#if PROTOCOL_VERSION > 760
381#if PROTOCOL_VERSION > 340
388 OptionalBlockPosition,
390#if PROTOCOL_VERSION > 769
391 OptionalLivingEntityReference,
396#if PROTOCOL_VERSION > 761
400#if PROTOCOL_VERSION > 340
403#if PROTOCOL_VERSION > 765
406#if PROTOCOL_VERSION > 404
411#if PROTOCOL_VERSION > 758
414#if PROTOCOL_VERSION > 769
417#if PROTOCOL_VERSION > 765
420#if PROTOCOL_VERSION > 769
423#if PROTOCOL_VERSION > 758
426#if PROTOCOL_VERSION > 769
430#if PROTOCOL_VERSION > 758
434#if PROTOCOL_VERSION > 761
436#if PROTOCOL_VERSION > 765
446 case EntityMetadataTypes::Char:
447 value = ProtocolCraft::ReadData<char>(iter, length);
449 case EntityMetadataTypes::Int:
450 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
452#if PROTOCOL_VERSION > 760
453 case EntityMetadataTypes::Long:
454 value =
static_cast<long long int>(ProtocolCraft::ReadData<ProtocolCraft::VarLong>(iter, length));
457 case EntityMetadataTypes::Float:
458 value = ProtocolCraft::ReadData<float>(iter, length);
460 case EntityMetadataTypes::String:
461 value = ProtocolCraft::ReadData<std::string>(iter, length);
463 case EntityMetadataTypes::Chat:
465 std::any_cast<ProtocolCraft::Chat&>(value).Read(iter, length);
467#if PROTOCOL_VERSION > 340
468 case EntityMetadataTypes::OptionalChat:
469 if (ProtocolCraft::ReadData<bool>(iter, length))
472 std::any_cast<std::optional<ProtocolCraft::Chat>&>(value).value().Read(iter, length);
476 value = std::optional<ProtocolCraft::Chat>();
480 case EntityMetadataTypes::Slot:
482 std::any_cast<ProtocolCraft::Slot&>(value).Read(iter, length);
484 case EntityMetadataTypes::Bool:
485 value = ProtocolCraft::ReadData<bool>(iter, length);
487 case EntityMetadataTypes::Rotations:
490 for (
int i = 0; i < 3; ++i)
492 rotation[i] = ProtocolCraft::ReadData<float>(iter, length);
497 case EntityMetadataTypes::BlockPosition:
504 case EntityMetadataTypes::OptionalBlockPosition:
505 if (ProtocolCraft::ReadData<bool>(iter, length))
509 value = std::optional<Position>(
position);
513 value = std::optional<Position>();
516 case EntityMetadataTypes::DirectionType:
517 value =
static_cast<Direction>(
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length)));
519#if PROTOCOL_VERSION > 769
520 case EntityMetadataTypes::OptionalLivingEntityReference:
522 case EntityMetadataTypes::OptionalUUID:
524 if (ProtocolCraft::ReadData<bool>(iter, length))
526 value = std::optional<ProtocolCraft::UUID>(ProtocolCraft::ReadData<ProtocolCraft::UUID>(iter, length));
530 value = std::optional<ProtocolCraft::UUID>();
533 case EntityMetadataTypes::BlockstateType:
534 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
536#if PROTOCOL_VERSION > 761
537 case EntityMetadataTypes::OptionalBlockstate:
538 if (
const int n = ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length))
540 value = std::optional<int>(n);
544 value = std::optional<int>();
548 case EntityMetadataTypes::NBT:
551 unnamed_value.
Read(iter, length);
555#if PROTOCOL_VERSION > 340
556 case EntityMetadataTypes::Particle:
559 particle.
Read(iter, length);
564#if PROTOCOL_VERSION > 765
565 case EntityMetadataTypes::Particles:
566 value = ProtocolCraft::ReadData<std::vector<ProtocolCraft::Particle>>(iter, length);
569#if PROTOCOL_VERSION > 404
570 case EntityMetadataTypes::VillagerDataType:
572 ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length),
573 ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length),
574 ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length)
577 case EntityMetadataTypes::OptionalUint:
579 const int val = ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length);
580 value = val > 0 ? std::optional<int>(val - 1) : std::optional<int>();
583 case EntityMetadataTypes::PoseType:
584 value =
static_cast<Pose>(
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length)));
587#if PROTOCOL_VERSION > 758
588 case EntityMetadataTypes::CatVariant:
589 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
592#if PROTOCOL_VERSION > 769
593 case EntityMetadataTypes::CowVariant:
594 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
597#if PROTOCOL_VERSION > 765
598 case EntityMetadataTypes::WolfVariant:
599 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
602#if PROTOCOL_VERSION > 769
603 case EntityMetadataTypes::WolfSoundVariant:
604 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
607#if PROTOCOL_VERSION > 758
608 case EntityMetadataTypes::FrogVariant:
609 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
612#if PROTOCOL_VERSION > 769
613 case EntityMetadataTypes::PigVariant:
614 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
616 case EntityMetadataTypes::ChickenVariant:
617 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
620#if PROTOCOL_VERSION > 758
621 case EntityMetadataTypes::OptionalGlobalPos:
622 if (ProtocolCraft::ReadData<bool>(iter, length))
625 dimension.
Read(iter, length);
627 pos.
Read(iter, length);
629 value = std::optional<GlobalPos>({
636 value = std::optional<GlobalPos>();
639 case EntityMetadataTypes::PaintingVariant:
640 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
643#if PROTOCOL_VERSION > 761
644 case EntityMetadataTypes::SnifferState:
645 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
647#if PROTOCOL_VERSION > 765
648 case EntityMetadataTypes::ArmadilloState:
649 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
652 case EntityMetadataTypes::Vec3:
654 const float x = ProtocolCraft::ReadData<float>(iter, length);
655 const float y = ProtocolCraft::ReadData<float>(iter, length);
656 const float z = ProtocolCraft::ReadData<float>(iter, length);
660 case EntityMetadataTypes::Quaternion:
662 const float x = ProtocolCraft::ReadData<float>(iter, length);
663 const float y = ProtocolCraft::ReadData<float>(iter, length);
664 const float z = ProtocolCraft::ReadData<float>(iter, length);
665 const float w = ProtocolCraft::ReadData<float>(iter, length);
666 value = std::array<float, 4>{x, y, z, w};
671 LOG_ERROR(
"Unknown type in entity metadata : " << type <<
".Stopping current metadata parsing.");
1458#if PROTOCOL_VERSION > 758
1460 return std::make_shared<AllayEntity>();
1463 return std::make_shared<AreaEffectCloudEntity>();
1464#if PROTOCOL_VERSION > 765
1466 return std::make_shared<ArmadilloEntity>();
1469 return std::make_shared<ArmorStandEntity>();
1471 return std::make_shared<ArrowEntity>();
1472#if PROTOCOL_VERSION > 754
1474 return std::make_shared<AxolotlEntity>();
1477 return std::make_shared<BatEntity>();
1478#if PROTOCOL_VERSION > 498
1480 return std::make_shared<BeeEntity>();
1483 return std::make_shared<BlazeEntity>();
1484#if PROTOCOL_VERSION < 768
1485 case EntityType::Boat:
1486 return std::make_shared<BoatEntity>();
1497 return std::make_shared<BoatEntity>(type);
1499#if PROTOCOL_VERSION > 765
1501 return std::make_shared<BoggedEntity>();
1503#if PROTOCOL_VERSION > 764
1505 return std::make_shared<BreezeEntity>();
1507#if PROTOCOL_VERSION > 765
1509 return std::make_shared<BreezeWindChargeEntity>();
1511#if PROTOCOL_VERSION > 758
1512#if PROTOCOL_VERSION < 768
1513 case EntityType::ChestBoat:
1514 return std::make_shared<ChestBoatEntity>();
1525 return std::make_shared<ChestBoatEntity>(type);
1528#if PROTOCOL_VERSION > 767
1530 return std::make_shared<ChestRaftEntity>(type);
1532#if PROTOCOL_VERSION > 404
1534 return std::make_shared<CatEntity>();
1536#if PROTOCOL_VERSION > 760
1538 return std::make_shared<CamelEntity>();
1541 return std::make_shared<CaveSpiderEntity>();
1543 return std::make_shared<ChickenEntity>();
1544#if PROTOCOL_VERSION > 340
1546 return std::make_shared<CodEntity>();
1549 return std::make_shared<CowEntity>();
1550#if PROTOCOL_VERSION > 767
1552 return std::make_shared<CreakingEntity>();
1554#if PROTOCOL_VERSION > 767 && PROTOCOL_VERSION < 769
1555 case EntityType::CreakingTransient:
1556 return std::make_shared<CreakingTransientEntity>();
1559 return std::make_shared<CreeperEntity>();
1560#if PROTOCOL_VERSION > 761
1562 return std::make_shared<DisplayBlockDisplayEntity>();
1564 return std::make_shared<DisplayItemDisplayEntity>();
1566 return std::make_shared<DisplayTextDisplayEntity>();
1568#if PROTOCOL_VERSION > 340
1570 return std::make_shared<DolphinEntity>();
1573 return std::make_shared<DonkeyEntity>();
1575 return std::make_shared<DragonFireballEntity>();
1576#if PROTOCOL_VERSION > 340
1578 return std::make_shared<DrownedEntity>();
1581 return std::make_shared<ElderGuardianEntity>();
1583 return std::make_shared<EndCrystalEntity>();
1585 return std::make_shared<EnderDragonEntity>();
1587 return std::make_shared<EnderManEntity>();
1589 return std::make_shared<EndermiteEntity>();
1591 return std::make_shared<EvokerEntity>();
1593 return std::make_shared<EvokerFangsEntity>();
1595 return std::make_shared<ExperienceOrbEntity>();
1597 return std::make_shared<EyeOfEnderEntity>();
1599 return std::make_shared<FallingBlockEntity>();
1601 return std::make_shared<FireworkRocketEntity>();
1602#if PROTOCOL_VERSION > 404
1604 return std::make_shared<FoxEntity>();
1606#if PROTOCOL_VERSION > 758
1608 return std::make_shared<FrogEntity>();
1611 return std::make_shared<GhastEntity>();
1613 return std::make_shared<GiantEntity>();
1614#if PROTOCOL_VERSION > 754
1616 return std::make_shared<GlowItemFrameEntity>();
1618 return std::make_shared<GlowSquidEntity>();
1620 return std::make_shared<GoatEntity>();
1623 return std::make_shared<GuardianEntity>();
1624#if PROTOCOL_VERSION > 578
1626 return std::make_shared<HoglinEntity>();
1629 return std::make_shared<HorseEntity>();
1631 return std::make_shared<HuskEntity>();
1633 return std::make_shared<IllusionerEntity>();
1634#if PROTOCOL_VERSION > 761
1636 return std::make_shared<InteractionEntity>();
1639 return std::make_shared<IronGolemEntity>();
1641 return std::make_shared<ItemEntity>();
1643 return std::make_shared<ItemFrameEntity>();
1644#if PROTOCOL_VERSION > 765
1646 return std::make_shared<OminousItemSpawnerEntity>();
1649 return std::make_shared<LargeFireballEntity>();
1651 return std::make_shared<LeashFenceKnotEntity>();
1652#if PROTOCOL_VERSION > 340
1654 return std::make_shared<LightningBoltEntity>();
1657 return std::make_shared<LlamaEntity>();
1659 return std::make_shared<LlamaSpitEntity>();
1661 return std::make_shared<MagmaCubeEntity>();
1662#if PROTOCOL_VERSION > 754
1664 return std::make_shared<MarkerEntity>();
1667 return std::make_shared<MinecartEntity>();
1669 return std::make_shared<MinecartChestEntity>();
1671 return std::make_shared<MinecartCommandBlockEntity>();
1673 return std::make_shared<MinecartFurnaceEntity>();
1675 return std::make_shared<MinecartHopperEntity>();
1677 return std::make_shared<MinecartSpawnerEntity>();
1679 return std::make_shared<MinecartTNTEntity>();
1681 return std::make_shared<MuleEntity>();
1683 return std::make_shared<MushroomCowEntity>();
1685 return std::make_shared<OcelotEntity>();
1687 return std::make_shared<PaintingEntity>();
1688#if PROTOCOL_VERSION > 404
1690 return std::make_shared<PandaEntity>();
1693 return std::make_shared<ParrotEntity>();
1694#if PROTOCOL_VERSION > 340
1696 return std::make_shared<PhantomEntity>();
1699 return std::make_shared<PigEntity>();
1700#if PROTOCOL_VERSION > 578
1702 return std::make_shared<PiglinEntity>();
1704#if PROTOCOL_VERSION > 736
1706 return std::make_shared<PiglinBruteEntity>();
1708#if PROTOCOL_VERSION > 404
1710 return std::make_shared<PillagerEntity>();
1713 return std::make_shared<PolarBearEntity>();
1715 return std::make_shared<PrimedTntEntity>();
1716#if PROTOCOL_VERSION > 340
1718 return std::make_shared<PufferfishEntity>();
1721 return std::make_shared<RabbitEntity>();
1722#if PROTOCOL_VERSION > 767
1724 return std::make_shared<RaftEntity>(type);
1726#if PROTOCOL_VERSION > 404
1728 return std::make_shared<RavagerEntity>();
1730#if PROTOCOL_VERSION > 340
1732 return std::make_shared<SalmonEntity>();
1735 return std::make_shared<SheepEntity>();
1737 return std::make_shared<ShulkerEntity>();
1739 return std::make_shared<ShulkerBulletEntity>();
1741 return std::make_shared<SilverfishEntity>();
1743 return std::make_shared<SkeletonEntity>();
1745 return std::make_shared<SkeletonHorseEntity>();
1747 return std::make_shared<SlimeEntity>();
1749 return std::make_shared<SmallFireballEntity>();
1750#if PROTOCOL_VERSION > 761
1752 return std::make_shared<SnifferEntity>();
1755 return std::make_shared<SnowGolemEntity>();
1757 return std::make_shared<SnowballEntity>();
1759 return std::make_shared<SpectralArrowEntity>();
1761 return std::make_shared<SpiderEntity>();
1763 return std::make_shared<SquidEntity>();
1765 return std::make_shared<StrayEntity>();
1766#if PROTOCOL_VERSION > 578
1768 return std::make_shared<StriderEntity>();
1770#if PROTOCOL_VERSION > 758
1772 return std::make_shared<TadpoleEntity>();
1775 return std::make_shared<ThrownEggEntity>();
1777 return std::make_shared<ThrownEnderpearlEntity>();
1779 return std::make_shared<ThrownExperienceBottleEntity>();
1780#if PROTOCOL_VERSION < 770
1781 case EntityType::ThrownPotion:
1782 return std::make_shared<ThrownPotionEntity>();
1785 return std::make_shared<ThrownSplashPotionEntity>();
1787 return std::make_shared<ThrownLingeringPotionEntity>();
1789#if PROTOCOL_VERSION > 340
1791 return std::make_shared<ThrownTridentEntity>();
1793#if PROTOCOL_VERSION > 404
1795 return std::make_shared<TraderLlamaEntity>();
1797#if PROTOCOL_VERSION > 340
1799 return std::make_shared<TropicalFishEntity>();
1801#if PROTOCOL_VERSION > 340
1803 return std::make_shared<TurtleEntity>();
1806 return std::make_shared<VexEntity>();
1808 return std::make_shared<VillagerEntity>();
1810 return std::make_shared<VindicatorEntity>();
1811#if PROTOCOL_VERSION > 404
1813 return std::make_shared<WanderingTraderEntity>();
1815#if PROTOCOL_VERSION > 758
1817 return std::make_shared<WardenEntity>();
1819#if PROTOCOL_VERSION > 764
1821 return std::make_shared<WindChargeEntity>();
1824 return std::make_shared<WitchEntity>();
1826 return std::make_shared<WitherBossEntity>();
1828 return std::make_shared<WitherSkeletonEntity>();
1830 return std::make_shared<WitherSkullEntity>();
1832 return std::make_shared<WolfEntity>();
1833#if PROTOCOL_VERSION > 578
1835 return std::make_shared<ZoglinEntity>();
1838 return std::make_shared<ZombieEntity>();
1840 return std::make_shared<ZombieHorseEntity>();
1842 return std::make_shared<ZombieVillagerEntity>();
1843#if PROTOCOL_VERSION > 578
1845 return std::make_shared<ZombifiedPiglinEntity>();
1847 case EntityType::PigZombie:
1848 return std::make_shared<PigZombieEntity>();
1851 return std::make_shared<PlayerEntity>();
1852#if PROTOCOL_VERSION > 340
1854 return std::make_shared<FishingHookEntity>();
1933 std::scoped_lock<std::shared_mutex> lock(
entity_mutex);
1938 faces = std::vector<Renderer::Face>(6);
1941 for (
int i = 0; i < 6; ++i)
1949 face_descriptors[i].transformations.scales.push_back(std::make_shared<Renderer::Scale>(
1950 static_cast<float>(half_width),
1951 static_cast<float>(half_height),
1952 static_cast<float>(half_width)
1955 face_descriptors[i].transformations.translations.push_back(std::make_shared<Renderer::Translation>(0.0f,
static_cast<float>(half_height), 0.0f));
1957 face_descriptors[i].transformations.translations.push_back(std::make_shared<Renderer::Translation>(
1963 face_descriptors[i].transformations.rotations.push_back(std::make_shared<Renderer::Rotation>(0.0f, 1.0f, 0.0f,
yaw));
1964 face_descriptors[i].transformations.rotations.push_back(std::make_shared<Renderer::Rotation>(1.0f, 0.0f, 0.0f,
pitch));
1969 faces[i].SetDisplayBackface(
false);
1970 faces[i].SetTextureMultipliers({ 0xFFFFFFFF, 0xFFFFFFFF });
1973 std::array<unsigned short, 4> texture_pos = { 0, 0, 0, 0 };
1974 std::array<unsigned short, 4> texture_size = { 0, 0, 0, 0 };
1978 for (
int j = 0; j < std::min(2, static_cast<int>(
face_descriptors[i].texture_names.size())); ++j)
1981 std::tie(texture_pos[2 * j + 0], texture_pos[2 * j + 1]) = texture_data.
position;
1982 std::tie(texture_size[2 * j + 0], texture_size[2 * j + 1]) = texture_data.
size;
1988 std::array<float, 4> coords =
faces[i].GetTextureCoords(
false);
1990 coords[0] = (texture_pos[0] + coords[0] / 16.0f * texture_size[0]) / atlas->
GetWidth();
1991 coords[1] = (texture_pos[1] + coords[1] / 16.0f * height_normalizer) / atlas->
GetHeight();
1992 coords[2] = (texture_pos[0] + coords[2] / 16.0f * texture_size[0]) / atlas->
GetWidth();
1993 coords[3] = (texture_pos[1] + coords[3] / 16.0f * height_normalizer) / atlas->
GetHeight();
1994 faces[i].SetTextureCoords(coords,
false);
1999 coords =
faces[i].GetTextureCoords(
true);
2001 coords[0] = (texture_pos[2] + coords[0] / 16.0f * texture_size[2]) / atlas->
GetWidth();
2002 coords[1] = (texture_pos[3] + coords[1] / 16.0f * height_normalizer) / atlas->
GetHeight();
2003 coords[2] = (texture_pos[2] + coords[2] / 16.0f * texture_size[2]) / atlas->
GetWidth();
2004 coords[3] = (texture_pos[3] + coords[3] / 16.0f * height_normalizer) / atlas->
GetHeight();
2005 faces[i].SetTextureCoords(coords,
true);
2008 faces[i].SetTransparencyData(transparencies[0]);