355 if (data.size() == 0)
361 size_t length = data.size();
365 const unsigned char index = ProtocolCraft::ReadData<unsigned char>(iter, length);
371 const int type = ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length);
374 enum EntityMetadataTypes
378#if PROTOCOL_VERSION > 760
384#if PROTOCOL_VERSION > 340
391 OptionalBlockPosition,
393#if PROTOCOL_VERSION > 769
394 OptionalLivingEntityReference,
399#if PROTOCOL_VERSION > 761
403#if PROTOCOL_VERSION > 340
406#if PROTOCOL_VERSION > 765
409#if PROTOCOL_VERSION > 404
414#if PROTOCOL_VERSION > 758
417#if PROTOCOL_VERSION > 769
420#if PROTOCOL_VERSION > 765
423#if PROTOCOL_VERSION > 769
426#if PROTOCOL_VERSION > 758
429#if PROTOCOL_VERSION > 769
433#if PROTOCOL_VERSION > 758
437#if PROTOCOL_VERSION > 761
439#if PROTOCOL_VERSION > 765
449 case EntityMetadataTypes::Char:
450 value = ProtocolCraft::ReadData<char>(iter, length);
452 case EntityMetadataTypes::Int:
453 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
455#if PROTOCOL_VERSION > 760
456 case EntityMetadataTypes::Long:
457 value =
static_cast<long long int>(ProtocolCraft::ReadData<ProtocolCraft::VarLong>(iter, length));
460 case EntityMetadataTypes::Float:
461 value = ProtocolCraft::ReadData<float>(iter, length);
463 case EntityMetadataTypes::String:
464 value = ProtocolCraft::ReadData<std::string>(iter, length);
466 case EntityMetadataTypes::Chat:
468 std::any_cast<ProtocolCraft::Chat&>(value).Read(iter, length);
470#if PROTOCOL_VERSION > 340
471 case EntityMetadataTypes::OptionalChat:
472 if (ProtocolCraft::ReadData<bool>(iter, length))
475 std::any_cast<std::optional<ProtocolCraft::Chat>&>(value).value().Read(iter, length);
479 value = std::optional<ProtocolCraft::Chat>();
483 case EntityMetadataTypes::Slot:
485 std::any_cast<ProtocolCraft::Slot&>(value).Read(iter, length);
487 case EntityMetadataTypes::Bool:
488 value = ProtocolCraft::ReadData<bool>(iter, length);
490 case EntityMetadataTypes::Rotations:
493 for (
int i = 0; i < 3; ++i)
495 rotation[i] = ProtocolCraft::ReadData<float>(iter, length);
500 case EntityMetadataTypes::BlockPosition:
507 case EntityMetadataTypes::OptionalBlockPosition:
508 if (ProtocolCraft::ReadData<bool>(iter, length))
512 value = std::optional<Position>(
position);
516 value = std::optional<Position>();
519 case EntityMetadataTypes::DirectionType:
520 value =
static_cast<Direction>(
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length)));
522#if PROTOCOL_VERSION > 769
523 case EntityMetadataTypes::OptionalLivingEntityReference:
525 case EntityMetadataTypes::OptionalUUID:
527 if (ProtocolCraft::ReadData<bool>(iter, length))
529 value = std::optional<ProtocolCraft::UUID>(ProtocolCraft::ReadData<ProtocolCraft::UUID>(iter, length));
533 value = std::optional<ProtocolCraft::UUID>();
536 case EntityMetadataTypes::BlockstateType:
537 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
539#if PROTOCOL_VERSION > 761
540 case EntityMetadataTypes::OptionalBlockstate:
541 if (
const int n = ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length))
543 value = std::optional<int>(n);
547 value = std::optional<int>();
551 case EntityMetadataTypes::NBT:
554 unnamed_value.
Read(iter, length);
558#if PROTOCOL_VERSION > 340
559 case EntityMetadataTypes::Particle:
562 particle.
Read(iter, length);
567#if PROTOCOL_VERSION > 765
568 case EntityMetadataTypes::Particles:
569 value = ProtocolCraft::ReadData<std::vector<ProtocolCraft::Particle>>(iter, length);
572#if PROTOCOL_VERSION > 404
573 case EntityMetadataTypes::VillagerDataType:
575 ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length),
576 ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length),
577 ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length)
580 case EntityMetadataTypes::OptionalUint:
582 const int val = ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length);
583 value = val > 0 ? std::optional<int>(val - 1) : std::optional<int>();
586 case EntityMetadataTypes::PoseType:
587 value =
static_cast<Pose>(
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length)));
590#if PROTOCOL_VERSION > 758
591 case EntityMetadataTypes::CatVariant:
592 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
595#if PROTOCOL_VERSION > 769
596 case EntityMetadataTypes::CowVariant:
597 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
600#if PROTOCOL_VERSION > 765
601 case EntityMetadataTypes::WolfVariant:
602 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
605#if PROTOCOL_VERSION > 769
606 case EntityMetadataTypes::WolfSoundVariant:
607 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
610#if PROTOCOL_VERSION > 758
611 case EntityMetadataTypes::FrogVariant:
612 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
615#if PROTOCOL_VERSION > 769
616 case EntityMetadataTypes::PigVariant:
617 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
619 case EntityMetadataTypes::ChickenVariant:
620 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
623#if PROTOCOL_VERSION > 758
624 case EntityMetadataTypes::OptionalGlobalPos:
625 if (ProtocolCraft::ReadData<bool>(iter, length))
628 dimension.
Read(iter, length);
630 pos.
Read(iter, length);
632 value = std::optional<GlobalPos>({
639 value = std::optional<GlobalPos>();
642 case EntityMetadataTypes::PaintingVariant:
643 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
646#if PROTOCOL_VERSION > 761
647 case EntityMetadataTypes::SnifferState:
648 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
650#if PROTOCOL_VERSION > 765
651 case EntityMetadataTypes::ArmadilloState:
652 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
655 case EntityMetadataTypes::Vec3:
657 const float x = ProtocolCraft::ReadData<float>(iter, length);
658 const float y = ProtocolCraft::ReadData<float>(iter, length);
659 const float z = ProtocolCraft::ReadData<float>(iter, length);
663 case EntityMetadataTypes::Quaternion:
665 const float x = ProtocolCraft::ReadData<float>(iter, length);
666 const float y = ProtocolCraft::ReadData<float>(iter, length);
667 const float z = ProtocolCraft::ReadData<float>(iter, length);
668 const float w = ProtocolCraft::ReadData<float>(iter, length);
669 value = std::array<float, 4>{x, y, z, w};
674 LOG_ERROR(
"Unknown type in entity metadata : " << type <<
".Stopping current metadata parsing.");
1463#if PROTOCOL_VERSION > 758
1465 return std::make_shared<AllayEntity>();
1468 return std::make_shared<AreaEffectCloudEntity>();
1469#if PROTOCOL_VERSION > 765
1471 return std::make_shared<ArmadilloEntity>();
1474 return std::make_shared<ArmorStandEntity>();
1476 return std::make_shared<ArrowEntity>();
1477#if PROTOCOL_VERSION > 754
1479 return std::make_shared<AxolotlEntity>();
1482 return std::make_shared<BatEntity>();
1483#if PROTOCOL_VERSION > 498
1485 return std::make_shared<BeeEntity>();
1488 return std::make_shared<BlazeEntity>();
1489#if PROTOCOL_VERSION < 768
1490 case EntityType::Boat:
1491 return std::make_shared<BoatEntity>();
1502 return std::make_shared<BoatEntity>(type);
1504#if PROTOCOL_VERSION > 765
1506 return std::make_shared<BoggedEntity>();
1508#if PROTOCOL_VERSION > 764
1510 return std::make_shared<BreezeEntity>();
1512#if PROTOCOL_VERSION > 765
1514 return std::make_shared<BreezeWindChargeEntity>();
1516#if PROTOCOL_VERSION > 758
1517#if PROTOCOL_VERSION < 768
1518 case EntityType::ChestBoat:
1519 return std::make_shared<ChestBoatEntity>();
1530 return std::make_shared<ChestBoatEntity>(type);
1533#if PROTOCOL_VERSION > 767
1535 return std::make_shared<ChestRaftEntity>(type);
1537#if PROTOCOL_VERSION > 404
1539 return std::make_shared<CatEntity>();
1541#if PROTOCOL_VERSION > 760
1543 return std::make_shared<CamelEntity>();
1546 return std::make_shared<CaveSpiderEntity>();
1548 return std::make_shared<ChickenEntity>();
1549#if PROTOCOL_VERSION > 340
1551 return std::make_shared<CodEntity>();
1554 return std::make_shared<CowEntity>();
1555#if PROTOCOL_VERSION > 767
1557 return std::make_shared<CreakingEntity>();
1559#if PROTOCOL_VERSION > 767 && PROTOCOL_VERSION < 769
1560 case EntityType::CreakingTransient:
1561 return std::make_shared<CreakingTransientEntity>();
1564 return std::make_shared<CreeperEntity>();
1565#if PROTOCOL_VERSION > 761
1567 return std::make_shared<DisplayBlockDisplayEntity>();
1569 return std::make_shared<DisplayItemDisplayEntity>();
1571 return std::make_shared<DisplayTextDisplayEntity>();
1573#if PROTOCOL_VERSION > 340
1575 return std::make_shared<DolphinEntity>();
1578 return std::make_shared<DonkeyEntity>();
1580 return std::make_shared<DragonFireballEntity>();
1581#if PROTOCOL_VERSION > 340
1583 return std::make_shared<DrownedEntity>();
1586 return std::make_shared<ElderGuardianEntity>();
1588 return std::make_shared<EndCrystalEntity>();
1590 return std::make_shared<EnderDragonEntity>();
1592 return std::make_shared<EnderManEntity>();
1594 return std::make_shared<EndermiteEntity>();
1596 return std::make_shared<EvokerEntity>();
1598 return std::make_shared<EvokerFangsEntity>();
1600 return std::make_shared<ExperienceOrbEntity>();
1602 return std::make_shared<EyeOfEnderEntity>();
1604 return std::make_shared<FallingBlockEntity>();
1606 return std::make_shared<FireworkRocketEntity>();
1607#if PROTOCOL_VERSION > 404
1609 return std::make_shared<FoxEntity>();
1611#if PROTOCOL_VERSION > 758
1613 return std::make_shared<FrogEntity>();
1616 return std::make_shared<GhastEntity>();
1617#if PROTOCOL_VERSION > 770
1619 return std::make_shared<HappyGhastEntity>();
1622 return std::make_shared<GiantEntity>();
1623#if PROTOCOL_VERSION > 754
1625 return std::make_shared<GlowItemFrameEntity>();
1627 return std::make_shared<GlowSquidEntity>();
1629 return std::make_shared<GoatEntity>();
1632 return std::make_shared<GuardianEntity>();
1633#if PROTOCOL_VERSION > 578
1635 return std::make_shared<HoglinEntity>();
1638 return std::make_shared<HorseEntity>();
1640 return std::make_shared<HuskEntity>();
1642 return std::make_shared<IllusionerEntity>();
1643#if PROTOCOL_VERSION > 761
1645 return std::make_shared<InteractionEntity>();
1648 return std::make_shared<IronGolemEntity>();
1650 return std::make_shared<ItemEntity>();
1652 return std::make_shared<ItemFrameEntity>();
1653#if PROTOCOL_VERSION > 765
1655 return std::make_shared<OminousItemSpawnerEntity>();
1658 return std::make_shared<LargeFireballEntity>();
1660 return std::make_shared<LeashFenceKnotEntity>();
1661#if PROTOCOL_VERSION > 340
1663 return std::make_shared<LightningBoltEntity>();
1666 return std::make_shared<LlamaEntity>();
1668 return std::make_shared<LlamaSpitEntity>();
1670 return std::make_shared<MagmaCubeEntity>();
1671#if PROTOCOL_VERSION > 754
1673 return std::make_shared<MarkerEntity>();
1676 return std::make_shared<MinecartEntity>();
1678 return std::make_shared<MinecartChestEntity>();
1680 return std::make_shared<MinecartCommandBlockEntity>();
1682 return std::make_shared<MinecartFurnaceEntity>();
1684 return std::make_shared<MinecartHopperEntity>();
1686 return std::make_shared<MinecartSpawnerEntity>();
1688 return std::make_shared<MinecartTNTEntity>();
1690 return std::make_shared<MuleEntity>();
1692 return std::make_shared<MushroomCowEntity>();
1694 return std::make_shared<OcelotEntity>();
1696 return std::make_shared<PaintingEntity>();
1697#if PROTOCOL_VERSION > 404
1699 return std::make_shared<PandaEntity>();
1702 return std::make_shared<ParrotEntity>();
1703#if PROTOCOL_VERSION > 340
1705 return std::make_shared<PhantomEntity>();
1708 return std::make_shared<PigEntity>();
1709#if PROTOCOL_VERSION > 578
1711 return std::make_shared<PiglinEntity>();
1713#if PROTOCOL_VERSION > 736
1715 return std::make_shared<PiglinBruteEntity>();
1717#if PROTOCOL_VERSION > 404
1719 return std::make_shared<PillagerEntity>();
1722 return std::make_shared<PolarBearEntity>();
1724 return std::make_shared<PrimedTntEntity>();
1725#if PROTOCOL_VERSION > 340
1727 return std::make_shared<PufferfishEntity>();
1730 return std::make_shared<RabbitEntity>();
1731#if PROTOCOL_VERSION > 767
1733 return std::make_shared<RaftEntity>(type);
1735#if PROTOCOL_VERSION > 404
1737 return std::make_shared<RavagerEntity>();
1739#if PROTOCOL_VERSION > 340
1741 return std::make_shared<SalmonEntity>();
1744 return std::make_shared<SheepEntity>();
1746 return std::make_shared<ShulkerEntity>();
1748 return std::make_shared<ShulkerBulletEntity>();
1750 return std::make_shared<SilverfishEntity>();
1752 return std::make_shared<SkeletonEntity>();
1754 return std::make_shared<SkeletonHorseEntity>();
1756 return std::make_shared<SlimeEntity>();
1758 return std::make_shared<SmallFireballEntity>();
1759#if PROTOCOL_VERSION > 761
1761 return std::make_shared<SnifferEntity>();
1764 return std::make_shared<SnowGolemEntity>();
1766 return std::make_shared<SnowballEntity>();
1768 return std::make_shared<SpectralArrowEntity>();
1770 return std::make_shared<SpiderEntity>();
1772 return std::make_shared<SquidEntity>();
1774 return std::make_shared<StrayEntity>();
1775#if PROTOCOL_VERSION > 578
1777 return std::make_shared<StriderEntity>();
1779#if PROTOCOL_VERSION > 758
1781 return std::make_shared<TadpoleEntity>();
1784 return std::make_shared<ThrownEggEntity>();
1786 return std::make_shared<ThrownEnderpearlEntity>();
1788 return std::make_shared<ThrownExperienceBottleEntity>();
1789#if PROTOCOL_VERSION < 770
1790 case EntityType::ThrownPotion:
1791 return std::make_shared<ThrownPotionEntity>();
1794 return std::make_shared<ThrownSplashPotionEntity>();
1796 return std::make_shared<ThrownLingeringPotionEntity>();
1798#if PROTOCOL_VERSION > 340
1800 return std::make_shared<ThrownTridentEntity>();
1802#if PROTOCOL_VERSION > 404
1804 return std::make_shared<TraderLlamaEntity>();
1806#if PROTOCOL_VERSION > 340
1808 return std::make_shared<TropicalFishEntity>();
1810#if PROTOCOL_VERSION > 340
1812 return std::make_shared<TurtleEntity>();
1815 return std::make_shared<VexEntity>();
1817 return std::make_shared<VillagerEntity>();
1819 return std::make_shared<VindicatorEntity>();
1820#if PROTOCOL_VERSION > 404
1822 return std::make_shared<WanderingTraderEntity>();
1824#if PROTOCOL_VERSION > 758
1826 return std::make_shared<WardenEntity>();
1828#if PROTOCOL_VERSION > 764
1830 return std::make_shared<WindChargeEntity>();
1833 return std::make_shared<WitchEntity>();
1835 return std::make_shared<WitherBossEntity>();
1837 return std::make_shared<WitherSkeletonEntity>();
1839 return std::make_shared<WitherSkullEntity>();
1841 return std::make_shared<WolfEntity>();
1842#if PROTOCOL_VERSION > 578
1844 return std::make_shared<ZoglinEntity>();
1847 return std::make_shared<ZombieEntity>();
1849 return std::make_shared<ZombieHorseEntity>();
1851 return std::make_shared<ZombieVillagerEntity>();
1852#if PROTOCOL_VERSION > 578
1854 return std::make_shared<ZombifiedPiglinEntity>();
1856 case EntityType::PigZombie:
1857 return std::make_shared<PigZombieEntity>();
1860 return std::make_shared<PlayerEntity>();
1861#if PROTOCOL_VERSION > 340
1863 return std::make_shared<FishingHookEntity>();
1942 std::scoped_lock<std::shared_mutex> lock(
entity_mutex);
1947 faces = std::vector<Renderer::Face>(6);
1950 for (
int i = 0; i < 6; ++i)
1958 face_descriptors[i].transformations.scales.push_back(std::make_shared<Renderer::Scale>(
1959 static_cast<float>(half_width),
1960 static_cast<float>(half_height),
1961 static_cast<float>(half_width)
1964 face_descriptors[i].transformations.translations.push_back(std::make_shared<Renderer::Translation>(0.0f,
static_cast<float>(half_height), 0.0f));
1966 face_descriptors[i].transformations.translations.push_back(std::make_shared<Renderer::Translation>(
1972 face_descriptors[i].transformations.rotations.push_back(std::make_shared<Renderer::Rotation>(0.0f, 1.0f, 0.0f,
yaw));
1973 face_descriptors[i].transformations.rotations.push_back(std::make_shared<Renderer::Rotation>(1.0f, 0.0f, 0.0f,
pitch));
1978 faces[i].SetDisplayBackface(
false);
1979 faces[i].SetTextureMultipliers({ 0xFFFFFFFF, 0xFFFFFFFF });
1982 std::array<unsigned short, 4> texture_pos = { 0, 0, 0, 0 };
1983 std::array<unsigned short, 4> texture_size = { 0, 0, 0, 0 };
1987 for (
int j = 0; j < std::min(2, static_cast<int>(
face_descriptors[i].texture_names.size())); ++j)
1990 std::tie(texture_pos[2 * j + 0], texture_pos[2 * j + 1]) = texture_data.
position;
1991 std::tie(texture_size[2 * j + 0], texture_size[2 * j + 1]) = texture_data.
size;
1997 std::array<float, 4> coords =
faces[i].GetTextureCoords(
false);
1999 coords[0] = (texture_pos[0] + coords[0] / 16.0f * texture_size[0]) / atlas->
GetWidth();
2000 coords[1] = (texture_pos[1] + coords[1] / 16.0f * height_normalizer) / atlas->
GetHeight();
2001 coords[2] = (texture_pos[0] + coords[2] / 16.0f * texture_size[0]) / atlas->
GetWidth();
2002 coords[3] = (texture_pos[1] + coords[3] / 16.0f * height_normalizer) / atlas->
GetHeight();
2003 faces[i].SetTextureCoords(coords,
false);
2008 coords =
faces[i].GetTextureCoords(
true);
2010 coords[0] = (texture_pos[2] + coords[0] / 16.0f * texture_size[2]) / atlas->
GetWidth();
2011 coords[1] = (texture_pos[3] + coords[1] / 16.0f * height_normalizer) / atlas->
GetHeight();
2012 coords[2] = (texture_pos[2] + coords[2] / 16.0f * texture_size[2]) / atlas->
GetWidth();
2013 coords[3] = (texture_pos[3] + coords[3] / 16.0f * height_normalizer) / atlas->
GetHeight();
2014 faces[i].SetTextureCoords(coords,
true);
2017 faces[i].SetTransparencyData(transparencies[0]);