use crate::nbt::NbtMap;
use super::super::loss::{report_loss, LossKind, Severity};
use super::super::registry::RegistryBuilder;
use super::super::types::{MapExt, ValueExt};
const VERSION: i32 = 2523;
const RENAMES: &[(&str, &str)] = &[
("generic.maxHealth", "minecraft:generic.max_health"),
("Max Health", "minecraft:generic.max_health"),
(
"zombie.spawnReinforcements",
"minecraft:zombie.spawn_reinforcements",
),
(
"Spawn Reinforcements Chance",
"minecraft:zombie.spawn_reinforcements",
),
("horse.jumpStrength", "minecraft:horse.jump_strength"),
("Jump Strength", "minecraft:horse.jump_strength"),
("generic.followRange", "minecraft:generic.follow_range"),
("Follow Range", "minecraft:generic.follow_range"),
(
"generic.knockbackResistance",
"minecraft:generic.knockback_resistance",
),
(
"Knockback Resistance",
"minecraft:generic.knockback_resistance",
),
("generic.movementSpeed", "minecraft:generic.movement_speed"),
("Movement Speed", "minecraft:generic.movement_speed"),
("generic.flyingSpeed", "minecraft:generic.flying_speed"),
("Flying Speed", "minecraft:generic.flying_speed"),
("generic.attackDamage", "minecraft:generic.attack_damage"),
(
"generic.attackKnockback",
"minecraft:generic.attack_knockback",
),
("generic.attackSpeed", "minecraft:generic.attack_speed"),
(
"generic.armorToughness",
"minecraft:generic.armor_toughness",
),
];
fn rename(name: &str) -> Option<&'static str> {
RENAMES
.iter()
.find(|(old, _)| *old == name)
.map(|(_, new)| *new)
}
const REVERSE_RENAMES: &[(&str, &str, bool)] = &[
("minecraft:generic.max_health", "generic.maxHealth", true),
(
"minecraft:zombie.spawn_reinforcements",
"zombie.spawnReinforcements",
true,
),
("minecraft:horse.jump_strength", "horse.jumpStrength", true),
(
"minecraft:generic.follow_range",
"generic.followRange",
true,
),
(
"minecraft:generic.knockback_resistance",
"generic.knockbackResistance",
true,
),
(
"minecraft:generic.movement_speed",
"generic.movementSpeed",
true,
),
(
"minecraft:generic.flying_speed",
"generic.flyingSpeed",
true,
),
(
"minecraft:generic.attack_damage",
"generic.attackDamage",
false,
),
(
"minecraft:generic.attack_knockback",
"generic.attackKnockback",
false,
),
(
"minecraft:generic.attack_speed",
"generic.attackSpeed",
false,
),
(
"minecraft:generic.armor_toughness",
"generic.armorToughness",
false,
),
];
fn rename_back(name: &str) -> Option<(&'static str, bool)> {
REVERSE_RENAMES
.iter()
.find(|(new, _, _)| *new == name)
.map(|(_, old, ambiguous)| (*old, *ambiguous))
}
fn rename_string_back(map: &mut NbtMap, key: &str) {
if let Some(cur) = map.get_string(key) {
if let Some((old, ambiguous)) = rename_back(cur) {
if ambiguous {
report_loss(
VERSION,
LossKind::RenameAmbiguous,
Severity::Approximated,
format!(
"attribute '{cur}' had two legacy names; restored canonical '{old}' (Display-Name alternate unrecoverable)"
),
);
}
map.set_string(key, old);
}
}
}
fn rename_string(map: &mut NbtMap, key: &str) {
if let Some(cur) = map.get_string(key) {
if let Some(new) = rename(cur) {
map.set_string(key, new);
}
}
}
pub fn register(reg: &mut RegistryBuilder) {
reg.entity.add_structure_converter(
VERSION,
0,
Box::new(|data: &mut NbtMap, _from, _to| {
if let Some(attributes) = data.get_list_mut("Attributes") {
for el in attributes.iter_mut() {
if let Some(attr) = el.as_compound_mut() {
rename_string(attr, "Name");
}
}
}
}),
);
reg.entity.add_reverse_converter(
VERSION,
0,
Box::new(|data: &mut NbtMap, _from, _to| {
if let Some(attributes) = data.get_list_mut("Attributes") {
for el in attributes.iter_mut() {
if let Some(attr) = el.as_compound_mut() {
rename_string_back(attr, "Name");
}
}
}
}),
);
reg.item_stack.add_structure_converter(
VERSION,
0,
Box::new(|data: &mut NbtMap, _from, _to| {
if let Some(attributes) = data.get_list_mut("AttributeModifiers") {
for el in attributes.iter_mut() {
if let Some(attr) = el.as_compound_mut() {
rename_string(attr, "AttributeName");
}
}
}
}),
);
reg.item_stack.add_reverse_converter(
VERSION,
0,
Box::new(|data: &mut NbtMap, _from, _to| {
if let Some(attributes) = data.get_list_mut("AttributeModifiers") {
for el in attributes.iter_mut() {
if let Some(attr) = el.as_compound_mut() {
rename_string_back(attr, "AttributeName");
}
}
}
}),
);
}