azalea_entity/
dimensions.rs

1use azalea_core::{aabb::AABB, position::Vec3};
2use azalea_registry::EntityKind;
3use bevy_ecs::component::Component;
4
5use crate::Pose;
6
7/// A component that contains the size of an entity and their eye height.
8#[derive(Component, Debug, Default, Clone)]
9pub struct EntityDimensions {
10    pub width: f32,
11    pub height: f32,
12    /// The offset of the entity's eyes from their coordinates.
13    ///
14    /// This is used to calculate the camera position for players, when
15    /// spectating an entity, and when raycasting from the entity.
16    ///
17    /// The default eye height for a player is 1.62 blocks.
18    pub eye_height: f32,
19    /// Whether the entity isn't allowed to be scaled.
20    pub fixed: bool,
21}
22
23impl EntityDimensions {
24    pub const fn new(width: f32, height: f32) -> Self {
25        Self {
26            width,
27            height,
28            eye_height: default_eye_height(height),
29            fixed: false,
30        }
31    }
32    pub const fn fixed(self) -> Self {
33        Self {
34            fixed: true,
35            ..self
36        }
37    }
38
39    pub const fn eye_height(self, eye_height: f32) -> Self {
40        Self { eye_height, ..self }
41    }
42
43    pub fn make_bounding_box(&self, pos: Vec3) -> AABB {
44        let radius = (self.width / 2.0) as f64;
45        let height = self.height as f64;
46        AABB {
47            min: Vec3::new(pos.x - radius, pos.y, pos.z - radius),
48            max: Vec3::new(pos.x + radius, pos.y + height, pos.z + radius),
49        }
50    }
51}
52
53const fn default_eye_height(height: f32) -> f32 {
54    height * 0.85
55}
56
57impl From<EntityKind> for EntityDimensions {
58    fn from(entity: EntityKind) -> Self {
59        // this match statement is automatically generated by codegen/genentities.py,
60        // don't edit it manually!
61        match entity {
62            EntityKind::AcaciaBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
63            EntityKind::AcaciaChestBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
64            EntityKind::Allay => EntityDimensions::new(0.35, 0.6).eye_height(0.36),
65            EntityKind::AreaEffectCloud => EntityDimensions::new(6.0, 0.5),
66            EntityKind::Armadillo => EntityDimensions::new(0.7, 0.65).eye_height(0.26),
67            EntityKind::ArmorStand => EntityDimensions::new(0.5, 1.975).eye_height(1.7775),
68            EntityKind::Arrow => EntityDimensions::new(0.5, 0.5).eye_height(0.13),
69            EntityKind::Axolotl => EntityDimensions::new(0.75, 0.42).eye_height(0.2751),
70            EntityKind::BambooChestRaft => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
71            EntityKind::BambooRaft => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
72            EntityKind::Bat => EntityDimensions::new(0.5, 0.9).eye_height(0.45),
73            EntityKind::Bee => EntityDimensions::new(0.7, 0.6).eye_height(0.3),
74            EntityKind::BirchBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
75            EntityKind::BirchChestBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
76            EntityKind::Blaze => EntityDimensions::new(0.6, 1.8),
77            EntityKind::BlockDisplay => EntityDimensions::new(0.0, 0.0),
78            EntityKind::Bogged => EntityDimensions::new(0.6, 1.99).eye_height(1.74),
79            EntityKind::Breeze => EntityDimensions::new(0.6, 1.77).eye_height(1.3452),
80            EntityKind::BreezeWindCharge => EntityDimensions::new(0.3125, 0.3125).eye_height(0.0),
81            EntityKind::Camel => EntityDimensions::new(1.7, 2.375).eye_height(2.275),
82            EntityKind::Cat => EntityDimensions::new(0.6, 0.7).eye_height(0.35),
83            EntityKind::CaveSpider => EntityDimensions::new(0.7, 0.5).eye_height(0.45),
84            EntityKind::CherryBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
85            EntityKind::CherryChestBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
86            EntityKind::ChestMinecart => EntityDimensions::new(0.98, 0.7),
87            EntityKind::Chicken => EntityDimensions::new(0.4, 0.7).eye_height(0.644),
88            EntityKind::Cod => EntityDimensions::new(0.5, 0.3).eye_height(0.195),
89            EntityKind::CommandBlockMinecart => EntityDimensions::new(0.98, 0.7),
90            EntityKind::Cow => EntityDimensions::new(0.9, 1.4).eye_height(1.3),
91            EntityKind::Creaking => EntityDimensions::new(0.9, 2.7).eye_height(2.3),
92            EntityKind::Creeper => EntityDimensions::new(0.6, 1.7),
93            EntityKind::DarkOakBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
94            EntityKind::DarkOakChestBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
95            EntityKind::Dolphin => EntityDimensions::new(0.9, 0.6).eye_height(0.3),
96            EntityKind::Donkey => EntityDimensions::new(1.39648, 1.5).eye_height(1.425),
97            EntityKind::DragonFireball => EntityDimensions::new(1.0, 1.0),
98            EntityKind::Drowned => EntityDimensions::new(0.6, 1.95).eye_height(1.74),
99            EntityKind::Egg => EntityDimensions::new(0.25, 0.25),
100            EntityKind::ElderGuardian => EntityDimensions::new(1.9975, 1.9975).eye_height(0.99875),
101            EntityKind::EndCrystal => EntityDimensions::new(2.0, 2.0),
102            EntityKind::EnderDragon => EntityDimensions::new(16.0, 8.0),
103            EntityKind::EnderPearl => EntityDimensions::new(0.25, 0.25),
104            EntityKind::Enderman => EntityDimensions::new(0.6, 2.9).eye_height(2.55),
105            EntityKind::Endermite => EntityDimensions::new(0.4, 0.3).eye_height(0.13),
106            EntityKind::Evoker => EntityDimensions::new(0.6, 1.95),
107            EntityKind::EvokerFangs => EntityDimensions::new(0.5, 0.8),
108            EntityKind::ExperienceBottle => EntityDimensions::new(0.25, 0.25),
109            EntityKind::ExperienceOrb => EntityDimensions::new(0.5, 0.5),
110            EntityKind::EyeOfEnder => EntityDimensions::new(0.25, 0.25),
111            EntityKind::FallingBlock => EntityDimensions::new(0.98, 0.98),
112            EntityKind::Fireball => EntityDimensions::new(1.0, 1.0),
113            EntityKind::FireworkRocket => EntityDimensions::new(0.25, 0.25),
114            EntityKind::FishingBobber => EntityDimensions::new(0.25, 0.25),
115            EntityKind::Fox => EntityDimensions::new(0.6, 0.7).eye_height(0.4),
116            EntityKind::Frog => EntityDimensions::new(0.5, 0.5),
117            EntityKind::FurnaceMinecart => EntityDimensions::new(0.98, 0.7),
118            EntityKind::Ghast => EntityDimensions::new(4.0, 4.0).eye_height(2.6),
119            EntityKind::Giant => EntityDimensions::new(3.6, 12.0).eye_height(10.44),
120            EntityKind::GlowItemFrame => EntityDimensions::new(0.5, 0.5).eye_height(0.0),
121            EntityKind::GlowSquid => EntityDimensions::new(0.8, 0.8).eye_height(0.4),
122            EntityKind::Goat => EntityDimensions::new(0.9, 1.3),
123            EntityKind::Guardian => EntityDimensions::new(0.85, 0.85).eye_height(0.425),
124            EntityKind::HappyGhast => EntityDimensions::new(4.0, 4.0).eye_height(2.6),
125            EntityKind::Hoglin => EntityDimensions::new(1.39648, 1.4),
126            EntityKind::HopperMinecart => EntityDimensions::new(0.98, 0.7),
127            EntityKind::Horse => EntityDimensions::new(1.39648, 1.6).eye_height(1.52),
128            EntityKind::Husk => EntityDimensions::new(0.6, 1.95).eye_height(1.74),
129            EntityKind::Illusioner => EntityDimensions::new(0.6, 1.95),
130            EntityKind::Interaction => EntityDimensions::new(0.0, 0.0),
131            EntityKind::IronGolem => EntityDimensions::new(1.4, 2.7),
132            EntityKind::Item => EntityDimensions::new(0.25, 0.25).eye_height(0.2125),
133            EntityKind::ItemDisplay => EntityDimensions::new(0.0, 0.0),
134            EntityKind::ItemFrame => EntityDimensions::new(0.5, 0.5).eye_height(0.0),
135            EntityKind::JungleBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
136            EntityKind::JungleChestBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
137            EntityKind::LeashKnot => EntityDimensions::new(0.375, 0.5).eye_height(0.0625),
138            EntityKind::LightningBolt => EntityDimensions::new(0.0, 0.0),
139            EntityKind::LingeringPotion => EntityDimensions::new(0.25, 0.25),
140            EntityKind::Llama => EntityDimensions::new(0.9, 1.87).eye_height(1.7765),
141            EntityKind::LlamaSpit => EntityDimensions::new(0.25, 0.25),
142            EntityKind::MagmaCube => EntityDimensions::new(0.52, 0.52).eye_height(0.325),
143            EntityKind::MangroveBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
144            EntityKind::MangroveChestBoat => {
145                EntityDimensions::new(1.375, 0.5625).eye_height(0.5625)
146            }
147            EntityKind::Marker => EntityDimensions::new(0.0, 0.0),
148            EntityKind::Minecart => EntityDimensions::new(0.98, 0.7),
149            EntityKind::Mooshroom => EntityDimensions::new(0.9, 1.4).eye_height(1.3),
150            EntityKind::Mule => EntityDimensions::new(1.39648, 1.6).eye_height(1.52),
151            EntityKind::OakBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
152            EntityKind::OakChestBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
153            EntityKind::Ocelot => EntityDimensions::new(0.6, 0.7),
154            EntityKind::OminousItemSpawner => EntityDimensions::new(0.25, 0.25),
155            EntityKind::Painting => EntityDimensions::new(0.5, 0.5),
156            EntityKind::PaleOakBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
157            EntityKind::PaleOakChestBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
158            EntityKind::Panda => EntityDimensions::new(1.3, 1.25),
159            EntityKind::Parrot => EntityDimensions::new(0.5, 0.9).eye_height(0.54),
160            EntityKind::Phantom => EntityDimensions::new(0.9, 0.5).eye_height(0.175),
161            EntityKind::Pig => EntityDimensions::new(0.9, 0.9),
162            EntityKind::Piglin => EntityDimensions::new(0.6, 1.95).eye_height(1.79),
163            EntityKind::PiglinBrute => EntityDimensions::new(0.6, 1.95).eye_height(1.79),
164            EntityKind::Pillager => EntityDimensions::new(0.6, 1.95),
165            EntityKind::Player => EntityDimensions::new(0.6, 1.8).eye_height(1.62),
166            EntityKind::PolarBear => EntityDimensions::new(1.4, 1.4),
167            EntityKind::Pufferfish => EntityDimensions::new(0.7, 0.7).eye_height(0.455),
168            EntityKind::Rabbit => EntityDimensions::new(0.4, 0.5),
169            EntityKind::Ravager => EntityDimensions::new(1.95, 2.2),
170            EntityKind::Salmon => EntityDimensions::new(0.7, 0.4).eye_height(0.26),
171            EntityKind::Sheep => EntityDimensions::new(0.9, 1.3).eye_height(1.235),
172            EntityKind::Shulker => EntityDimensions::new(1.0, 1.0).eye_height(0.5),
173            EntityKind::ShulkerBullet => EntityDimensions::new(0.3125, 0.3125),
174            EntityKind::Silverfish => EntityDimensions::new(0.4, 0.3).eye_height(0.13),
175            EntityKind::Skeleton => EntityDimensions::new(0.6, 1.99).eye_height(1.74),
176            EntityKind::SkeletonHorse => EntityDimensions::new(1.39648, 1.6).eye_height(1.52),
177            EntityKind::Slime => EntityDimensions::new(0.52, 0.52).eye_height(0.325),
178            EntityKind::SmallFireball => EntityDimensions::new(0.3125, 0.3125),
179            EntityKind::Sniffer => EntityDimensions::new(1.9, 1.75).eye_height(1.05),
180            EntityKind::SnowGolem => EntityDimensions::new(0.7, 1.9).eye_height(1.7),
181            EntityKind::Snowball => EntityDimensions::new(0.25, 0.25),
182            EntityKind::SpawnerMinecart => EntityDimensions::new(0.98, 0.7),
183            EntityKind::SpectralArrow => EntityDimensions::new(0.5, 0.5).eye_height(0.13),
184            EntityKind::Spider => EntityDimensions::new(1.4, 0.9).eye_height(0.65),
185            EntityKind::SplashPotion => EntityDimensions::new(0.25, 0.25),
186            EntityKind::SpruceBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
187            EntityKind::SpruceChestBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
188            EntityKind::Squid => EntityDimensions::new(0.8, 0.8).eye_height(0.4),
189            EntityKind::Stray => EntityDimensions::new(0.6, 1.99).eye_height(1.74),
190            EntityKind::Strider => EntityDimensions::new(0.9, 1.7),
191            EntityKind::Tadpole => EntityDimensions::new(0.4, 0.3).eye_height(0.195),
192            EntityKind::TextDisplay => EntityDimensions::new(0.0, 0.0),
193            EntityKind::Tnt => EntityDimensions::new(0.98, 0.98).eye_height(0.15),
194            EntityKind::TntMinecart => EntityDimensions::new(0.98, 0.7),
195            EntityKind::TraderLlama => EntityDimensions::new(0.9, 1.87).eye_height(1.7765),
196            EntityKind::Trident => EntityDimensions::new(0.5, 0.5).eye_height(0.13),
197            EntityKind::TropicalFish => EntityDimensions::new(0.5, 0.4).eye_height(0.26),
198            EntityKind::Turtle => EntityDimensions::new(1.2, 0.4),
199            EntityKind::Vex => EntityDimensions::new(0.4, 0.8).eye_height(0.51875),
200            EntityKind::Villager => EntityDimensions::new(0.6, 1.95).eye_height(1.62),
201            EntityKind::Vindicator => EntityDimensions::new(0.6, 1.95),
202            EntityKind::WanderingTrader => EntityDimensions::new(0.6, 1.95).eye_height(1.62),
203            EntityKind::Warden => EntityDimensions::new(0.9, 2.9),
204            EntityKind::WindCharge => EntityDimensions::new(0.3125, 0.3125).eye_height(0.0),
205            EntityKind::Witch => EntityDimensions::new(0.6, 1.95).eye_height(1.62),
206            EntityKind::Wither => EntityDimensions::new(0.9, 3.5),
207            EntityKind::WitherSkeleton => EntityDimensions::new(0.7, 2.4).eye_height(2.1),
208            EntityKind::WitherSkull => EntityDimensions::new(0.3125, 0.3125),
209            EntityKind::Wolf => EntityDimensions::new(0.6, 0.85).eye_height(0.68),
210            EntityKind::Zoglin => EntityDimensions::new(1.39648, 1.4),
211            EntityKind::Zombie => EntityDimensions::new(0.6, 1.95).eye_height(1.74),
212            EntityKind::ZombieHorse => EntityDimensions::new(1.39648, 1.6).eye_height(1.52),
213            EntityKind::ZombieVillager => EntityDimensions::new(0.6, 1.95).eye_height(1.74),
214            EntityKind::ZombifiedPiglin => EntityDimensions::new(0.6, 1.95).eye_height(1.79),
215        }
216    }
217}
218
219/// Calculate the dimensions that an entity with the given kind and pose would
220/// have.i
221pub fn calculate_dimensions(kind: EntityKind, pose: Pose) -> EntityDimensions {
222    match (kind, pose) {
223        (_, Pose::Sleeping) => EntityDimensions::new(0.2, 0.2).fixed().eye_height(0.2),
224        (EntityKind::Player, Pose::FallFlying) => EntityDimensions::new(0.6, 0.6).eye_height(0.4),
225        (EntityKind::Player, Pose::Swimming) => EntityDimensions::new(0.6, 0.6).eye_height(0.4),
226        (EntityKind::Player, Pose::SpinAttack) => EntityDimensions::new(0.6, 0.6).eye_height(0.4),
227        (EntityKind::Player, Pose::Crouching) => EntityDimensions::new(0.6, 1.5).eye_height(1.27),
228        (EntityKind::Player, Pose::Dying) => EntityDimensions::new(0.2, 1.2).eye_height(1.62),
229        _ => EntityDimensions::from(kind),
230    }
231}