#[derive(yog_data::Schema, Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum EntityKind {
#[default]
Object,
Living,
Mob,
Hanging,
}
#[derive(yog_data::Schema, Debug, Clone)]
pub struct EntityDef {
#[data(default)]
pub id: String,
pub name: Option<String>,
#[data(default)]
pub kind: EntityKind,
#[data(default = "misc")]
pub category: String,
pub width: f32,
pub height: f32,
pub eye_height: Option<f32>,
#[data(default)]
pub fire_immune: bool,
#[data(default)]
pub no_gravity: bool,
pub pushable: Option<bool>,
#[data(default)]
pub solid: bool,
#[data(default = "eight")]
pub tracking_range: u32,
#[data(default = "three")]
pub update_interval: u32,
#[data(default)]
pub attributes: yog_data::Ordered<f64>,
pub model: Option<String>,
pub animations: Option<String>,
#[data(default)]
pub clips: yog_data::Ordered<String>,
pub spawn_egg: Option<[u32; 2]>,
#[data(default)]
pub goals: Vec<String>,
#[data(default)]
pub ticks: bool,
pub place_sound: Option<String>,
pub break_sound: Option<String>,
}
pub const HANGING_PLACE_SOUND: &str = yog_ids::id!(yog_ids::ns::MINECRAFT, "entity.painting.place");
pub const HANGING_BREAK_SOUND: &str = yog_ids::id!(yog_ids::ns::MINECRAFT, "entity.painting.break");
fn eight() -> u32 {
8
}
fn three() -> u32 {
3
}
fn misc() -> String {
"misc".into()
}
impl EntityDef {
pub fn new(id: impl Into<String>, kind: EntityKind, width: f32, height: f32) -> Self {
Self {
id: id.into(),
name: None,
kind,
category: misc(),
width,
height,
eye_height: None,
fire_immune: false,
no_gravity: false,
pushable: None,
solid: false,
tracking_range: eight(),
update_interval: three(),
attributes: yog_data::Ordered::default(),
model: None,
animations: None,
clips: yog_data::Ordered::default(),
spawn_egg: None,
goals: Vec::new(),
ticks: false,
place_sound: None,
break_sound: None,
}
}
pub fn with_default_sounds(mut self) -> Self {
self.place_sound
.get_or_insert_with(|| HANGING_PLACE_SOUND.into());
self.break_sound
.get_or_insert_with(|| HANGING_BREAK_SOUND.into());
self
}
}