340 if (data.size() == 0)
346 size_t length = data.size();
350 const unsigned char index = ProtocolCraft::ReadData<unsigned char>(iter, length);
356 const int type = ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length);
359 enum EntityMetadataTypes
363#if PROTOCOL_VERSION > 760
369#if PROTOCOL_VERSION > 340
376 OptionalBlockPosition,
380#if PROTOCOL_VERSION > 761
384#if PROTOCOL_VERSION > 340
387#if PROTOCOL_VERSION > 765
390#if PROTOCOL_VERSION > 404
395#if PROTOCOL_VERSION > 758
397#if PROTOCOL_VERSION > 765
404#if PROTOCOL_VERSION > 761
406#if PROTOCOL_VERSION > 765
416 case EntityMetadataTypes::Char:
417 value = ProtocolCraft::ReadData<char>(iter, length);
419 case EntityMetadataTypes::Int:
420 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
422#if PROTOCOL_VERSION > 760
423 case EntityMetadataTypes::Long:
424 value =
static_cast<long long int>(ProtocolCraft::ReadData<ProtocolCraft::VarLong>(iter, length));
427 case EntityMetadataTypes::Float:
428 value = ProtocolCraft::ReadData<float>(iter, length);
430 case EntityMetadataTypes::String:
431 value = ProtocolCraft::ReadData<std::string>(iter, length);
433 case EntityMetadataTypes::Chat:
435 std::any_cast<ProtocolCraft::Chat&>(value).Read(iter, length);
437#if PROTOCOL_VERSION > 340
438 case EntityMetadataTypes::OptionalChat:
439 if (ProtocolCraft::ReadData<bool>(iter, length))
442 std::any_cast<std::optional<ProtocolCraft::Chat>&>(value).value().Read(iter, length);
446 value = std::optional<ProtocolCraft::Chat>();
450 case EntityMetadataTypes::Slot:
452 std::any_cast<ProtocolCraft::Slot&>(value).Read(iter, length);
454 case EntityMetadataTypes::Bool:
455 value = ProtocolCraft::ReadData<bool>(iter, length);
457 case EntityMetadataTypes::Rotations:
460 for (
int i = 0; i < 3; ++i)
462 rotation[i] = ProtocolCraft::ReadData<float>(iter, length);
467 case EntityMetadataTypes::BlockPosition:
474 case EntityMetadataTypes::OptionalBlockPosition:
475 if (ProtocolCraft::ReadData<bool>(iter, length))
479 value = std::optional<Position>(
position);
483 value = std::optional<Position>();
486 case EntityMetadataTypes::DirectionType:
487 value =
static_cast<Direction>(
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length)));
489 case EntityMetadataTypes::OptionalUUID:
490 if (ProtocolCraft::ReadData<bool>(iter, length))
492 value = std::optional<ProtocolCraft::UUID>(ProtocolCraft::ReadData<ProtocolCraft::UUID>(iter, length));
496 value = std::optional<ProtocolCraft::UUID>();
499 case EntityMetadataTypes::BlockstateType:
500 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
502#if PROTOCOL_VERSION > 761
503 case EntityMetadataTypes::OptionalBlockstate:
504 if (
const int n = ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length))
506 value = std::optional<int>(n);
510 value = std::optional<int>();
514 case EntityMetadataTypes::NBT:
517 unnamed_value.
Read(iter, length);
521#if PROTOCOL_VERSION > 340
522 case EntityMetadataTypes::Particle:
525 particle.
Read(iter, length);
530#if PROTOCOL_VERSION > 765
531 case EntityMetadataTypes::Particles:
532 value = ProtocolCraft::ReadData<std::vector<ProtocolCraft::Particle>>(iter, length);
535#if PROTOCOL_VERSION > 404
536 case EntityMetadataTypes::VillagerDataType:
538 ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length),
539 ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length),
540 ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length)
543 case EntityMetadataTypes::OptionalUint:
545 const int val = ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length);
546 value = val > 0 ? std::optional<int>(val - 1) : std::optional<int>();
549 case EntityMetadataTypes::PoseType:
550 value =
static_cast<Pose>(
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length)));
553#if PROTOCOL_VERSION > 758
554 case EntityMetadataTypes::CatVariant:
555 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
557#if PROTOCOL_VERSION > 765
558 case EntityMetadataTypes::WolfVariant:
559 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
562 case EntityMetadataTypes::FrogVariant:
563 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
565 case EntityMetadataTypes::OptionalGlobalPos:
566 if (ProtocolCraft::ReadData<bool>(iter, length))
569 dimension.
Read(iter, length);
571 pos.
Read(iter, length);
573 value = std::optional<GlobalPos>({
580 value = std::optional<GlobalPos>();
583 case EntityMetadataTypes::PaintingVariant:
584 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
587#if PROTOCOL_VERSION > 761
588 case EntityMetadataTypes::SnifferState:
589 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
591#if PROTOCOL_VERSION > 765
592 case EntityMetadataTypes::ArmadilloState:
593 value =
static_cast<int>(ProtocolCraft::ReadData<ProtocolCraft::VarInt>(iter, length));
596 case EntityMetadataTypes::Vec3:
598 const float x = ProtocolCraft::ReadData<float>(iter, length);
599 const float y = ProtocolCraft::ReadData<float>(iter, length);
600 const float z = ProtocolCraft::ReadData<float>(iter, length);
604 case EntityMetadataTypes::Quaternion:
606 const float x = ProtocolCraft::ReadData<float>(iter, length);
607 const float y = ProtocolCraft::ReadData<float>(iter, length);
608 const float z = ProtocolCraft::ReadData<float>(iter, length);
609 const float w = ProtocolCraft::ReadData<float>(iter, length);
610 value = std::array<float, 4>{x, y, z, w};
615 LOG_ERROR(
"Unknown type in entity metadata : " << type <<
".Stopping current metadata parsing.");
1388#if PROTOCOL_VERSION > 758
1390 return std::make_shared<AllayEntity>();
1393 return std::make_shared<AreaEffectCloudEntity>();
1394#if PROTOCOL_VERSION > 765
1396 return std::make_shared<ArmadilloEntity>();
1399 return std::make_shared<ArmorStandEntity>();
1401 return std::make_shared<ArrowEntity>();
1402#if PROTOCOL_VERSION > 754
1404 return std::make_shared<AxolotlEntity>();
1407 return std::make_shared<BatEntity>();
1408#if PROTOCOL_VERSION > 498
1410 return std::make_shared<BeeEntity>();
1413 return std::make_shared<BlazeEntity>();
1414#if PROTOCOL_VERSION < 768
1415 case EntityType::Boat:
1416 return std::make_shared<BoatEntity>();
1427 return std::make_shared<BoatEntity>(type);
1429#if PROTOCOL_VERSION > 765
1431 return std::make_shared<BoggedEntity>();
1433#if PROTOCOL_VERSION > 764
1435 return std::make_shared<BreezeEntity>();
1437#if PROTOCOL_VERSION > 765
1439 return std::make_shared<BreezeWindChargeEntity>();
1441#if PROTOCOL_VERSION > 758
1442#if PROTOCOL_VERSION < 768
1443 case EntityType::ChestBoat:
1444 return std::make_shared<ChestBoatEntity>();
1455 return std::make_shared<ChestBoatEntity>(type);
1458#if PROTOCOL_VERSION > 767
1460 return std::make_shared<ChestRaftEntity>(type);
1462#if PROTOCOL_VERSION > 404
1464 return std::make_shared<CatEntity>();
1466#if PROTOCOL_VERSION > 760
1468 return std::make_shared<CamelEntity>();
1471 return std::make_shared<CaveSpiderEntity>();
1473 return std::make_shared<ChickenEntity>();
1474#if PROTOCOL_VERSION > 340
1476 return std::make_shared<CodEntity>();
1479 return std::make_shared<CowEntity>();
1480#if PROTOCOL_VERSION > 767
1482 return std::make_shared<CreakingEntity>();
1484#if PROTOCOL_VERSION > 767 && PROTOCOL_VERSION < 769
1485 case EntityType::CreakingTransient:
1486 return std::make_shared<CreakingTransientEntity>();
1489 return std::make_shared<CreeperEntity>();
1490#if PROTOCOL_VERSION > 761
1492 return std::make_shared<DisplayBlockDisplayEntity>();
1494 return std::make_shared<DisplayItemDisplayEntity>();
1496 return std::make_shared<DisplayTextDisplayEntity>();
1498#if PROTOCOL_VERSION > 340
1500 return std::make_shared<DolphinEntity>();
1503 return std::make_shared<DonkeyEntity>();
1505 return std::make_shared<DragonFireballEntity>();
1506#if PROTOCOL_VERSION > 340
1508 return std::make_shared<DrownedEntity>();
1511 return std::make_shared<ElderGuardianEntity>();
1513 return std::make_shared<EndCrystalEntity>();
1515 return std::make_shared<EnderDragonEntity>();
1517 return std::make_shared<EnderManEntity>();
1519 return std::make_shared<EndermiteEntity>();
1521 return std::make_shared<EvokerEntity>();
1523 return std::make_shared<EvokerFangsEntity>();
1525 return std::make_shared<ExperienceOrbEntity>();
1527 return std::make_shared<EyeOfEnderEntity>();
1529 return std::make_shared<FallingBlockEntity>();
1531 return std::make_shared<FireworkRocketEntity>();
1532#if PROTOCOL_VERSION > 404
1534 return std::make_shared<FoxEntity>();
1536#if PROTOCOL_VERSION > 758
1538 return std::make_shared<FrogEntity>();
1541 return std::make_shared<GhastEntity>();
1543 return std::make_shared<GiantEntity>();
1544#if PROTOCOL_VERSION > 754
1546 return std::make_shared<GlowItemFrameEntity>();
1548 return std::make_shared<GlowSquidEntity>();
1550 return std::make_shared<GoatEntity>();
1553 return std::make_shared<GuardianEntity>();
1554#if PROTOCOL_VERSION > 578
1556 return std::make_shared<HoglinEntity>();
1559 return std::make_shared<HorseEntity>();
1561 return std::make_shared<HuskEntity>();
1563 return std::make_shared<IllusionerEntity>();
1564#if PROTOCOL_VERSION > 761
1566 return std::make_shared<InteractionEntity>();
1569 return std::make_shared<IronGolemEntity>();
1571 return std::make_shared<ItemEntity>();
1573 return std::make_shared<ItemFrameEntity>();
1574#if PROTOCOL_VERSION > 765
1576 return std::make_shared<OminousItemSpawnerEntity>();
1579 return std::make_shared<LargeFireballEntity>();
1581 return std::make_shared<LeashFenceKnotEntity>();
1582#if PROTOCOL_VERSION > 340
1584 return std::make_shared<LightningBoltEntity>();
1587 return std::make_shared<LlamaEntity>();
1589 return std::make_shared<LlamaSpitEntity>();
1591 return std::make_shared<MagmaCubeEntity>();
1592#if PROTOCOL_VERSION > 754
1594 return std::make_shared<MarkerEntity>();
1597 return std::make_shared<MinecartEntity>();
1599 return std::make_shared<MinecartChestEntity>();
1601 return std::make_shared<MinecartCommandBlockEntity>();
1603 return std::make_shared<MinecartFurnaceEntity>();
1605 return std::make_shared<MinecartHopperEntity>();
1607 return std::make_shared<MinecartSpawnerEntity>();
1609 return std::make_shared<MinecartTNTEntity>();
1611 return std::make_shared<MuleEntity>();
1613 return std::make_shared<MushroomCowEntity>();
1615 return std::make_shared<OcelotEntity>();
1617 return std::make_shared<PaintingEntity>();
1618#if PROTOCOL_VERSION > 404
1620 return std::make_shared<PandaEntity>();
1623 return std::make_shared<ParrotEntity>();
1624#if PROTOCOL_VERSION > 340
1626 return std::make_shared<PhantomEntity>();
1629 return std::make_shared<PigEntity>();
1630#if PROTOCOL_VERSION > 578
1632 return std::make_shared<PiglinEntity>();
1634#if PROTOCOL_VERSION > 736
1636 return std::make_shared<PiglinBruteEntity>();
1638#if PROTOCOL_VERSION > 404
1640 return std::make_shared<PillagerEntity>();
1643 return std::make_shared<PolarBearEntity>();
1645 return std::make_shared<PrimedTntEntity>();
1646#if PROTOCOL_VERSION > 340
1648 return std::make_shared<PufferfishEntity>();
1651 return std::make_shared<RabbitEntity>();
1652#if PROTOCOL_VERSION > 767
1654 return std::make_shared<RaftEntity>(type);
1656#if PROTOCOL_VERSION > 404
1658 return std::make_shared<RavagerEntity>();
1660#if PROTOCOL_VERSION > 340
1662 return std::make_shared<SalmonEntity>();
1665 return std::make_shared<SheepEntity>();
1667 return std::make_shared<ShulkerEntity>();
1669 return std::make_shared<ShulkerBulletEntity>();
1671 return std::make_shared<SilverfishEntity>();
1673 return std::make_shared<SkeletonEntity>();
1675 return std::make_shared<SkeletonHorseEntity>();
1677 return std::make_shared<SlimeEntity>();
1679 return std::make_shared<SmallFireballEntity>();
1680#if PROTOCOL_VERSION > 761
1682 return std::make_shared<SnifferEntity>();
1685 return std::make_shared<SnowGolemEntity>();
1687 return std::make_shared<SnowballEntity>();
1689 return std::make_shared<SpectralArrowEntity>();
1691 return std::make_shared<SpiderEntity>();
1693 return std::make_shared<SquidEntity>();
1695 return std::make_shared<StrayEntity>();
1696#if PROTOCOL_VERSION > 578
1698 return std::make_shared<StriderEntity>();
1700#if PROTOCOL_VERSION > 758
1702 return std::make_shared<TadpoleEntity>();
1705 return std::make_shared<ThrownEggEntity>();
1707 return std::make_shared<ThrownEnderpearlEntity>();
1709 return std::make_shared<ThrownExperienceBottleEntity>();
1711 return std::make_shared<ThrownPotionEntity>();
1712#if PROTOCOL_VERSION > 340
1714 return std::make_shared<ThrownTridentEntity>();
1716#if PROTOCOL_VERSION > 404
1718 return std::make_shared<TraderLlamaEntity>();
1720#if PROTOCOL_VERSION > 340
1722 return std::make_shared<TropicalFishEntity>();
1724#if PROTOCOL_VERSION > 340
1726 return std::make_shared<TurtleEntity>();
1729 return std::make_shared<VexEntity>();
1731 return std::make_shared<VillagerEntity>();
1733 return std::make_shared<VindicatorEntity>();
1734#if PROTOCOL_VERSION > 404
1736 return std::make_shared<WanderingTraderEntity>();
1738#if PROTOCOL_VERSION > 758
1740 return std::make_shared<WardenEntity>();
1742#if PROTOCOL_VERSION > 764
1744 return std::make_shared<WindChargeEntity>();
1747 return std::make_shared<WitchEntity>();
1749 return std::make_shared<WitherBossEntity>();
1751 return std::make_shared<WitherSkeletonEntity>();
1753 return std::make_shared<WitherSkullEntity>();
1755 return std::make_shared<WolfEntity>();
1756#if PROTOCOL_VERSION > 578
1758 return std::make_shared<ZoglinEntity>();
1761 return std::make_shared<ZombieEntity>();
1763 return std::make_shared<ZombieHorseEntity>();
1765 return std::make_shared<ZombieVillagerEntity>();
1766#if PROTOCOL_VERSION > 578
1768 return std::make_shared<ZombifiedPiglinEntity>();
1770 case EntityType::PigZombie:
1771 return std::make_shared<PigZombieEntity>();
1774 return std::make_shared<PlayerEntity>();
1775#if PROTOCOL_VERSION > 340
1777 return std::make_shared<FishingHookEntity>();
1856 std::scoped_lock<std::shared_mutex> lock(
entity_mutex);
1861 faces = std::vector<Renderer::Face>(6);
1864 for (
int i = 0; i < 6; ++i)
1872 face_descriptors[i].transformations.scales.push_back(std::make_shared<Renderer::Scale>(
1873 static_cast<float>(half_width),
1874 static_cast<float>(half_height),
1875 static_cast<float>(half_width)
1878 face_descriptors[i].transformations.translations.push_back(std::make_shared<Renderer::Translation>(0.0f,
static_cast<float>(half_height), 0.0f));
1880 face_descriptors[i].transformations.translations.push_back(std::make_shared<Renderer::Translation>(
1886 face_descriptors[i].transformations.rotations.push_back(std::make_shared<Renderer::Rotation>(0.0f, 1.0f, 0.0f,
yaw));
1887 face_descriptors[i].transformations.rotations.push_back(std::make_shared<Renderer::Rotation>(1.0f, 0.0f, 0.0f,
pitch));
1892 faces[i].SetDisplayBackface(
false);
1893 faces[i].SetTextureMultipliers({ 0xFFFFFFFF, 0xFFFFFFFF });
1896 std::array<unsigned short, 4> texture_pos = { 0, 0, 0, 0 };
1897 std::array<unsigned short, 4> texture_size = { 0, 0, 0, 0 };
1901 for (
int j = 0; j < std::min(2, static_cast<int>(
face_descriptors[i].texture_names.size())); ++j)
1904 std::tie(texture_pos[2 * j + 0], texture_pos[2 * j + 1]) = texture_data.
position;
1905 std::tie(texture_size[2 * j + 0], texture_size[2 * j + 1]) = texture_data.
size;
1911 std::array<float, 4> coords =
faces[i].GetTextureCoords(
false);
1913 coords[0] = (texture_pos[0] + coords[0] / 16.0f * texture_size[0]) / atlas->
GetWidth();
1914 coords[1] = (texture_pos[1] + coords[1] / 16.0f * height_normalizer) / atlas->
GetHeight();
1915 coords[2] = (texture_pos[0] + coords[2] / 16.0f * texture_size[0]) / atlas->
GetWidth();
1916 coords[3] = (texture_pos[1] + coords[3] / 16.0f * height_normalizer) / atlas->
GetHeight();
1917 faces[i].SetTextureCoords(coords,
false);
1922 coords =
faces[i].GetTextureCoords(
true);
1924 coords[0] = (texture_pos[2] + coords[0] / 16.0f * texture_size[2]) / atlas->
GetWidth();
1925 coords[1] = (texture_pos[3] + coords[1] / 16.0f * height_normalizer) / atlas->
GetHeight();
1926 coords[2] = (texture_pos[2] + coords[2] / 16.0f * texture_size[2]) / atlas->
GetWidth();
1927 coords[3] = (texture_pos[3] + coords[3] / 16.0f * height_normalizer) / atlas->
GetHeight();
1928 faces[i].SetTextureCoords(coords,
true);
1931 faces[i].SetTransparencyData(transparencies[0]);