use super::super::loss::{report_loss, LossKind, Severity};
use super::super::registry::RegistryBuilder;
use super::super::types::MapExt;
const VERSION: i32 = 4303;
pub fn register(reg: &mut RegistryBuilder) {
reg.entity.add_structure_converter(
VERSION,
0,
Box::new(|data, _from, _to| {
if !data.has_key("FallDistance") {
return;
}
let fall_distance = data.get_f64("FallDistance").unwrap_or(0.0);
data.take("FallDistance");
data.set_f64("fall_distance", fall_distance);
}),
);
reg.entity.add_reverse_converter(
VERSION,
0,
Box::new(|data, _from, _to| {
if !data.has_key("fall_distance") {
return;
}
let fall_distance = data.get_f64("fall_distance").unwrap_or(0.0);
data.take("fall_distance");
if (fall_distance as f32) as f64 != fall_distance {
report_loss(
VERSION,
LossKind::FingerprintCollapse,
Severity::Approximated,
"fall_distance double cannot be represented exactly as legacy FallDistance float",
);
}
data.set_f32("FallDistance", fall_distance as f32);
}),
);
}
#[cfg(test)]
mod tests {
use super::*;
use crate::dataconverter::registry::convert_entity_reverse;
#[test]
fn reverse_precise_double_fall_distance_reports_float_narrowing() {
let mut data = crate::nbt::NbtMap::new();
data.set_string("id", "minecraft:pig");
data.set_f64("fall_distance", 1.0000000000000002);
let report = convert_entity_reverse(&mut data, VERSION, VERSION - 1);
assert_eq!(report.len(), 1);
assert_eq!(report.entries[0].kind, LossKind::FingerprintCollapse);
assert!(data.has_key("FallDistance"));
}
}