1use azalea_core::{aabb::Aabb, position::Vec3};
2use azalea_registry::builtin::EntityKind;
3use bevy_ecs::component::Component;
4
5use crate::Pose;
6
7#[derive(Component, Debug, Default, Clone)]
9pub struct EntityDimensions {
10 pub width: f32,
11 pub height: f32,
12 pub eye_height: f32,
19 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 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::CamelHusk => EntityDimensions::new(1.7, 2.375).eye_height(2.275),
83 EntityKind::Cat => EntityDimensions::new(0.6, 0.7).eye_height(0.35),
84 EntityKind::CaveSpider => EntityDimensions::new(0.7, 0.5).eye_height(0.45),
85 EntityKind::CherryBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
86 EntityKind::CherryChestBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
87 EntityKind::ChestMinecart => EntityDimensions::new(0.98, 0.7),
88 EntityKind::Chicken => EntityDimensions::new(0.4, 0.7).eye_height(0.644),
89 EntityKind::Cod => EntityDimensions::new(0.5, 0.3).eye_height(0.195),
90 EntityKind::CommandBlockMinecart => EntityDimensions::new(0.98, 0.7),
91 EntityKind::CopperGolem => EntityDimensions::new(0.49, 0.98).eye_height(0.8125),
92 EntityKind::Cow => EntityDimensions::new(0.9, 1.4).eye_height(1.3),
93 EntityKind::Creaking => EntityDimensions::new(0.9, 2.7).eye_height(2.3),
94 EntityKind::Creeper => EntityDimensions::new(0.6, 1.7),
95 EntityKind::DarkOakBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
96 EntityKind::DarkOakChestBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
97 EntityKind::Dolphin => EntityDimensions::new(0.9, 0.6).eye_height(0.3),
98 EntityKind::Donkey => EntityDimensions::new(1.39648, 1.5).eye_height(1.425),
99 EntityKind::DragonFireball => EntityDimensions::new(1.0, 1.0),
100 EntityKind::Drowned => EntityDimensions::new(0.6, 1.95).eye_height(1.74),
101 EntityKind::Egg => EntityDimensions::new(0.25, 0.25),
102 EntityKind::ElderGuardian => EntityDimensions::new(1.9975, 1.9975).eye_height(0.99875),
103 EntityKind::EndCrystal => EntityDimensions::new(2.0, 2.0),
104 EntityKind::EnderDragon => EntityDimensions::new(16.0, 8.0),
105 EntityKind::EnderPearl => EntityDimensions::new(0.25, 0.25),
106 EntityKind::Enderman => EntityDimensions::new(0.6, 2.9).eye_height(2.55),
107 EntityKind::Endermite => EntityDimensions::new(0.4, 0.3).eye_height(0.13),
108 EntityKind::Evoker => EntityDimensions::new(0.6, 1.95),
109 EntityKind::EvokerFangs => EntityDimensions::new(0.5, 0.8),
110 EntityKind::ExperienceBottle => EntityDimensions::new(0.25, 0.25),
111 EntityKind::ExperienceOrb => EntityDimensions::new(0.5, 0.5),
112 EntityKind::EyeOfEnder => EntityDimensions::new(0.25, 0.25),
113 EntityKind::FallingBlock => EntityDimensions::new(0.98, 0.98),
114 EntityKind::Fireball => EntityDimensions::new(1.0, 1.0),
115 EntityKind::FireworkRocket => EntityDimensions::new(0.25, 0.25),
116 EntityKind::FishingBobber => EntityDimensions::new(0.25, 0.25),
117 EntityKind::Fox => EntityDimensions::new(0.6, 0.7).eye_height(0.4),
118 EntityKind::Frog => EntityDimensions::new(0.5, 0.5),
119 EntityKind::FurnaceMinecart => EntityDimensions::new(0.98, 0.7),
120 EntityKind::Ghast => EntityDimensions::new(4.0, 4.0).eye_height(2.6),
121 EntityKind::Giant => EntityDimensions::new(3.6, 12.0).eye_height(10.44),
122 EntityKind::GlowItemFrame => EntityDimensions::new(0.5, 0.5).eye_height(0.0),
123 EntityKind::GlowSquid => EntityDimensions::new(0.8, 0.8).eye_height(0.4),
124 EntityKind::Goat => EntityDimensions::new(0.9, 1.3),
125 EntityKind::Guardian => EntityDimensions::new(0.85, 0.85).eye_height(0.425),
126 EntityKind::HappyGhast => EntityDimensions::new(4.0, 4.0).eye_height(2.6),
127 EntityKind::Hoglin => EntityDimensions::new(1.39648, 1.4),
128 EntityKind::HopperMinecart => EntityDimensions::new(0.98, 0.7),
129 EntityKind::Horse => EntityDimensions::new(1.39648, 1.6).eye_height(1.52),
130 EntityKind::Husk => EntityDimensions::new(0.6, 1.95).eye_height(1.74),
131 EntityKind::Illusioner => EntityDimensions::new(0.6, 1.95),
132 EntityKind::Interaction => EntityDimensions::new(0.0, 0.0),
133 EntityKind::IronGolem => EntityDimensions::new(1.4, 2.7),
134 EntityKind::Item => EntityDimensions::new(0.25, 0.25).eye_height(0.2125),
135 EntityKind::ItemDisplay => EntityDimensions::new(0.0, 0.0),
136 EntityKind::ItemFrame => EntityDimensions::new(0.5, 0.5).eye_height(0.0),
137 EntityKind::JungleBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
138 EntityKind::JungleChestBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
139 EntityKind::LeashKnot => EntityDimensions::new(0.375, 0.5).eye_height(0.0625),
140 EntityKind::LightningBolt => EntityDimensions::new(0.0, 0.0),
141 EntityKind::LingeringPotion => EntityDimensions::new(0.25, 0.25),
142 EntityKind::Llama => EntityDimensions::new(0.9, 1.87).eye_height(1.7765),
143 EntityKind::LlamaSpit => EntityDimensions::new(0.25, 0.25),
144 EntityKind::MagmaCube => EntityDimensions::new(0.52, 0.52).eye_height(0.325),
145 EntityKind::MangroveBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
146 EntityKind::MangroveChestBoat => {
147 EntityDimensions::new(1.375, 0.5625).eye_height(0.5625)
148 }
149 EntityKind::Mannequin => EntityDimensions::new(0.6, 1.8).eye_height(1.62),
150 EntityKind::Marker => EntityDimensions::new(0.0, 0.0),
151 EntityKind::Minecart => EntityDimensions::new(0.98, 0.7),
152 EntityKind::Mooshroom => EntityDimensions::new(0.9, 1.4).eye_height(1.3),
153 EntityKind::Mule => EntityDimensions::new(1.39648, 1.6).eye_height(1.52),
154 EntityKind::Nautilus => EntityDimensions::new(0.875, 0.95).eye_height(0.2751),
155 EntityKind::OakBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
156 EntityKind::OakChestBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
157 EntityKind::Ocelot => EntityDimensions::new(0.6, 0.7),
158 EntityKind::OminousItemSpawner => EntityDimensions::new(0.25, 0.25),
159 EntityKind::Painting => EntityDimensions::new(0.5, 0.5),
160 EntityKind::PaleOakBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
161 EntityKind::PaleOakChestBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
162 EntityKind::Panda => EntityDimensions::new(1.3, 1.25),
163 EntityKind::Parched => EntityDimensions::new(0.6, 1.99).eye_height(1.74),
164 EntityKind::Parrot => EntityDimensions::new(0.5, 0.9).eye_height(0.54),
165 EntityKind::Phantom => EntityDimensions::new(0.9, 0.5).eye_height(0.175),
166 EntityKind::Pig => EntityDimensions::new(0.9, 0.9),
167 EntityKind::Piglin => EntityDimensions::new(0.6, 1.95).eye_height(1.79),
168 EntityKind::PiglinBrute => EntityDimensions::new(0.6, 1.95).eye_height(1.79),
169 EntityKind::Pillager => EntityDimensions::new(0.6, 1.95),
170 EntityKind::Player => EntityDimensions::new(0.6, 1.8).eye_height(1.62),
171 EntityKind::PolarBear => EntityDimensions::new(1.4, 1.4),
172 EntityKind::Pufferfish => EntityDimensions::new(0.7, 0.7).eye_height(0.455),
173 EntityKind::Rabbit => EntityDimensions::new(0.4, 0.5),
174 EntityKind::Ravager => EntityDimensions::new(1.95, 2.2),
175 EntityKind::Salmon => EntityDimensions::new(0.7, 0.4).eye_height(0.26),
176 EntityKind::Sheep => EntityDimensions::new(0.9, 1.3).eye_height(1.235),
177 EntityKind::Shulker => EntityDimensions::new(1.0, 1.0).eye_height(0.5),
178 EntityKind::ShulkerBullet => EntityDimensions::new(0.3125, 0.3125),
179 EntityKind::Silverfish => EntityDimensions::new(0.4, 0.3).eye_height(0.13),
180 EntityKind::Skeleton => EntityDimensions::new(0.6, 1.99).eye_height(1.74),
181 EntityKind::SkeletonHorse => EntityDimensions::new(1.39648, 1.6).eye_height(1.52),
182 EntityKind::Slime => EntityDimensions::new(0.52, 0.52).eye_height(0.325),
183 EntityKind::SmallFireball => EntityDimensions::new(0.3125, 0.3125),
184 EntityKind::Sniffer => EntityDimensions::new(1.9, 1.75).eye_height(1.05),
185 EntityKind::SnowGolem => EntityDimensions::new(0.7, 1.9).eye_height(1.7),
186 EntityKind::Snowball => EntityDimensions::new(0.25, 0.25),
187 EntityKind::SpawnerMinecart => EntityDimensions::new(0.98, 0.7),
188 EntityKind::SpectralArrow => EntityDimensions::new(0.5, 0.5).eye_height(0.13),
189 EntityKind::Spider => EntityDimensions::new(1.4, 0.9).eye_height(0.65),
190 EntityKind::SplashPotion => EntityDimensions::new(0.25, 0.25),
191 EntityKind::SpruceBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
192 EntityKind::SpruceChestBoat => EntityDimensions::new(1.375, 0.5625).eye_height(0.5625),
193 EntityKind::Squid => EntityDimensions::new(0.8, 0.8).eye_height(0.4),
194 EntityKind::Stray => EntityDimensions::new(0.6, 1.99).eye_height(1.74),
195 EntityKind::Strider => EntityDimensions::new(0.9, 1.7),
196 EntityKind::Tadpole => EntityDimensions::new(0.4, 0.3).eye_height(0.195),
197 EntityKind::TextDisplay => EntityDimensions::new(0.0, 0.0),
198 EntityKind::Tnt => EntityDimensions::new(0.98, 0.98).eye_height(0.15),
199 EntityKind::TntMinecart => EntityDimensions::new(0.98, 0.7),
200 EntityKind::TraderLlama => EntityDimensions::new(0.9, 1.87).eye_height(1.7765),
201 EntityKind::Trident => EntityDimensions::new(0.5, 0.5).eye_height(0.13),
202 EntityKind::TropicalFish => EntityDimensions::new(0.5, 0.4).eye_height(0.26),
203 EntityKind::Turtle => EntityDimensions::new(1.2, 0.4),
204 EntityKind::Vex => EntityDimensions::new(0.4, 0.8).eye_height(0.51875),
205 EntityKind::Villager => EntityDimensions::new(0.6, 1.95).eye_height(1.62),
206 EntityKind::Vindicator => EntityDimensions::new(0.6, 1.95),
207 EntityKind::WanderingTrader => EntityDimensions::new(0.6, 1.95).eye_height(1.62),
208 EntityKind::Warden => EntityDimensions::new(0.9, 2.9),
209 EntityKind::WindCharge => EntityDimensions::new(0.3125, 0.3125).eye_height(0.0),
210 EntityKind::Witch => EntityDimensions::new(0.6, 1.95).eye_height(1.62),
211 EntityKind::Wither => EntityDimensions::new(0.9, 3.5),
212 EntityKind::WitherSkeleton => EntityDimensions::new(0.7, 2.4).eye_height(2.1),
213 EntityKind::WitherSkull => EntityDimensions::new(0.3125, 0.3125),
214 EntityKind::Wolf => EntityDimensions::new(0.6, 0.85).eye_height(0.68),
215 EntityKind::Zoglin => EntityDimensions::new(1.39648, 1.4),
216 EntityKind::Zombie => EntityDimensions::new(0.6, 1.95).eye_height(1.74),
217 EntityKind::ZombieHorse => EntityDimensions::new(1.39648, 1.6).eye_height(1.52),
218 EntityKind::ZombieNautilus => EntityDimensions::new(0.875, 0.95).eye_height(0.2751),
219 EntityKind::ZombieVillager => EntityDimensions::new(0.6, 1.95).eye_height(1.74),
220 EntityKind::ZombifiedPiglin => EntityDimensions::new(0.6, 1.95).eye_height(1.79),
221 }
222 }
223}
224
225pub fn calculate_dimensions(kind: EntityKind, pose: Pose) -> EntityDimensions {
228 match (kind, pose) {
229 (_, Pose::Sleeping) => EntityDimensions::new(0.2, 0.2).fixed().eye_height(0.2),
230 (EntityKind::Player, Pose::FallFlying) => EntityDimensions::new(0.6, 0.6).eye_height(0.4),
231 (EntityKind::Player, Pose::Swimming) => EntityDimensions::new(0.6, 0.6).eye_height(0.4),
232 (EntityKind::Player, Pose::SpinAttack) => EntityDimensions::new(0.6, 0.6).eye_height(0.4),
233 (EntityKind::Player, Pose::Crouching) => EntityDimensions::new(0.6, 1.5).eye_height(1.27),
234 (EntityKind::Player, Pose::Dying) => EntityDimensions::new(0.2, 1.2).eye_height(1.62),
235 _ => EntityDimensions::from(kind),
236 }
237}