use azalea_core::{aabb::Aabb, position::Vec3}; use azalea_registry::builtin::EntityKind; use crate::Pose; /// The size of an entity and its eye height. #[cfg_attr(feature = "bevy_ecs", derive(bevy_ecs::component::Component))] #[derive(Clone, Debug, Default)] pub struct EntityDimensions { pub width: f32, pub height: f32, /// The offset of the entity's eyes from their coordinates. /// /// This is used to calculate the camera position for players, when /// spectating an entity, and when raycasting from the entity. /// /// The default eye height for a player is 1.62 blocks. pub eye_height: f32, /// Whether the entity isn't allowed to be scaled. pub fixed: bool, } impl EntityDimensions { pub const fn new(width: f32, height: f32) -> Self { Self { width, height, eye_height: default_eye_height(height), fixed: false, } } pub const fn fixed(self) -> Self { Self { fixed: true, ..self } } pub const fn eye_height(self, eye_height: f32) -> Self { Self { eye_height, ..self } } pub fn make_bounding_box(&self, pos: Vec3) -> Aabb { let radius = (self.width / 2.0) as f64; let height = self.height as f64; Aabb { min: Vec3::new(pos.x - radius, pos.y, pos.z - radius), max: Vec3::new(pos.x + radius, pos.y + height, pos.z + radius), } } } const fn default_eye_height(height: f32) -> f32 { height * 0.85 } impl From for EntityDimensions { fn from(entity: EntityKind) -> Self { // this match statement is automatically generated by codegen/genentities.py, // don't edit it manually! match entity { EntityKind::AcaciaBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625), EntityKind::AcaciaChestBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625), EntityKind::Allay => EntityDimensions::new(0.35, 0.6).eye_height(0.36), EntityKind::AreaEffectCloud => EntityDimensions::new(6.0, 0.5), EntityKind::Armadillo => EntityDimensions::new(0.7, 0.65).eye_height(0.26), EntityKind::ArmorStand => EntityDimensions::new(0.5, 1.975).eye_height(1.7775), EntityKind::Arrow => EntityDimensions::new(0.5, 0.5).eye_height(0.13), EntityKind::Axolotl => EntityDimensions::new(0.75, 0.42).eye_height(0.2751), EntityKind::BambooChestRaft => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625), EntityKind::BambooRaft => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625), EntityKind::Bat => EntityDimensions::new(0.5, 0.9).eye_height(0.45), EntityKind::Bee => EntityDimensions::new(0.7, 0.6).eye_height(0.3), EntityKind::BirchBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625), EntityKind::BirchChestBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625), EntityKind::Blaze => EntityDimensions::new(0.6, 1.8), EntityKind::BlockDisplay => EntityDimensions::new(0.0, 0.0), EntityKind::Bogged => EntityDimensions::new(0.6, 1.99).eye_height(1.74), EntityKind::Breeze => EntityDimensions::new(0.6, 1.77).eye_height(1.3452), EntityKind::BreezeWindCharge => EntityDimensions::new(0.3125, 0.3125).eye_height(0.0), EntityKind::Camel => EntityDimensions::new(1.7, 2.375).eye_height(2.275), EntityKind::CamelHusk => EntityDimensions::new(1.7, 2.375).eye_height(2.275), EntityKind::Cat => EntityDimensions::new(0.6, 0.7).eye_height(0.35), EntityKind::CaveSpider => EntityDimensions::new(0.7, 0.5).eye_height(0.45), EntityKind::CherryBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625), EntityKind::CherryChestBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625), EntityKind::ChestMinecart => EntityDimensions::new(0.98, 0.7), EntityKind::Chicken => EntityDimensions::new(0.4, 0.7).eye_height(0.644), EntityKind::Cod => EntityDimensions::new(0.5, 0.3).eye_height(0.195), EntityKind::CommandBlockMinecart => EntityDimensions::new(0.98, 0.7), EntityKind::CopperGolem => EntityDimensions::new(0.49, 0.98).eye_height(0.8125), EntityKind::Cow => EntityDimensions::new(0.9, 1.4).eye_height(1.3), EntityKind::Creaking => EntityDimensions::new(0.9, 2.7).eye_height(2.3), EntityKind::Creeper => EntityDimensions::new(0.6, 1.7), EntityKind::DarkOakBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625), EntityKind::DarkOakChestBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625), EntityKind::Dolphin => EntityDimensions::new(0.9, 0.6).eye_height(0.3), EntityKind::Donkey => EntityDimensions::new(1.39648, 1.5).eye_height(1.425), EntityKind::DragonFireball => EntityDimensions::new(1.0, 1.0), EntityKind::Drowned => EntityDimensions::new(0.6, 1.95).eye_height(1.74), EntityKind::Egg => EntityDimensions::new(0.25, 0.25), EntityKind::ElderGuardian => EntityDimensions::new(1.9975, 1.9975).eye_height(0.99875), EntityKind::EndCrystal => EntityDimensions::new(2.0, 2.0), EntityKind::EnderDragon => EntityDimensions::new(16.0, 8.0), EntityKind::EnderPearl => EntityDimensions::new(0.25, 0.25), EntityKind::Enderman => EntityDimensions::new(0.6, 2.9).eye_height(2.55), EntityKind::Endermite => EntityDimensions::new(0.4, 0.3).eye_height(0.13), EntityKind::Evoker => EntityDimensions::new(0.6, 1.95), EntityKind::EvokerFangs => EntityDimensions::new(0.5, 0.8), EntityKind::ExperienceBottle => EntityDimensions::new(0.25, 0.25), EntityKind::ExperienceOrb => EntityDimensions::new(0.5, 0.5), EntityKind::EyeOfEnder => EntityDimensions::new(0.25, 0.25), EntityKind::FallingBlock => EntityDimensions::new(0.98, 0.98), EntityKind::Fireball => EntityDimensions::new(1.0, 1.0), EntityKind::FireworkRocket => EntityDimensions::new(0.25, 0.25), EntityKind::FishingBobber => EntityDimensions::new(0.25, 0.25), EntityKind::Fox => EntityDimensions::new(0.6, 0.7).eye_height(0.4), EntityKind::Frog => EntityDimensions::new(0.5, 0.5), EntityKind::FurnaceMinecart => EntityDimensions::new(0.98, 0.7), EntityKind::Ghast => EntityDimensions::new(4.0, 4.0).eye_height(2.6), EntityKind::Giant => EntityDimensions::new(3.6, 12.0).eye_height(10.44), EntityKind::GlowItemFrame => EntityDimensions::new(0.5, 0.5).eye_height(0.0), EntityKind::GlowSquid => EntityDimensions::new(0.8, 0.8).eye_height(0.4), EntityKind::Goat => EntityDimensions::new(0.9, 1.3), EntityKind::Guardian => EntityDimensions::new(0.85, 0.85).eye_height(0.425), EntityKind::HappyGhast => EntityDimensions::new(4.0, 4.0).eye_height(2.6), EntityKind::Hoglin => EntityDimensions::new(1.39648, 1.4), EntityKind::HopperMinecart => EntityDimensions::new(0.98, 0.7), EntityKind::Horse => EntityDimensions::new(1.39648, 1.6).eye_height(1.52), EntityKind::Husk => EntityDimensions::new(0.6, 1.95).eye_height(1.74), EntityKind::Illusioner => EntityDimensions::new(0.6, 1.95), EntityKind::Interaction => EntityDimensions::new(0.0, 0.0), EntityKind::IronGolem => EntityDimensions::new(1.4, 2.7), EntityKind::Item => EntityDimensions::new(0.25, 0.25).eye_height(0.2125), EntityKind::ItemDisplay => EntityDimensions::new(0.0, 0.0), EntityKind::ItemFrame => EntityDimensions::new(0.5, 0.5).eye_height(0.0), EntityKind::JungleBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625), EntityKind::JungleChestBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625), EntityKind::LeashKnot => EntityDimensions::new(0.375, 0.5).eye_height(0.0625), EntityKind::LightningBolt => EntityDimensions::new(0.0, 0.0), EntityKind::LingeringPotion => EntityDimensions::new(0.25, 0.25), EntityKind::Llama => EntityDimensions::new(0.9, 1.87).eye_height(1.7765), EntityKind::LlamaSpit => EntityDimensions::new(0.25, 0.25), EntityKind::MagmaCube => EntityDimensions::new(0.52, 0.52).eye_height(0.325), EntityKind::MangroveBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625), EntityKind::MangroveChestBoat => { EntityDimensions::new(1.375, 0.5625).eye_height(0.5625) } EntityKind::Mannequin => EntityDimensions::new(0.6, 1.8).eye_height(1.62), EntityKind::Marker => EntityDimensions::new(0.0, 0.0), EntityKind::Minecart => EntityDimensions::new(0.98, 0.7), EntityKind::Mooshroom => EntityDimensions::new(0.9, 1.4).eye_height(1.3), EntityKind::Mule => EntityDimensions::new(1.39648, 1.6).eye_height(1.52), EntityKind::Nautilus => EntityDimensions::new(0.875, 0.95).eye_height(0.2751), EntityKind::OakBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625), EntityKind::OakChestBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625), EntityKind::Ocelot => EntityDimensions::new(0.6, 0.7), EntityKind::OminousItemSpawner => EntityDimensions::new(0.25, 0.25), EntityKind::Painting => EntityDimensions::new(0.5, 0.5), EntityKind::PaleOakBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625), EntityKind::PaleOakChestBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625), EntityKind::Panda => EntityDimensions::new(1.3, 1.25), EntityKind::Parched => EntityDimensions::new(0.6, 1.99).eye_height(1.74), EntityKind::Parrot => EntityDimensions::new(0.5, 0.9).eye_height(0.54), EntityKind::Phantom => EntityDimensions::new(0.9, 0.5).eye_height(0.175), EntityKind::Pig => EntityDimensions::new(0.9, 0.9), EntityKind::Piglin => EntityDimensions::new(0.6, 1.95).eye_height(1.79), EntityKind::PiglinBrute => EntityDimensions::new(0.6, 1.95).eye_height(1.79), EntityKind::Pillager => EntityDimensions::new(0.6, 1.95), EntityKind::Player => EntityDimensions::new(0.6, 1.8).eye_height(1.62), EntityKind::PolarBear => EntityDimensions::new(1.4, 1.4), EntityKind::Pufferfish => EntityDimensions::new(0.7, 0.7).eye_height(0.455), EntityKind::Rabbit => EntityDimensions::new(0.4, 0.5), EntityKind::Ravager => EntityDimensions::new(1.95, 2.2), EntityKind::Salmon => EntityDimensions::new(0.7, 0.4).eye_height(0.26), EntityKind::Sheep => EntityDimensions::new(0.9, 1.3).eye_height(1.235), EntityKind::Shulker => EntityDimensions::new(1.0, 1.0).eye_height(0.5), EntityKind::ShulkerBullet => EntityDimensions::new(0.3125, 0.3125), EntityKind::Silverfish => EntityDimensions::new(0.4, 0.3).eye_height(0.13), EntityKind::Skeleton => EntityDimensions::new(0.6, 1.99).eye_height(1.74), EntityKind::SkeletonHorse => EntityDimensions::new(1.39648, 1.6).eye_height(1.52), EntityKind::Slime => EntityDimensions::new(0.52, 0.52).eye_height(0.325), EntityKind::SmallFireball => EntityDimensions::new(0.3125, 0.3125), EntityKind::Sniffer => EntityDimensions::new(1.9, 1.75).eye_height(1.05), EntityKind::SnowGolem => EntityDimensions::new(0.7, 1.9).eye_height(1.7), EntityKind::Snowball => EntityDimensions::new(0.25, 0.25), EntityKind::SpawnerMinecart => EntityDimensions::new(0.98, 0.7), EntityKind::SpectralArrow => EntityDimensions::new(0.5, 0.5).eye_height(0.13), EntityKind::Spider => EntityDimensions::new(1.4, 0.9).eye_height(0.65), EntityKind::SplashPotion => EntityDimensions::new(0.25, 0.25), EntityKind::SpruceBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625), EntityKind::SpruceChestBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625), EntityKind::Squid => EntityDimensions::new(0.8, 0.8).eye_height(0.4), EntityKind::Stray => EntityDimensions::new(0.6, 1.99).eye_height(1.74), EntityKind::Strider => EntityDimensions::new(0.9, 1.7), EntityKind::Tadpole => EntityDimensions::new(0.4, 0.3).eye_height(0.195), EntityKind::TextDisplay => EntityDimensions::new(0.0, 0.0), EntityKind::Tnt => EntityDimensions::new(0.98, 0.98).eye_height(0.15), EntityKind::TntMinecart => EntityDimensions::new(0.98, 0.7), EntityKind::TraderLlama => EntityDimensions::new(0.9, 1.87).eye_height(1.7765), EntityKind::Trident => EntityDimensions::new(0.5, 0.5).eye_height(0.13), EntityKind::TropicalFish => EntityDimensions::new(0.5, 0.4).eye_height(0.26), EntityKind::Turtle => EntityDimensions::new(1.2, 0.4), EntityKind::Vex => EntityDimensions::new(0.4, 0.8).eye_height(0.51875), EntityKind::Villager => EntityDimensions::new(0.6, 1.95).eye_height(1.62), EntityKind::Vindicator => EntityDimensions::new(0.6, 1.95), EntityKind::WanderingTrader => EntityDimensions::new(0.6, 1.95).eye_height(1.62), EntityKind::Warden => EntityDimensions::new(0.9, 2.9), EntityKind::WindCharge => EntityDimensions::new(0.3125, 0.3125).eye_height(0.0), EntityKind::Witch => EntityDimensions::new(0.6, 1.95).eye_height(1.62), EntityKind::Wither => EntityDimensions::new(0.9, 3.5), EntityKind::WitherSkeleton => EntityDimensions::new(0.7, 2.4).eye_height(2.1), EntityKind::WitherSkull => EntityDimensions::new(0.3125, 0.3125), EntityKind::Wolf => EntityDimensions::new(0.6, 0.85).eye_height(0.68), EntityKind::Zoglin => EntityDimensions::new(1.39648, 1.4), EntityKind::Zombie => EntityDimensions::new(0.6, 1.95).eye_height(1.74), EntityKind::ZombieHorse => EntityDimensions::new(1.39648, 1.6).eye_height(1.52), EntityKind::ZombieNautilus => EntityDimensions::new(0.875, 0.95).eye_height(0.2751), EntityKind::ZombieVillager => EntityDimensions::new(0.6, 1.95).eye_height(1.74), EntityKind::ZombifiedPiglin => EntityDimensions::new(0.6, 1.95).eye_height(1.79), } } } /// Calculate the dimensions that an entity with the given kind and pose would /// have.i pub fn calculate_dimensions(kind: EntityKind, pose: Pose) -> EntityDimensions { match (kind, pose) { (_, Pose::Sleeping) => EntityDimensions::new(0.2, 0.2).fixed().eye_height(0.2), (EntityKind::Player, Pose::FallFlying) => EntityDimensions::new(0.6, 0.6).eye_height(0.4), (EntityKind::Player, Pose::Swimming) => EntityDimensions::new(0.6, 0.6).eye_height(0.4), (EntityKind::Player, Pose::SpinAttack) => EntityDimensions::new(0.6, 0.6).eye_height(0.4), (EntityKind::Player, Pose::Crouching) => EntityDimensions::new(0.6, 1.5).eye_height(1.27), (EntityKind::Player, Pose::Dying) => EntityDimensions::new(0.2, 1.2).eye_height(1.62), _ => EntityDimensions::from(kind), } }