use crate::nbt::NbtMap;
use super::super::helpers::correct_namespace_or_null;
use super::super::loss::{report_loss, LossKind, Severity};
use super::super::registry::RegistryBuilder;
use super::super::types::{MapExt, ValueExt};
const VERSION: i32 = 4187;
fn update_attribute_base(data: &mut NbtMap, attribute_id: &str, updater: fn(f64) -> f64) {
let modifiers = match data.get_list_mut("attributes") {
Some(l) => l,
None => return,
};
for modifier in modifiers.iter_mut() {
let modifier = match modifier.as_compound_mut() {
Some(m) => m,
None => continue,
};
let id = modifier.get_string("id").unwrap_or("");
let corrected = correct_namespace_or_null(id).unwrap_or_else(|| id.to_string());
if corrected != attribute_id {
continue;
}
let base = modifier.get_f64("base").unwrap_or(0.0);
modifier.set_f64("base", updater(base));
}
}
fn reverse_update_attribute_base(
data: &mut NbtMap,
attribute_id: &str,
from_base: f64,
to_base: f64,
) {
let modifiers = match data.get_list_mut("attributes") {
Some(l) => l,
None => return,
};
for modifier in modifiers.iter_mut() {
let modifier = match modifier.as_compound_mut() {
Some(m) => m,
None => continue,
};
let id = modifier.get_string("id").unwrap_or("");
let corrected = correct_namespace_or_null(id).unwrap_or_else(|| id.to_string());
if corrected != attribute_id {
continue;
}
let base = modifier.get_f64("base").unwrap_or(0.0);
if base == from_base {
modifier.set_f64("base", to_base);
report_loss(
VERSION,
LossKind::FingerprintCollapse,
Severity::Approximated,
format!(
"follow_range base {from_base} may be a modern authored value or a V4187 default rewrite; restored legacy default {to_base}"
),
);
}
}
}
pub fn register(reg: &mut RegistryBuilder) {
fn follow_range_48_to_16(curr: f64) -> f64 {
if curr == 48.0 {
16.0
} else {
curr
}
}
for id in [
"minecraft:villager",
"minecraft:bee",
"minecraft:allay",
"minecraft:llama",
] {
reg.entity.add_converter_for_id(
id,
VERSION,
0,
Box::new(|data: &mut NbtMap, _from, _to| {
update_attribute_base(data, "minecraft:follow_range", follow_range_48_to_16);
}),
);
reg.entity.add_reverse_converter_for_id(
id,
VERSION,
0,
Box::new(|data: &mut NbtMap, _from, _to| {
reverse_update_attribute_base(data, "minecraft:follow_range", 16.0, 48.0);
}),
);
}
reg.entity.add_converter_for_id(
"minecraft:piglin_brute",
VERSION,
0,
Box::new(|data: &mut NbtMap, _from, _to| {
update_attribute_base(data, "minecraft:follow_range", |curr| {
if curr == 16.0 {
12.0
} else {
curr
}
});
}),
);
reg.entity.add_reverse_converter_for_id(
"minecraft:piglin_brute",
VERSION,
0,
Box::new(|data: &mut NbtMap, _from, _to| {
reverse_update_attribute_base(data, "minecraft:follow_range", 12.0, 16.0);
}),
);
reg.entity.add_converter_for_id(
"minecraft:warden",
VERSION,
0,
Box::new(|data: &mut NbtMap, _from, _to| {
update_attribute_base(data, "minecraft:follow_range", |curr| {
if curr == 16.0 {
24.0
} else {
curr
}
});
}),
);
reg.entity.add_reverse_converter_for_id(
"minecraft:warden",
VERSION,
0,
Box::new(|data: &mut NbtMap, _from, _to| {
reverse_update_attribute_base(data, "minecraft:follow_range", 24.0, 16.0);
}),
);
}