1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
|
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<EntityKind> 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.49, 0.6).eye_height(0.59),
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),
}
}
|